code-painter 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. code_painter-1.0.0.dist-info/METADATA +89 -0
  2. code_painter-1.0.0.dist-info/RECORD +271 -0
  3. code_painter-1.0.0.dist-info/WHEEL +4 -0
  4. code_painter-1.0.0.dist-info/licenses/LICENSE +8 -0
  5. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264/__init__.py +0 -0
  6. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226/__init__.py +0 -0
  7. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/246/321/207/320/245/320/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233.py +63 -0
  8. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233.py +72 -0
  9. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/254/342/226/221/321/207/320/240/320/226//321/211/320/273/320/250/321/206/342/225/225/320/225/321/204/342/225/225/320/246/321/207/320/245/320/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233.py +177 -0
  10. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237/__init__.py +0 -0
  11. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/204/342/225/225/320/232/321/210/320/261/320/263/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +57 -0
  12. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +71 -0
  13. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/237/320/241/321/205/320/256/320/233/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +54 -0
  14. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/237/320/241/321/210/320/231/342/226/223/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +68 -0
  15. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/342/225/225/342/225/234/321/205/320/275/320/240/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +55 -0
  16. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/320/254/342/225/235/321/207/320/255/320/253/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +58 -0
  17. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/320/254/342/225/235/321/211/320/245/320/254/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +64 -0
  18. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/210/320/223/320/261/321/211/320/261/342/225/227/321/205/342/226/222/320/245/321/207/320/264/342/225/221.py +39 -0
  19. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260/__init__.py +0 -0
  20. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/204/342/225/234/320/254/321/206/320/246/320/227/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +25 -0
  21. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/205/320/237/320/264/321/206/320/246/320/227/321/204/342/225/243/320/266/321/206/342/224/202/320/245/321/205/320/275/320/247/321/205/320/225/342/225/225.py +414 -0
  22. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/244/342/226/221/321/205/320/275/320/247/321/206/320/260/342/225/235_/321/206/320/277/320/253/321/207/320/274/320/244/321/205/320/275/320/247/321/205/342/225/225/320/246.py +42 -0
  23. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/244/342/226/221/321/205/320/275/320/247/321/206/320/260/342/225/235_/321/211/320/242/320/262/321/207/320/274/320/244/321/205/320/275/320/247/321/205/342/225/225/320/246.py +40 -0
  24. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/273/320/246/321/206/320/236/320/242/321/204/342/225/243/320/266/321/206/342/224/202/320/245_/321/205/342/225/221/320/226/321/204/342/225/234/320/251/321/205/342/225/243/342/224/244/321/207/320/262/320/241/321/206/320/246/320/227.py +38 -0
  25. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/320/275/320/266/321/204/342/225/243/320/260//321/210/320/233/342/226/222/321/210/320/277/320/275/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +25 -0
  26. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/342/225/226/320/265/321/204/342/225/234/320/254/__init__.py +0 -0
  27. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/205/342/225/226/320/265/321/204/342/225/234/320/254//321/205/320/254/320/226/321/205/342/225/234/320/262/321/205/320/235/342/226/221/321/207/320/273/320/260.py +22 -0
  28. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265/__init__.py +0 -0
  29. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/233/342/225/235/321/205/320/253/342/225/233.py +17 -0
  30. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/225/320/275/321/211/320/255/320/262/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +59 -0
  31. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/235/320/221/321/204/342/225/221/320/234/321/211/320/255/320/262/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +66 -0
  32. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/253/320/253/321/211/320/255/320/262/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +56 -0
  33. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/253/342/225/234/321/206/320/247/320/247/321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +216 -0
  34. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/342/225/234/320/271/321/210/320/231/342/226/223/321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +216 -0
  35. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/205/342/225/226/320/265//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +252 -0
  36. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221/__init__.py +0 -0
  37. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/221/320/244/321/206/320/250/320/257/321/207/342/225/221/320/262/321/206/320/247/320/247/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +52 -0
  38. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/225/320/231/321/205/320/275/320/247/321/207/342/225/227/320/237/321/205/320/223/320/237/321/207/342/224/244/320/260/321/210/320/231/342/225/221/321/206/320/254/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +32 -0
  39. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/225/320/254/321/211/320/263/320/236/321/207/342/225/221/320/262/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +39 -0
  40. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/204/342/225/225/320/275/321/207/320/267/320/233/321/205/320/264/320/272/321/206/320/256/320/221/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +97 -0
  41. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/320/264/320/272/321/206/320/256/320/221/321/205/320/253/342/225/233/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +54 -0
  42. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/320/277/320/226/321/205/342/225/221/320/266/321/205/320/223/320/237/321/207/342/224/244/320/260/321/206/320/236/320/267/321/205/320/230/342/225/242/321/206/320/250/320/236/321/206/320/252/320/247/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +51 -0
  43. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/342/225/233/320/276/321/204/342/224/220/320/261/321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263.py +54 -0
  44. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +23 -0
  45. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/223/320/237/321/207/342/224/244/320/260/321/207/320/244/342/225/227/321/210/320/231/342/225/221/321/206/320/254/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +29 -0
  46. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/227/320/260/321/204/342/225/234/320/245/321/205/320/253/342/225/233/321/205/342/225/234/320/262/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +26 -0
  47. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/232/320/270/321/206/342/225/235/320/273/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +19 -0
  48. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/267/320/243/321/206/342/226/221/320/237/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +20 -0
  49. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/277/320/226/321/205/342/225/221/320/266/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +31 -0
  50. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/204/342/225/225/320/231/321/205/320/275/320/247/321/207/342/225/227/320/237/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +25 -0
  51. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/205/320/253/342/225/233/321/206/320/260/320/227/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +23 -0
  52. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/205/320/254/320/226/321/205/320/241/320/270/321/207/320/236/320/227/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +125 -0
  53. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +20 -0
  54. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +20 -0
  55. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/206/342/226/221/342/224/244/321/206/342/225/227/342/224/244/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +25 -0
  56. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/207/320/221/342/226/221/321/207/342/225/221/342/224/220/321/206/320/255/320/261/321/207/320/276/320/220/321/207/342/225/221/320/266/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +26 -0
  57. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/207/320/244/342/225/241/321/210/320/267/320/226/321/204/342/224/220/320/261/321/205/320/237/342/225/226/321/206/342/225/241/320/233/321/210/320/277/320/245/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +40 -0
  58. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/207/342/225/221/320/262/321/205/320/262/320/251/321/206/320/220/320/220/321/206/320/247/320/267/321/207/342/225/227/320/237/321/205/320/225/342/225/225.py +72 -0
  59. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/231/320/233/321/206/320/254/342/225/221//321/211/320/254/320/243/321/210/320/251/342/225/243/321/207/320/221/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +29 -0
  60. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236/__init__.py +0 -0
  61. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/231/320/227/321/211/320/255/320/262/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232.py +45 -0
  62. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/264/320/275/321/205/320/254/320/226/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232.py +37 -0
  63. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/264/320/275/321/205/320/254/320/226/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +36 -0
  64. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/206/320/275/320/263/321/206/320/246/342/225/243/321/205/342/225/234/320/262/321/211/342/225/227/320/224/321/211/320/227/320/241/321/205/320/230/320/226/321/205/320/231/342/226/223.py +67 -0
  65. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/207/320/230/342/226/222/321/205/342/224/220/320/223/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +36 -0
  66. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/207/320/257/320/271/321/205/342/225/234/320/262/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232.py +34 -0
  67. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/320/245/342/226/221/321/205/320/275/320/266/321/204/342/225/243/320/233/321/207/342/225/233/320/236//321/207/320/257/320/271/321/205/342/225/234/320/262/321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +36 -0
  68. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/342/225/241/320/233/321/210/320/277/320/245//321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/342/224/202/320/270/321/210/320/267/320/263/321/205/342/226/222/320/222.py +95 -0
  69. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/206/342/225/241/320/233/321/210/320/277/320/245//321/206/342/225/241/320/233/321/210/320/277/320/245/321/207/342/225/227/320/224/321/205/320/240/320/230.py +30 -0
  70. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240/__init__.py +0 -0
  71. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/205/320/275/320/240/321/206/320/263/320/233/321/206/320/263/320/233/321/210/342/226/221/342/226/222/1.json +11 -0
  72. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/233/342/225/235/321/205/320/253/342/225/233.py +17 -0
  73. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/210/342/226/222/320/261/321/206/320/263/320/233.py +21 -0
  74. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/206/320/247/320/265/321/205/320/236/320/226/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +21 -0
  75. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/211/320/252/320/237/321/210/342/225/221/320/273/321/204/342/225/221/320/244/321/205/320/275/320/240/321/206/320/263/320/233.py +58 -0
  76. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227/__init__.py +0 -0
  77. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/204/342/225/225/320/231/321/205/320/236/320/257/321/210/320/231/342/226/223/321/207/342/225/227/320/250/321/205/320/253/342/225/233.py +19 -0
  78. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/205/320/220/320/242/321/205/342/225/234/342/226/222/321/206/320/245/320/230/321/206/320/256/320/254.py +21 -0
  79. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/205/320/240/320/224/321/205/320/253/342/225/234/321/205/320/253/342/225/234/321/206/320/247/320/247.py +102 -0
  80. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/206/320/270/320/261/321/206/320/255/342/224/220/321/210/342/225/242/320/225/321/207/342/225/221/320/267/321/207/320/236/320/253/321/204/342/225/225/342/225/234.py +21 -0
  81. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/207/320/273/320/233/321/204/342/225/234/320/243/321/206/320/245/320/230/321/206/320/256/320/254/321/207/320/240/320/223.py +54 -0
  82. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/320/277/320/224/321/205/320/230/320/226/321/210/320/261/320/270/321/206/320/223/320/225/321/205/320/234/320/225.py +13 -0
  83. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/342/225/242/320/225/321/207/342/225/221/320/267/321/207/320/236/320/253/321/204/342/225/225/342/225/234.py +539 -0
  84. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240/__init__.py +0 -0
  85. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222_/321/204/342/225/234/320/236/321/211/320/257/342/224/202/321/210/342/226/221/342/226/222/321/210/320/261/320/270.py +48 -0
  86. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222_/321/205/320/264/320/267/321/210/342/226/221/342/226/222/321/210/320/261/320/270.py +48 -0
  87. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/206/342/225/221/320/240/321/205/320/230/320/253/321/205/320/276/320/264//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222_/321/211/320/273/320/250/321/211/320/257/342/224/202/321/210/342/226/221/342/226/222/321/210/320/261/320/270.py +48 -0
  88. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243/__init__.py +0 -0
  89. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243/_/321/210/320/277/342/224/244/321/206/320/250/320/236.txt +5 -0
  90. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/204/342/225/221/320/226/321/210/320/267/320/263/321/206/320/253/342/224/244/321/205/320/264/320/252/321/205/320/232/320/257/321/210/320/223/342/225/234.py +272 -0
  91. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/225/342/226/222/321/207/320/244/320/270/__init__.py +0 -0
  92. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/225/342/226/222/321/207/320/244/320/270//321/205/320/253/342/225/234/321/205/320/276/342/225/242/321/207/320/276/320/220/321/207/320/260/320/221.py +261 -0
  93. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/225/342/226/222/321/207/320/244/320/270//321/210/320/277/320/247/321/207/342/225/227/320/237/321/211/320/253/320/226.py +114 -0
  94. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/230/320/255/321/205/320/275/320/266/321/206/320/270/320/261/321/206/320/255/342/224/220.py +51 -0
  95. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226/__init__.py +0 -0
  96. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/246/321/207/320/245/320/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276.py +112312 -0
  97. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276.py +23337 -0
  98. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276.py +25 -0
  99. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/245/342/226/221/321/206/320/235/320/276/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +194 -0
  100. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/254/342/226/221/321/207/320/240/320/226//321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +77 -0
  101. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237/__init__.py +0 -0
  102. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/204/342/225/225/320/232/321/210/342/225/221/320/273/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  103. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/225/320/223/321/207/342/224/244/320/260/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +78 -0
  104. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/240/320/236/321/205/320/237/320/241/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +30 -0
  105. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/250/342/224/244/321/205/342/225/226/342/224/244/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  106. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/205/320/225/320/223/321/207/342/224/244/320/260.py +728 -0
  107. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +287 -0
  108. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/205/320/276/320/252/321/204/342/225/243/320/231.py +371 -0
  109. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/270/320/261/321/206/320/255/342/224/220/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +321 -0
  110. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/206/320/270/320/261/321/206/320/255/342/224/220/321/207/320/244/320/257/321/206/320/230/320/240/321/205/320/251/320/270.py +340 -0
  111. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +334 -0
  112. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +46 -0
  113. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/211/320/223/320/270/321/204/342/225/227/342/225/242.py +115 -0
  114. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/223/320/237/321/211/320/262/320/254/321/210/320/231/342/226/223/321/205/320/276/320/252/321/204/342/225/243/320/231.py +234 -0
  115. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/320/264/342/224/244/321/205/320/237/320/241/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  116. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/342/225/225/342/225/234/321/205/320/275/320/240/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  117. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/207/320/276/342/226/222.py +12 -0
  118. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/207/320/254/320/231/321/206/320/277/320/253/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  119. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/207/320/254/342/225/235/321/207/320/255/320/253/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  120. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/207/320/254/342/225/235/321/211/320/245/320/254/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  121. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/220/342/224/202/321/206/320/254/342/225/241/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  122. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/223/320/234/321/206/320/251/320/277/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  123. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/223/320/261/321/211/320/261/342/225/227/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  124. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/210/320/263/320/225/321/211/320/265/342/226/221/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  125. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/211/320/255/320/262/321/211/320/223/320/270/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +29 -0
  126. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/264/342/224/244/321/205/320/223/320/237//321/211/342/225/235/342/225/227/321/205/320/275/320/240/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +24 -0
  127. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260/__init__.py +0 -0
  128. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/204/342/225/234/320/254/321/206/320/246/320/227/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220.py +78 -0
  129. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/244/342/226/221/321/205/320/275/320/247/321/206/320/260/342/225/235/321/205/320/275/320/247/321/205/342/225/225/320/246/321/206/320/270/320/261/321/206/320/255/342/224/220.py +175 -0
  130. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/207/320/273/320/246/321/206/320/236/320/242/321/204/342/225/243/320/266/321/206/342/224/202/320/245.py +32 -0
  131. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/210/320/233/342/226/222/321/210/320/277/320/275/321/207/342/225/221/342/225/225/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220.py +37 -0
  132. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/275/320/266/321/204/342/225/243/320/260//321/211/320/273/320/250/321/206/342/225/225/320/225/321/207/320/244/342/225/241/321/205/320/275/320/240/321/204/342/225/243/320/266/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +416 -0
  133. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261/__init__.py +0 -0
  134. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/205/342/225/221/320/232.py +0 -0
  135. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/230/342/224/220/321/211/320/247/342/224/244.py +286 -0
  136. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/257/320/254/321/205/320/275/320/240.py +0 -0
  137. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/261/320/234/321/205/320/275/320/240.py +0 -0
  138. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/206/320/264/320/225/321/205/320/275/320/240.py +0 -0
  139. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/320/276/320/264/321/205/320/226/320/225/321/210/320/276/342/225/233/321/210/320/276/320/261//321/211/320/242/320/262/321/207/320/240/342/224/244.py +0 -0
  140. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/342/225/226/320/265/321/204/342/225/234/320/254/__init__.py +0 -0
  141. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/205/342/225/226/320/265/321/204/342/225/234/320/254//321/205/320/254/320/226/321/205/342/225/234/320/262/321/205/320/235/342/226/221/321/207/320/273/320/260/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +121 -0
  142. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/205/342/225/226/320/265/__init__.py +0 -0
  143. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/320/227/320/260/321/204/342/225/234/320/245/321/204/342/225/234/320/243/321/205/342/226/222/320/245/321/205/342/225/235/320/220/321/205/320/253/342/225/233.py +118 -0
  144. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/205/342/225/226/320/265//321/205/342/225/243/342/224/202/321/211/320/255/320/262/321/207/320/273/320/233/321/204/342/225/234/320/243/321/207/320/244/342/225/227.py +66 -0
  145. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221/__init__.py +0 -0
  146. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/320/277/320/226/321/205/342/225/221/320/266/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +103 -0
  147. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/205/342/225/233/320/276/321/204/342/224/220/320/261/321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263.py +243 -0
  148. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/223/320/237/321/207/342/224/244/320/260/321/210/320/231/342/225/221/321/206/320/254/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +172 -0
  149. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/227/320/260/321/204/342/225/234/320/245/321/205/320/253/342/225/233/321/205/342/225/234/320/262/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +82 -0
  150. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/232/320/270/321/206/342/225/235/320/273/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +41 -0
  151. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/235/320/245/321/210/320/231/342/226/223/321/210/320/223/320/234/321/206/320/251/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +45 -0
  152. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/264/320/246/321/205/320/263/342/224/202/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +241 -0
  153. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/267/320/243/321/206/342/226/221/320/237/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +63 -0
  154. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +41 -0
  155. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/207/320/257/320/271/321/211/320/250/342/225/241/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +188 -0
  156. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/210/320/223/320/234/321/206/320/251/320/277/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +43 -0
  157. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/342/226/222/320/237/321/205/342/225/243/320/245/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +170 -0
  158. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/204/342/225/225/342/225/227/321/211/320/262/320/250/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +80 -0
  159. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +143 -0
  160. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/211/320/227/320/235/321/205/320/264/320/235/321/206/342/225/225/320/240/321/210/342/224/220/320/241/321/210/320/231/342/226/223/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +67 -0
  161. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/231/320/233/321/206/320/254/342/225/221/321/211/320/244/320/221/321/205/342/226/222/320/237/321/207/320/244/342/225/227/321/211/320/255/320/262.py +68 -0
  162. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/206/320/251/342/225/221/321/210/320/223/342/225/234/321/206/320/231/320/233/321/206/320/254/342/225/221/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +64 -0
  163. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/231/320/233/321/206/320/254/342/225/221//321/207/320/244/342/225/241/321/210/320/267/320/226/321/204/342/224/220/320/261/321/205/320/237/342/225/226/321/206/342/225/241/320/233/321/210/320/277/320/245/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +76 -0
  164. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/245/342/226/221/321/205/320/275/320/266/__init__.py +0 -0
  165. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/245/342/226/221/321/205/320/275/320/266//321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/226/342/226/222/321/206/342/225/225/320/232/321/206/320/231/320/233/321/206/320/254/342/225/221/321/205/320/263/320/221/321/207/342/225/221/342/225/225.py +84 -0
  166. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/206/320/245/342/226/221/321/205/320/275/320/266//321/206/320/262/320/266/321/205/342/225/243/342/225/227/321/205/342/225/234/320/271/321/210/320/251/342/225/243/321/206/342/225/235/320/271/321/206/342/225/242/320/261.py +43 -0
  167. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240/__init__.py +0 -0
  168. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/254/342/226/221/321/205/320/253/342/225/233/321/206/320/233/342/225/235/321/205/320/253/342/225/233.py +362 -0
  169. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/210/342/226/222/320/261/321/206/320/263/320/233.py +323 -0
  170. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/206/320/247/320/265/321/205/320/236/320/226/321/205/320/230/342/225/242/321/204/342/225/234/320/254.py +177 -0
  171. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/207/320/244/342/225/241/321/210/320/267/320/226/321/204/342/224/220/320/261/321/205/320/237/342/225/226/321/206/342/225/241/320/233/321/210/320/277/320/245/321/205/320/253/342/225/233/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +248 -0
  172. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/207/342/225/221/342/225/225/321/207/320/274/320/244/321/204/342/225/221/320/244/321/205/320/275/320/240/321/206/320/263/320/233.py +244 -0
  173. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/320/244/320/257/321/206/342/224/244/342/225/227/321/205/320/270/342/226/222/321/204/342/225/243/320/240//321/211/342/225/221/342/225/227/321/205/342/226/221/320/226/321/207/320/231/320/234.py +121 -0
  174. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227/__init__.py +0 -0
  175. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/204/342/225/225/320/231/321/205/320/236/320/257/321/210/320/231/342/226/223/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +144 -0
  176. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/204/342/225/225/320/231/321/206/320/254/320/230/321/204/342/225/225/320/231/321/205/320/253/342/225/233/321/206/320/260/320/227/321/210/320/276/342/225/233/321/210/320/276/320/261.py +77 -0
  177. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/205/320/264/320/272/321/206/320/256/320/221/321/205/320/253/342/225/233/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +59 -0
  178. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/206/320/231/320/233/321/206/320/254/342/225/221/321/206/320/246/320/227/321/205/320/275/320/247/321/205/320/223/320/237/321/207/342/224/244/320/260/321/210/320/231/342/225/221/321/206/320/254/320/277/321/207/320/244/342/225/227.py +215 -0
  179. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/206/342/226/221/342/224/244/321/207/320/237/320/260/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +64 -0
  180. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243/321/205/320/253/342/225/233/321/206/320/260/320/227/321/210/320/276/342/225/233/321/210/320/276/320/261.py +46 -0
  181. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/320/263/342/225/225/321/207/320/254/342/225/2353D/321/205/320/253/342/225/233.py +56 -0
  182. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/320/277/320/224/321/205/320/230/320/226/321/210/320/261/320/270/321/206/320/223/320/225/321/205/320/234/320/225.py +75 -0
  183. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/207/342/225/227/320/250/321/207/320/244/342/225/227//321/210/342/225/242/320/225/321/207/342/225/221/320/267/321/207/320/236/320/253/321/204/342/225/225/342/225/234/321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +577 -0
  184. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/211/320/257/342/224/202/321/204/342/225/243/320/240/__init__.py +0 -0
  185. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/260/320/221/321/211/320/255/320/243/321/205/342/225/221/320/243//321/211/320/257/342/224/202/321/204/342/225/243/320/240//321/204/342/225/221/320/244/321/207/342/225/221/342/224/220/321/210/342/226/221/342/226/222/321/206/320/231/320/243/321/205/320/235/342/226/221/321/206/320/270/320/261/321/206/320/255/342/224/220.py +164 -0
  186. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/PDF/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +317 -0
  187. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/SVG/321/205/320/253/342/225/233/321/207/320/231/320/227/321/207/342/224/244/320/262/321/205/342/225/235/320/245/321/205/320/253/342/225/233.py +73 -0
  188. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/SVG/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/342/225/234/320/274/321/205/320/225/320/223/321/207/342/224/244/320/260.py +325 -0
  189. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/_SVG/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/342/225/234/320/274/321/205/320/225/320/223/321/207/342/224/244/320/260.py +151 -0
  190. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/__init__.py +16 -0
  191. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/_/321/210/320/277/342/224/244/321/206/320/250/320/236.txt +2 -0
  192. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243/cairosvg/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +81 -0
  193. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/204/342/225/225/320/275/321/206/320/246/320/227/321/207/342/225/235/320/246/321/207/320/270/320/233/321/205/320/276/320/252/321/204/342/225/243/320/231.py +356 -0
  194. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/220/320/242/321/210/320/267/320/242/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +217 -0
  195. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243/__init__.py +23 -0
  196. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260.py +1269 -0
  197. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_SVG/321/205/320/253/342/225/233.py +45 -0
  198. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/253/342/225/233.py +233 -0
  199. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/253/342/225/233/321/206/320/261/320/230.py +62 -0
  200. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/254/320/226.py +78 -0
  201. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/264/320/235/321/207/320/244/320/270.py +72 -0
  202. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/205/320/264/320/252/321/210/342/225/233/342/225/243/321/205/342/225/234/320/262.py +88 -0
  203. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/232/320/250/321/207/342/225/221/342/224/220.py +71 -0
  204. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/246/320/227/321/205/320/275/320/247.py +239 -0
  205. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/260/320/227/321/210/320/276/342/226/221.py +18 -0
  206. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/264/320/275/321/205/320/254/320/226.py +79 -0
  207. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/206/320/270/320/261/321/206/320/255/342/224/220.py +119 -0
  208. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/207/320/257/320/271/321/205/342/225/234/320/262.py +92 -0
  209. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/207/342/225/221/342/224/220.py +76 -0
  210. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/207/342/225/227/320/224.py +124 -0
  211. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/210/320/263/320/221/321/205/320/231/320/272.py +48 -0
  212. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/210/342/225/226/320/277/321/205/342/225/233/320/224.py +1786 -0
  213. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/210/342/225/226/320/277/321/205/342/225/233/320/224/321/206/320/246/320/227/321/205/320/275/320/247.py +119 -0
  214. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/211/320/221/320/276/321/207/342/225/234/320/271.py +75 -0
  215. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260_/321/211/320/243/342/225/233/321/206/320/236/320/265.py +39 -0
  216. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/210/342/225/234/320/274/321/210/342/225/226/320/277/321/205/342/225/233/320/224/321/206/320/244/320/277/321/206/320/234/320/221.py +14 -0
  217. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/205/320/237/320/277/321/206/320/243/320/235/321/204/342/225/234/320/254/321/205/320/225/320/223/321/207/342/224/244/320/260/321/211/320/253/320/226/321/205/320/240/320/230.py +98 -0
  218. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/221/320/243//321/206/342/225/225/320/240/321/205/320/237/320/250/321/210/320/231/342/226/223.py +67 -0
  219. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +86 -0
  220. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/206/320/236/320/242/321/205/320/230/320/247/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +178 -0
  221. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/225/320/223/321/207/342/224/244/320/260/321/211/320/227/320/235/321/205/320/264/320/235/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +270 -0
  222. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/232/320/270/321/207/320/244/342/225/227/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +477 -0
  223. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/235/342/226/221/321/207/320/273/320/260/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +354 -0
  224. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/237/320/250/321/206/320/235/320/262/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +115 -0
  225. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/237/320/250/321/206/320/235/320/262/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226_/321/204/342/224/220/320/255/321/207/320/245/320/251.py +419 -0
  226. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/253/342/225/233/321/205/320/223/320/237/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +468 -0
  227. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/204/342/225/234/320/243/321/206/320/257/320/265/321/206/320/231/342/225/233/321/205/320/251/320/270.py +321 -0
  228. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/204/342/225/234/320/243/321/206/320/257/320/265/321/207/320/254/320/233/321/207/342/224/244/320/262/321/205/342/225/235/320/245/321/211/320/261/342/225/241/321/207/320/244/320/257/321/206/320/230/320/240.py +169 -0
  229. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/204/342/225/234/320/243/321/206/320/260/342/225/226/321/205/342/225/235/320/237.css +36 -0
  230. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/275/320/247/321/207/320/274/320/266/321/204/342/225/225/342/226/223/321/205/320/230/320/247/321/210/320/261/320/270.py +2680 -0
  231. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/320/276/320/252/321/204/342/225/243/320/231/321/211/320/253/320/226.py +974 -0
  232. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/205/342/225/234/320/262/321/207/320/232/342/225/242/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +220 -0
  233. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/231/342/225/243/321/211/320/227/320/237zip/321/210/320/267/320/263/321/205/320/236/320/233.py +82 -0
  234. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/205/320/264/320/224/321/207/320/240/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +132 -0
  235. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/246/320/227/321/205/320/275/320/247/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +170 -0
  236. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/320/260/342/225/226/321/205/342/225/235/320/237/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +500 -0
  237. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/342/225/227/320/264/321/211/320/245/320/254/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +392 -0
  238. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/206/342/225/242/320/230/321/206/320/221/320/277/321/206/320/261/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +88 -0
  239. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/231/342/225/243/321/206/320/276/320/232/321/207/320/274/320/266/321/205/320/237/342/225/226.md +90 -0
  240. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/206/320/270/320/261/321/206/320/255/342/224/220.py +73 -0
  241. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220.py +3172 -0
  242. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/207/342/225/227/320/250/321/205/320/253/342/225/233/321/206/320/255/342/224/220/321/205/342/225/226/320/265/321/205/320/225/342/225/226.py +1793 -0
  243. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/320/274/320/266/321/205/320/237/342/225/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +34 -0
  244. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/342/225/221/342/224/220/321/206/320/255/320/261/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +423 -0
  245. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/207/342/226/222/342/225/227/321/205/320/256/320/233/321/210/342/225/234/320/274/321/206/320/235/320/262/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +30 -0
  246. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/210/342/225/226/320/277/321/205/342/225/233/320/224/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +633 -0
  247. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/211/320/220/320/252/321/207/320/244/320/270/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/211/320/253/320/226.py +501 -0
  248. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/207/320/265/320/256/321/207/320/274/320/244/321/205/342/225/221/320/243//321/211/320/225/320/235/321/207/342/225/234/320/276.py +42 -0
  249. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/205/320/253/342/225/234/321/206/320/247/320/247//321/204/342/225/225/320/275/321/205/320/253/342/225/234/321/205/320/253/342/225/234/321/206/320/247/320/247.svg +47 -0
  250. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263/4g.svg +3 -0
  251. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263/5g.svg +3 -0
  252. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263/hd.svg +45 -0
  253. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/204/342/224/220/320/261/321/205/320/237/342/225/226.svg +3 -0
  254. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/205/320/262/320/256/321/205/320/232/320/260.svg +5 -0
  255. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/206/320/231/320/233/321/207/320/244/342/225/241/321/207/320/275/320/242.svg +17 -0
  256. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/206/320/255/320/265/321/207/320/244/342/225/241.svg +5 -0
  257. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/244/342/225/241/321/206/342/226/222/320/260.svg +6 -0
  258. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/253/342/225/225/321/206/320/254/342/225/221.svg +24 -0
  259. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/254/342/225/235/321/207/320/255/320/253.svg +4 -0
  260. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/207/320/274/320/241/321/210/320/224/342/225/225.svg +6 -0
  261. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/210/320/243/320/255/321/207/320/231/320/251.svg +2 -0
  262. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/210/320/277/320/275/321/211/320/257/342/224/202.svg +1 -0
  263. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/210/342/224/220/320/240/321/205/320/232/320/270/321/211/320/256/320/233.svg +16 -0
  264. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/320/221/320/232/321/205/320/264/320/271/321/207/320/272/320/247/321/205/320/237/320/263//321/211/320/244/320/221.svg +17 -0
  265. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2261.svg +2 -0
  266. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2262.svg +2 -0
  267. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2263.svg +2 -0
  268. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2264.svg +2 -0
  269. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2265.svg +2 -0
  270. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2266_black.svg +2 -0
  271. /321/207/320/265/320/256/321/207/320/274/320/244/321/207/320/260/320/221/321/211/320/255/320/243//321/210/342/225/241/320/224/321/206/342/225/221/320/240/321/205/342/225/221/320/243//321/207/342/224/244/320/260/321/206/320/255/320/240//321/210/342/225/242/342/224/202/321/207/320/240/320/223/321/207/342/225/221/342/225/243/321/207/320/240/320/226//321/207/342/225/221/342/225/243/321/207/320/240/320/2266_red.svg +2 -0
@@ -0,0 +1,1786 @@
1
+ # -*- coding:utf-8 -*-
2
+ # title :
3
+ # description :
4
+ # author :Python超人/三月三提供
5
+ # date :2024-06-01
6
+ # link :https://gitee.com/march3
7
+ # python_version :3.9
8
+ # ==============================================================================
9
+ import os
10
+ import svgwrite
11
+
12
+ from 神笔码靓.神笔库 import 打印红色消息
13
+ from 神笔码靓.神笔库.定义集 import *
14
+ from 神笔码靓.神笔库.元素库 import 可变换元素, 元素位置信息, 样式可修改元素
15
+ from 神笔码靓.神笔库.神笔绘图板工具 import 神笔绘图板工具
16
+
17
+
18
+ class 路径元素(可变换元素, 样式可修改元素):
19
+ _路径元素列表 = []
20
+
21
+ def __init__(self, 高清图, 所属组: list):
22
+ super(路径元素, self).__init__(高清图, 所属组)
23
+ self.前路径: 路径元素 = None
24
+ self.后路径: 路径元素 = None
25
+ self._路径元素列表.append(self)
26
+ self._批量坐标 = []
27
+ self._点辅助全局开 = True
28
+ self._点辅助字典 = {}
29
+
30
+ def 点辅助记录点(self, 记录点ID):
31
+ if 记录点ID in self._点辅助字典:
32
+ return self._点辅助字典[记录点ID]
33
+ return None
34
+
35
+ def 寻找路径(self, 索引=None, id_=None):
36
+ from 神笔码靓.神笔库.元素库 import 路径元素
37
+ 路径元素_: 路径元素 = self
38
+ if 索引 is None and id_ is None:
39
+ return 路径元素_
40
+ elif id_ is not None:
41
+ for 路径元素 in self._路径元素列表:
42
+ if 路径元素.获取属性值("id_") == id_:
43
+ 路径元素_ = 路径元素
44
+ break
45
+ elif 索引 is not None:
46
+ 路径元素_ = self._路径元素列表[索引]
47
+ return 路径元素_
48
+
49
+ def 落笔(self, x, y=None):
50
+ self.移动到(x, y)
51
+ return self
52
+
53
+ def 移动到(self, x, y=None):
54
+ if y is None:
55
+ x, y = x
56
+ self.追加顶点(("M", x, y))
57
+ self._记录当前线段数据(x1=x - 1, y1=y, x2=x, y2=y)
58
+ return self
59
+
60
+ # region 批量生成线
61
+ def 坐标(self, x, y=None):
62
+ if y is None or isinstance(x, tuple):
63
+ self._批量坐标.append(x)
64
+ elif x is not None and y is not None:
65
+ self._批量坐标.append((x, y))
66
+ else:
67
+ raise Exception(f"坐标的数据不正确:({x},{y})")
68
+
69
+ return self
70
+
71
+ def 坐标缩放(self, 缩放X, 缩放Y=None, 缩放中心点=None, 重置=False):
72
+ if 缩放Y is None:
73
+ 缩放Y = 缩放X
74
+ if 缩放中心点 is None:
75
+ 缩放中心点 = 0j
76
+ if 重置:
77
+ 坐标缩放 = []
78
+ else:
79
+ 坐标缩放 = self.获取属性值("坐标缩放", [])
80
+ 坐标缩放.append((缩放X, 缩放Y, 缩放中心点))
81
+ self.设置属性值("坐标缩放", 坐标缩放)
82
+ return self
83
+
84
+ def 坐标平移(self, 位移X, 位移Y=None, 重置=False):
85
+ if 位移Y is None:
86
+ 位移Y = 位移X
87
+ if 重置:
88
+ 坐标平移 = []
89
+ else:
90
+ 坐标平移 = self.获取属性值("坐标平移", [])
91
+ 坐标平移.append((位移X, 位移Y))
92
+ self.设置属性值("坐标平移", 坐标平移)
93
+ return self
94
+
95
+ def 坐标旋转(self, 旋转角度, 旋转中心点=None, 重置=False):
96
+ if 旋转中心点 is not None:
97
+ 旋转中心点 = complex(旋转中心点[0], 旋转中心点[1])
98
+ if 重置:
99
+ 坐标旋转 = []
100
+ else:
101
+ 坐标旋转 = self.获取属性值("坐标旋转", [])
102
+ 坐标旋转.append((旋转角度, 旋转中心点))
103
+ self.设置属性值("坐标旋转", 坐标旋转)
104
+ return self
105
+
106
+ # def 路径偏移(self, 偏移量):
107
+ # if 偏移量 == 0 or 偏移量 is None:
108
+ # return self
109
+ # self.设置属性值("路径偏移", 偏移量)
110
+ # return self
111
+
112
+ def 反向路径(self, 保留=是):
113
+ 反向路径_ = self.克隆()
114
+ if not 保留:
115
+ self.所属组.remove(self)
116
+ import svgpathtools
117
+ p = 反向路径_._get_path()
118
+ path1 = svgpathtools.Path(p)
119
+ 反向d = path1.reversed().d()
120
+ if "点列表" in 反向路径_.元素属性:
121
+ del 反向路径_.元素属性["点列表"]
122
+ 反向路径_.元素属性["原生path"] = 反向d
123
+ return 反向路径_
124
+
125
+ def _布尔运算(self, 布尔运算函数, 其他路径, 保留元素=False):
126
+ import svgpathtools
127
+ path1 = svgpathtools.Path(self.元素属性["原生path"])
128
+ path2 = svgpathtools.Path(其他路径.元素属性["原生path"])
129
+ path = 布尔运算函数(path1, path2)
130
+ 新路径 = self.高清图.路径(填充颜色=self.获取属性值("填充颜色", 颜色.透明),
131
+ 描边颜色=self.获取属性值("描边颜色", 颜色.黑色),
132
+ 透明度=self.获取属性值("透明度", 1.0),
133
+ 描边样式=self.获取属性值("描边样式", None),
134
+ 描边宽度=self.获取属性值("描边宽度", 1)).原生path(path.d())
135
+ if not 保留元素:
136
+ self.删除()
137
+ 其他路径.删除()
138
+ return 新路径
139
+
140
+ def _创建布尔运算(self, 高精度=1.0):
141
+ from 神笔码靓.神笔库.路径工具集 import 布尔运算
142
+ if 高精度 and 高精度 > 0.01:
143
+ 最小采样点数 = int((500 * 高精度) // 1)
144
+ 最大采样点数 = max(500, 最小采样点数 * 2)
145
+ return 布尔运算(
146
+ 最小采样点数=最小采样点数, # 增加最小采样点数
147
+ 最大采样点数=最大采样点数, # 增加最大采样点数
148
+ 曲线近似误差阈值=0.01, # 降低误差阈值
149
+ 数值容差=1e-9, # 提高数值精度
150
+ 是否几何简化=True, # 保持几何简化开启以处理自相交
151
+ 几何简化容差值=1e-8, # 减小简化容差以保留细节
152
+ buffer操作的分辨率=8 # 提高buffer分辨率
153
+ )
154
+ else:
155
+ return 布尔运算()
156
+
157
+ def 并集(self, 其他路径, 保留元素=False, 高精度=1.0):
158
+ 运算 = self._创建布尔运算(高精度=高精度)
159
+ return self._布尔运算(运算.并集, 其他路径, 保留元素)
160
+
161
+ def 交集(self, 其他路径, 保留元素=False, 高精度=1.0):
162
+ 运算 = self._创建布尔运算(高精度=高精度)
163
+ return self._布尔运算(运算.交集, 其他路径, 保留元素)
164
+
165
+ def 差集(self, 其他路径, 保留元素=False, 高精度=1.0):
166
+ 运算 = self._创建布尔运算(高精度=高精度)
167
+ return self._布尔运算(运算.差集, 其他路径, 保留元素)
168
+
169
+ def 坐标连直线(self):
170
+ if len(self._批量坐标) == 0:
171
+ return self
172
+ for _坐标 in self._批量坐标:
173
+ x, y = _坐标
174
+ self.画直线(终点x=x, 终点y=y)
175
+ self._批量坐标 = []
176
+ return self
177
+
178
+ # def 坐标连曲线(self):
179
+ # if len(self._批量坐标) == 0:
180
+ # return self
181
+ # for _坐标 in self._批量坐标:
182
+ # x, y = _坐标
183
+ #
184
+ # self._批量坐标 = []
185
+ # return self
186
+
187
+ # endregion
188
+
189
+ # region 显示点坐标
190
+ def _获取终点的坐标(self, 点):
191
+ 命令 = 点[0]
192
+ if 命令 in ["M", "L", "T"]:
193
+ return 点[1], 点[2]
194
+ elif 命令 == "H":
195
+ c, x = 点
196
+ return x, None
197
+ elif 命令 == "V":
198
+ c, y = 点
199
+ return None, y
200
+ elif 命令 == "C":
201
+ c, x1, y1, x2, y2, x, y = 点
202
+ return x, y
203
+ elif 命令 == "S":
204
+ c, 终点控制点x, 终点控制点y, 终点x, 终点y = 点
205
+ return 终点x, 终点y
206
+ elif 命令 == "Q":
207
+ c, x1, y1, x, y = 点
208
+ return x, y
209
+ elif 命令 == "A":
210
+ c, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y = 点
211
+ return x, y
212
+ elif 命令 in ["z", "Z"]:
213
+ return 0, 0
214
+ else:
215
+ return 0, 0
216
+
217
+ def _坐标数(self, 坐标, 保留小数=2):
218
+ return str(round(坐标[0], 保留小数)).rstrip("0").rstrip(".") + ", " + \
219
+ str(round(坐标[1], 保留小数)).rstrip("0").rstrip(".")
220
+
221
+ def _显示坐标标签(self, 坐标, 坐标偏移=None, 定位类型=定位点类型.实圆, 字体大小=12):
222
+ x, y = 坐标
223
+ 坐标文字 = self._坐标数(坐标)
224
+ if 坐标偏移 is None:
225
+ 坐标偏移x, 坐标偏移y = 0, 0
226
+ else:
227
+ 坐标偏移x, 坐标偏移y = 坐标偏移
228
+ self.高清图.显示坐标(坐标, 坐标1文字偏移=坐标偏移, 定位类型=定位类型, 字体大小=字体大小)
229
+ # self.高清图.写字(x=x + 坐标偏移x, y=y + 坐标偏移y + 15, 文字=坐标文字)
230
+
231
+ def _倒序查找XY(self, 点列表):
232
+ x, y = None, None
233
+ for i in range(-2, -len(点列表) - 1, -1):
234
+ 倒数第二点 = 点列表[i]
235
+ x_, y_ = self._获取终点的坐标(倒数第二点)
236
+ if x is None:
237
+ x = x_
238
+ if y is None:
239
+ y = y_
240
+ if x is None or y is None:
241
+ continue
242
+ else:
243
+ break
244
+ return x, y
245
+
246
+ def _连辅助线(self, x1, y1, x, y, 字体大小=12):
247
+ 描边样式 = f"{round(字体大小 / 4, 2)},{round(字体大小 / 4, 2)}"
248
+ 描边宽度 = round(字体大小 / 12, 2)
249
+ self.高清图.连直线(路径点列表=[(x, y), (x1, y1)], 描边颜色=self.高清图.辅助线颜色, 描边宽度=描边宽度,
250
+ 描边样式=描边样式)
251
+
252
+ def _显示点坐标_H(self, 最后点, 点列表, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
253
+ y = None
254
+ for i in range(-2, -len(点列表), -1):
255
+ 倒数第二点 = 点列表[i]
256
+ x, y = self._获取终点的坐标(倒数第二点)
257
+ if y is not None:
258
+ break
259
+
260
+ c, x = 最后点
261
+ if 记录点ID:
262
+ self._点辅助字典[记录点ID] = (x, y)
263
+ if self._点辅助全局开:
264
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
265
+
266
+ def _显示点坐标_L(self, 最后点, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
267
+ c, x, y = 最后点
268
+ if 记录点ID:
269
+ self._点辅助字典[记录点ID] = (x, y)
270
+ if self._点辅助全局开:
271
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
272
+
273
+ def _显示点坐标_V(self, 最后点, 点列表, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
274
+ x = None
275
+ for i in range(-2, -len(点列表), -1):
276
+ 倒数第二点 = 点列表[i]
277
+ x, y = self._获取终点的坐标(倒数第二点)
278
+ if x is not None:
279
+ break
280
+
281
+ c, y = 最后点
282
+ if 记录点ID:
283
+ self._点辅助字典[记录点ID] = (x, y)
284
+ if self._点辅助全局开:
285
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
286
+
287
+ def _显示点坐标_C(self, 最后点, 点列表, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
288
+ x3, y3 = self._倒序查找XY(点列表)
289
+ c, x1, y1, x2, y2, x, y = 最后点
290
+ if self._点辅助全局开:
291
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
292
+ self._显示坐标标签(坐标=(x1, y1), 坐标偏移=坐标偏移, 定位类型=定位点类型.空方, 字体大小=字体大小)
293
+ self._显示坐标标签(坐标=(x2, y2), 坐标偏移=坐标偏移, 定位类型=定位点类型.实方, 字体大小=字体大小)
294
+ self._连辅助线(x1, y1, x3, y3, 字体大小=字体大小)
295
+ self._连辅助线(x2, y2, x, y, 字体大小=字体大小)
296
+ if 记录点ID:
297
+ self._点辅助字典[记录点ID] = (x, y)
298
+
299
+ def _显示点坐标_S(self, 最后点, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
300
+ c, x1, y1, x, y = 最后点
301
+ if self._点辅助全局开:
302
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
303
+ self._连辅助线(x1, y1, x, y, 字体大小=字体大小)
304
+ self._显示坐标标签(坐标=(x1, y1), 坐标偏移=坐标偏移, 定位类型=定位点类型.实方, 字体大小=字体大小)
305
+ if 记录点ID:
306
+ self._点辅助字典[记录点ID] = (x, y)
307
+
308
+ def _显示点坐标_Q(self, 最后点, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
309
+ c, x1, y1, x, y = 最后点
310
+ if self._点辅助全局开:
311
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
312
+ self._连辅助线(x1, y1, x, y, 字体大小=字体大小)
313
+ self._显示坐标标签(坐标=(x1, y1), 坐标偏移=坐标偏移, 定位类型=定位点类型.实方, 字体大小=字体大小)
314
+ if 记录点ID:
315
+ self._点辅助字典[记录点ID] = (x, y)
316
+
317
+ def _显示点坐标_T(self, 最后点, 点列表, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
318
+ x1, y1 = self._倒序查找XY(点列表)
319
+ c, x, y = 最后点
320
+ if self._点辅助全局开:
321
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
322
+ self._显示坐标标签(坐标=(x1, y1), 坐标偏移=坐标偏移, 字体大小=字体大小)
323
+ if 记录点ID:
324
+ self._点辅助字典[记录点ID] = (x, y)
325
+
326
+ def _显示点坐标_A(self, 最后点, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
327
+ c, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y = 最后点
328
+ if self._点辅助全局开:
329
+ self._显示坐标标签(坐标=(x, y), 坐标偏移=坐标偏移, 字体大小=字体大小)
330
+ if 记录点ID:
331
+ self._点辅助字典[记录点ID] = (x, y)
332
+
333
+ def 点辅助开关(self, 开):
334
+ self._点辅助全局开 = 开
335
+ return self
336
+
337
+ def 点辅助(self, 开启=True, 坐标=True, 坐标偏移=None, 辅助线=False, 记录点ID=None, 字体大小=12):
338
+ if not 开启 or (not self._点辅助全局开 and 记录点ID is None):
339
+ return self
340
+ P = self.获取属性值
341
+ 点列表 = P("点列表")
342
+ if 点列表 is None:
343
+ return self
344
+ if len(点列表) == 0:
345
+ return self
346
+
347
+ 点列表 = 神笔绘图板工具.转SVG绘制路径命令(点列表)
348
+
349
+ 最后点 = 点列表[-1]
350
+
351
+ 命令 = 最后点[0]
352
+ # ['M', 'm', 'L', 'l', 'H', 'h', 'V', 'v', 'C', 'c', 'S', 's', 'Q', 'q', 'T', 't', 'A', 'a', 'Z', 'z']
353
+ if 命令 in ["M", "L"]:
354
+ self._显示点坐标_L(最后点, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
355
+ 字体大小=字体大小)
356
+ elif 命令 == "H":
357
+ 倒数第二点 = 点列表[-2]
358
+ self._显示点坐标_H(最后点, 点列表, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
359
+ 字体大小=字体大小)
360
+ elif 命令 == "V":
361
+ 倒数第二点 = 点列表[-2]
362
+ self._显示点坐标_V(最后点, 点列表, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
363
+ 字体大小=字体大小)
364
+ elif 命令 == "C":
365
+ 倒数第二点 = 点列表[-2]
366
+ self._显示点坐标_C(最后点, 点列表, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
367
+ 字体大小=字体大小)
368
+ elif 命令 == "S":
369
+ self._显示点坐标_S(最后点, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
370
+ 字体大小=字体大小)
371
+ elif 命令 == "Q":
372
+ self._显示点坐标_Q(最后点, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
373
+ 字体大小=字体大小)
374
+ elif 命令 == "T":
375
+ 倒数第二点 = 点列表[-2]
376
+ self._显示点坐标_T(最后点, 点列表, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
377
+ 字体大小=字体大小)
378
+ elif 命令 == "A":
379
+ self._显示点坐标_A(最后点, 坐标=坐标, 坐标偏移=坐标偏移, 辅助线=辅助线, 记录点ID=记录点ID,
380
+ 字体大小=字体大小)
381
+ elif 命令 in ["z", "Z"]:
382
+ pass
383
+ else:
384
+ 打印红色消息(f"无法显示点坐标:{最后点}")
385
+
386
+ return self
387
+
388
+ # endregion
389
+
390
+ def 闭合(self):
391
+ self.追加顶点(("闭合",))
392
+ # self._清除当前线段数据()
393
+ self._记录当前线段数据(x1=-1, y1=0, x2=0, y2=0)
394
+ return self
395
+
396
+ def _切线(self):
397
+ path = self._conv_svgpathtools()
398
+ postion = 1
399
+ # 获取路径上的点和单位切向量
400
+ point = path.point(postion)
401
+ tangent = path.unit_tangent(postion)
402
+
403
+ # 设置切向量显示长度(单位切向量模长为1,需放大以便观察)
404
+ scale = 50 # 可调整此值
405
+
406
+ # 计算切向量终点(从路径点出发,沿切向量方向延伸)
407
+ tangent_end = complex(
408
+ point.real + tangent.real * scale,
409
+ point.imag + tangent.imag * scale
410
+ )
411
+ # 反方向点
412
+ tangent_end1 = complex(
413
+ point.real - tangent.real * scale,
414
+ point.imag - tangent.imag * scale
415
+ )
416
+ # 绘制路径点和切向量线段
417
+ # 绘图板.连直线(路径点列表=[
418
+ # # (tangent_end1.real, tangent_end1.imag),
419
+ # (point.real, point.imag), # 起点:路径上的点
420
+ # (tangent_end.real, tangent_end.imag) # 终点:沿切向量方向延伸的点
421
+ # ], 描边宽度=0.2, 描边颜色=颜色.红色)
422
+ # print(f"单位切向量: {tangent.real},{tangent.imag}") # 输出类似: (0.7071067811865476+0.7071067811865475j)
423
+ # print(f"向量模长: {abs(tangent)}") # 应等于 1.0
424
+ return tangent_end1.real, tangent_end1.imag, point.real, point.imag
425
+
426
+ def _获取当前线段数据(self):
427
+ try:
428
+ return self._切线()
429
+ except:
430
+ if hasattr(self, "_当前线段数据"):
431
+ return self._当前线段数据
432
+
433
+ return []
434
+
435
+ # def _清除当前线段数据(self):
436
+ # if hasattr(self, "_当前线段数据"):
437
+ # delattr(self, "_当前线段数据")
438
+
439
+ def _计算右转直线坐标(self, x1, y1, x2, y2, angle, length):
440
+ """
441
+ 根据已知线段的端点坐标,计算偏转一定角度和长度后的新坐标点。
442
+
443
+ 参数:
444
+ x1 (float): 线段起点的x坐标
445
+ y1 (float): 线段起点的y坐标
446
+ x2 (float): 线段终点的x坐标
447
+ y2 (float): 线段终点的y坐标
448
+ angle (float): 偏转角度,以弧度制表示
449
+ length (float): 直线长度
450
+
451
+ 返回:
452
+ tuple: 包含新坐标点的x坐标和y坐标的元组 (x3, y3)
453
+ """
454
+ # 计算原线段的长度
455
+ original_length = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
456
+ # 计算原线段与x轴正方向的夹角(弧度制)
457
+ original_angle = math.atan2(y2 - y1, x2 - x1)
458
+ # 计算偏转后的角度
459
+ new_angle = original_angle + angle * math.pi / 180
460
+ # 计算新坐标点的x坐标
461
+ x3 = x2 + length * math.cos(new_angle)
462
+ # 计算新坐标点的y坐标
463
+ y3 = y2 + length * math.sin(new_angle)
464
+ return x3, y3
465
+
466
+ def _法线(self, r=0, d=1):
467
+ path = self._conv_svgpathtools()
468
+ postion = 1
469
+ point = path.point(postion)
470
+ normal = path.normal(postion)
471
+
472
+ normal_end = complex(
473
+ point.real + normal.real * r,
474
+ point.imag + normal.imag * r
475
+ )
476
+ # 反方向点
477
+ normal_end1 = complex(
478
+ point.real - (normal.real * r),
479
+ point.imag - (normal.imag * r)
480
+ )
481
+ if d == 1:
482
+ return normal_end1.real, normal_end1.imag, point.real, point.imag
483
+
484
+ return normal_end.real, normal_end.imag, point.real, point.imag
485
+
486
+ def _calculate_arc_endpoint(self, cx, cy, sx, sy, rotation_direction, angle_degrees):
487
+ """
488
+ 计算圆弧旋转后的终点坐标
489
+
490
+ 参数:
491
+ cx, cy: 圆弧中心点坐标
492
+ sx, sy: 圆弧起点坐标
493
+ rotation_direction: 旋转方向,'clockwise' 或 'counterclockwise'
494
+ angle_degrees: 旋转角度(度数)
495
+
496
+ 返回:
497
+ 终点坐标 (ex, ey)
498
+ """
499
+ # 计算起点相对于中心点的坐标
500
+ dx = sx - cx
501
+ dy = sy - cy
502
+
503
+ # 计算起点到中心点的距离(半径)
504
+ radius = math.hypot(dx, dy)
505
+
506
+ # 计算起点的角度(相对于x轴正方向)
507
+ start_angle = math.atan2(dy, dx)
508
+
509
+ # 将角度从度数转换为弧度
510
+ angle_radians = math.radians(angle_degrees)
511
+
512
+ # 根据旋转方向调整角度
513
+ if rotation_direction == 1:
514
+ end_angle = start_angle + angle_radians
515
+ else:
516
+ end_angle = start_angle - angle_radians
517
+
518
+ # 计算终点相对于中心点的坐标
519
+ ex_relative = radius * math.cos(end_angle)
520
+ ey_relative = radius * math.sin(end_angle)
521
+
522
+ # 转换为绝对坐标
523
+ ex = cx + ex_relative
524
+ ey = cy + ey_relative
525
+
526
+ return ex, ey
527
+
528
+ def 右转弧线(self, 右转角度, 圆弧半径):
529
+ _当前线段数据 = self._获取当前线段数据()
530
+ if _当前线段数据 is None:
531
+ raise Exception("上一条必须是直线")
532
+ x1, y1, x2, y2 = _当前线段数据
533
+ if 右转角度 > 0:
534
+ 方向 = 1
535
+ else:
536
+ 方向 = 0
537
+ normal_end_real, normal_end_imag, point_real, point_imag = self._法线(圆弧半径, 方向)
538
+
539
+ endpoint = self._calculate_arc_endpoint(cx=normal_end_real, cy=normal_end_imag, sx=point_real, sy=point_imag,
540
+ rotation_direction=方向, angle_degrees=abs(右转角度))
541
+ # self.高清图.十字(x=x1, y=y1,颜色=颜色.红色)
542
+ # self.高清图.十字(x=normal_end_real, y=normal_end_imag, 颜色=颜色.红色)
543
+ # self.高清图.十字(x=point_real, y=point_imag, 颜色=颜色.蓝色)
544
+ # self.高清图.十字(x=endpoint[0], y=endpoint[1], 颜色=颜色.绿色)
545
+
546
+ self.画圆弧(圆弧半径=圆弧半径, 终点=endpoint, 圆弧方向=方向)
547
+
548
+ return self
549
+
550
+ def 左转弧线(self, 左转角度, 圆弧半径):
551
+ self.右转弧线(-左转角度, 圆弧半径)
552
+ return self
553
+
554
+ # region 倒圆角直线
555
+ # 向量工具方法
556
+ def _vec_sub(self, a, b):
557
+ return (a[0] - b[0], a[1] - b[1])
558
+
559
+ def _vec_add(self, a, b):
560
+ return (a[0] + b[0], a[1] + b[1])
561
+
562
+ def _vec_mul(self, v, k):
563
+ return (v[0] * k, v[1] * k)
564
+
565
+ def _vec_dot(self, a, b):
566
+ return a[0] * b[0] + a[1] * b[1]
567
+
568
+ def _vec_cross(self, a, b):
569
+ return a[0] * b[1] - a[1] * b[0]
570
+
571
+ def _vec_len(self, v):
572
+ return math.hypot(v[0], v[1])
573
+
574
+ def _vec_normalize(self, v):
575
+ l = self._vec_len(v)
576
+ if l < self.eps:
577
+ raise ValueError("零向量,三点共线无法倒角")
578
+ return (v[0] / l, v[1] / l)
579
+
580
+ def _line_point_project(self, line_p0, line_p1, pt):
581
+ """点投影到直线,返回垂足(圆角切点)"""
582
+ a = self._vec_sub(pt, line_p0)
583
+ b = self._vec_sub(line_p1, line_p0)
584
+ t = self._vec_dot(a, b) / self._vec_dot(b, b)
585
+ proj = self._vec_add(line_p0, self._vec_mul(b, t))
586
+ return proj
587
+
588
+ def _calc_fillet_tangent(self, p0, p1, p2, r):
589
+ """
590
+ 折线p0-p1-p2倒圆角,计算两线段切点与倒角方向
591
+ :param p0: 线段A起点 (x,y)
592
+ :param p1: 折角顶点 (x,y)
593
+ :param p2: 线段B终点 (x,y)
594
+ :param r: 倒角半径
595
+ :return: (tangent1, tangent2, dir_flag)
596
+ tangent1: p0-p1上切点
597
+ tangent2: p1-p2上切点
598
+ dir_flag: 1=内角凸倒角,-1=外侧凹倒角
599
+ """
600
+ if r <= self.eps:
601
+ raise ValueError("倒角半径必须大于0")
602
+
603
+ # 两条边向量
604
+ v1_raw = self._vec_sub(p1, p0)
605
+ v2_raw = self._vec_sub(p1, p2)
606
+ u1 = self._vec_normalize(v1_raw)
607
+ u2 = self._vec_normalize(v2_raw)
608
+
609
+ # 夹角计算
610
+ dot_val = self._vec_dot(u1, u2)
611
+ dot_val = max(min(dot_val, 1.0), -1.0)
612
+ theta = math.acos(dot_val)
613
+ if theta < self.eps:
614
+ raise ValueError("三点近似共线,不存在夹角,无法倒角")
615
+
616
+ # 判断倒角朝向
617
+ cross_val = self._vec_cross(u1, u2)
618
+ dir_flag = 0 if cross_val > 0 else 1
619
+
620
+ # 角平分线单位向量
621
+ bisector = self._vec_add(u1, u2)
622
+ u_bis = self._vec_normalize(bisector)
623
+
624
+ # 计算圆角圆心
625
+ dist_p1_center = r / math.sin(theta / 2)
626
+ center = self._vec_add(p1, self._vec_mul(u_bis, -dist_p1_center))
627
+
628
+ # 求两条边上的切点
629
+ tan1 = self._line_point_project(p0, p1, center)
630
+ tan2 = self._line_point_project(p1, p2, center)
631
+
632
+ return tan1, tan2, dir_flag
633
+
634
+ def 倒圆角直线(self, 点1, 点2, 倒角半径):
635
+ self.eps = 1e-12
636
+ 点1x, 点1y = 点1
637
+ 点2x, 点2y = 点2
638
+
639
+ 上一个点 = self._获取上一个点的数据()
640
+ if 上一个点 is None:
641
+ raise Exception("倒角直线不能第一个使用")
642
+ else:
643
+ 点0 = 上一个点
644
+ 点0x, 点0y = 上一个点
645
+
646
+ t1, t2, direct = self._calc_fillet_tangent(点0, 点1, 点2, 倒角半径)
647
+
648
+ self.画直线(t1)
649
+ self.画圆弧(圆弧半径=倒角半径, 终点=t2, 圆弧方向=direct)
650
+ self.画直线(点2)
651
+
652
+ x1 = 点1x
653
+ y1 = 点1y
654
+ self._记录当前线段数据(x1=t2[0], y1=t2[1], x2=点2x, y2=点2y)
655
+
656
+ return self
657
+
658
+ # endregion 倒圆角直线
659
+
660
+ def 右转直线(self, 右转角度, 直线长度):
661
+ _当前线段数据 = self._获取当前线段数据()
662
+ if _当前线段数据 is None:
663
+ raise Exception("上一条必须是直线")
664
+ x1, y1, x2, y2 = _当前线段数据
665
+ x3, y3 = self._计算右转直线坐标(x1, y1, x2, y2, 右转角度, 直线长度)
666
+
667
+ # A = x1, y1
668
+ # B = x2, y2
669
+ #
670
+ # self.高清图.定位(A, B)
671
+
672
+ self.画直线(x3, y3)
673
+ return self
674
+
675
+ def 右转移动(self, 右转角度, 直线长度):
676
+ _当前线段数据 = self._获取当前线段数据()
677
+ if _当前线段数据 is None:
678
+ raise Exception("上一条必须是直线")
679
+ x1, y1, x2, y2 = _当前线段数据
680
+ x3, y3 = self._计算右转直线坐标(x1, y1, x2, y2, 右转角度, 直线长度)
681
+ self.移动到(x3, y3)
682
+ return self
683
+
684
+ def 左转移动(self, 左转角度, 直线长度):
685
+ self.右转移动(-左转角度, 直线长度)
686
+ return self
687
+
688
+ def 左转直线(self, 左转角度, 直线长度):
689
+ self.右转直线(-左转角度, 直线长度)
690
+ return self
691
+
692
+ def 前进直线(self, 直线长度):
693
+ self.右转直线(0, 直线长度)
694
+ return self
695
+
696
+ def 后退直线(self, 直线长度):
697
+ self.右转直线(0, -直线长度)
698
+ return self
699
+
700
+ def _获取上一个点的数据(self):
701
+ P = self.获取属性值
702
+ 点列表 = P("点列表")
703
+ if 点列表 is None:
704
+ return None
705
+ if len(点列表) == 0:
706
+ return None
707
+
708
+ 点列表 = 神笔绘图板工具.转SVG绘制路径命令(点列表)
709
+
710
+ 点x, 点y = None, None
711
+ for i in range(len(点列表) - 1, -1, -1):
712
+ if not (点x is None and 点y is None):
713
+ break
714
+ 点 = 点列表[i]
715
+ # # ['M', 'm', 'L', 'l', 'H', 'h', 'V', 'v', 'C', 'c', 'S', 's', 'Q', 'q', 'T', 't', 'A', 'a', 'Z', 'z']
716
+ #
717
+ if 点[0] in ["M", "L", "T"]:
718
+ return 点[1], 点[2]
719
+ # elif 点[0] == "L":
720
+ # return 点[1], 点[2]
721
+ elif 点[0] == "H":
722
+ 点x = 点[1]
723
+ elif 点[0] == "V":
724
+ 点y = 点[1]
725
+ elif 点[0] == "S":
726
+ # c, x1, y1, x, y
727
+ return 点[3], 点[4]
728
+ elif 点[0] == "C":
729
+ # c, x1, y1, x2, y2, x, y
730
+ return 点[5], 点[6]
731
+ elif 点[0] == "Q":
732
+ # c, x1, y1, x, y
733
+ return 点[3], 点[4]
734
+ # elif 点[0] == "T":
735
+ # # c, x, y
736
+ # return 点[1], 点[2]
737
+ elif 点[0] == "A":
738
+ # c, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y
739
+ return 点[6], 点[7]
740
+ else:
741
+ 打印红色消息(f"上一个点的数据:{点}")
742
+ return None
743
+
744
+ if 点x is None and 点y is None:
745
+ return None
746
+ return 点x, 点y
747
+
748
+ # endregion
749
+
750
+ # region 新路径
751
+
752
+ def _新路径设置属性(self, 新路径):
753
+ """
754
+ @return:
755
+ """
756
+ 描边宽度 = self.获取属性值("描边宽度", 1)
757
+ 新路径.描边宽度(描边宽度)
758
+ 填充颜色 = self.获取属性值("填充颜色", None)
759
+ if 填充颜色 is not None:
760
+ 新路径.填充颜色(填充颜色)
761
+ 描边颜色 = self.获取属性值("描边颜色", None)
762
+ if 描边颜色 is not None:
763
+ 新路径.描边颜色(描边颜色)
764
+ 透明度 = self.获取属性值("透明度", None)
765
+ if 透明度 is not None:
766
+ 新路径.透明度(透明度)
767
+ 描边样式 = self.获取属性值("描边样式", None)
768
+ if 描边样式 is not None:
769
+ 新路径.描边样式(描边样式)
770
+
771
+ def 新路径(self, x=None, y=None, 描边颜色=None, 填充颜色=None, 描边宽度=None,
772
+ 透明度=None, 描边样式: str = None, id_: str = None):
773
+ """
774
+
775
+ @return:
776
+ """
777
+ 上一个点的数据 = self._获取上一个点的数据()
778
+ if 上一个点的数据 is None:
779
+ x_, y_ = 0, 0
780
+ else:
781
+ x_, y_ = 上一个点的数据
782
+
783
+ if x is None:
784
+ x = x_
785
+ if y is None:
786
+ y = y_
787
+
788
+ 新路径 = 路径元素(self.高清图, self.所属组)
789
+ 新路径.设置属性值("点列表", [])
790
+ if x is None and y is None:
791
+ 新路径.移动到(0, 0)
792
+ elif x is None:
793
+ 新路径.移动到(0, y)
794
+ elif y is None:
795
+ 新路径.移动到(x, 0)
796
+ else:
797
+ 新路径.移动到(x, y)
798
+ self._新路径设置属性(新路径)
799
+
800
+ if 描边宽度 is not None:
801
+ 新路径.描边宽度(描边宽度)
802
+ if 填充颜色 is not None:
803
+ 新路径.填充颜色(填充颜色)
804
+ if 描边颜色 is not None:
805
+ 新路径.描边颜色(描边颜色)
806
+ if 透明度 is not None:
807
+ 新路径.透明度(透明度)
808
+ if 描边样式 is not None:
809
+ 新路径.描边样式(描边样式)
810
+ if id_ is not None:
811
+ 新路径.设置属性值("id_", id_)
812
+
813
+ 新路径.前路径 = self
814
+ self.后路径 = 新路径
815
+ return 新路径
816
+
817
+ def 新描边颜色(self, 颜色值, id_: str = None):
818
+ 新路径 = self.新路径()
819
+ 新路径.设置属性值(属性名="描边颜色", 属性值=颜色值)
820
+ if id_ is not None:
821
+ 新路径.设置属性值("id_", id_)
822
+ return 新路径
823
+
824
+ def 新描边宽度(self, 宽度值, id_: str = None):
825
+ 新路径 = self.新路径()
826
+ 新路径.设置属性值(属性名="描边宽度", 属性值=宽度值)
827
+ if id_ is not None:
828
+ 新路径.设置属性值("id_", id_)
829
+ return 新路径
830
+
831
+ def 新描边样式(self, 样式值, id_: str = None):
832
+ 新路径 = self.新路径()
833
+ 新路径.设置属性值(属性名="描边样式", 属性值=样式值)
834
+ if id_ is not None:
835
+ 新路径.设置属性值("id_", id_)
836
+ return 新路径
837
+
838
+ # endregion
839
+
840
+ def 画直线(self, 终点x, 终点y=None):
841
+ if 终点y is None:
842
+ 终点x, 终点y = 终点x
843
+ 上一个点 = self._获取上一个点的数据()
844
+ if 上一个点 is not None:
845
+ x1, y1 = 上一个点
846
+ self._记录当前线段数据(x1=x1, y1=y1, x2=终点x, y2=终点y)
847
+ self.追加顶点(("L", 终点x, 终点y))
848
+ return self
849
+
850
+ # region 旋转直线
851
+ def _记录当前线段数据(self, x1=None, y1=None, x2=None, y2=None):
852
+ if hasattr(self, "_当前线段数据"):
853
+ if x1 is not None:
854
+ self._当前线段数据[0] = x1
855
+ if y1 is not None:
856
+ self._当前线段数据[1] = y1
857
+ if x2 is not None:
858
+ self._当前线段数据[2] = x2
859
+ if y2 is not None:
860
+ self._当前线段数据[3] = y2
861
+ else:
862
+ self._当前线段数据 = [x1, y1, x2, y2]
863
+
864
+ def 画水平线(self, 终点x):
865
+ 上一个点 = self._获取上一个点的数据()
866
+ if 上一个点 is not None:
867
+ 上一个点x, 上一个点y = 上一个点
868
+ x1, y1, x2, y2 = 上一个点x, 上一个点y, 终点x, 上一个点y
869
+ self._记录当前线段数据(x1, y1, x2, y2)
870
+ self.追加顶点(("H", 终点x))
871
+ return self
872
+
873
+ def 画垂直线(self, 终点y):
874
+ 上一个点 = self._获取上一个点的数据()
875
+ if 上一个点 is not None:
876
+ 上一个点x, 上一个点y = 上一个点
877
+ x1, y1, x2, y2 = 上一个点x, 上一个点y, 上一个点x, 终点y
878
+ self._记录当前线段数据(x1, y1, x2, y2)
879
+ self.追加顶点(("V", 终点y))
880
+ return self
881
+
882
+ def 画曲线(self, 开始控制点: tuple[float, float], 终点控制点: tuple[float, float], 终点: tuple[float, float]):
883
+ 开始控制点x, 开始控制点y = 开始控制点
884
+ 终点控制点x, 终点控制点y = 终点控制点
885
+ 终点x, 终点y = 终点
886
+ # self._清除当前线段数据()
887
+ self.追加顶点(("C", 开始控制点x, 开始控制点y, 终点控制点x, 终点控制点y, 终点x, 终点y))
888
+ self._记录当前线段数据(x1=终点控制点x, y1=终点控制点y, x2=终点x, y2=终点y)
889
+ return self
890
+
891
+ def 三次贝塞尔曲线(self, 开始控制点: tuple[float, float], 终点控制点: tuple[float, float],
892
+ 终点: tuple[float, float]):
893
+ 开始控制点x, 开始控制点y = 开始控制点
894
+ 终点控制点x, 终点控制点y = 终点控制点
895
+ 终点x, 终点y = 终点
896
+ # self._清除当前线段数据()
897
+ self.追加顶点(("C", 开始控制点x, 开始控制点y, 终点控制点x, 终点控制点y, 终点x, 终点y))
898
+ self._记录当前线段数据(x1=终点控制点x, y1=终点控制点y, x2=终点x, y2=终点y)
899
+ return self
900
+
901
+ def 平滑曲线(self, 终点控制点: tuple[float, float], 终点: tuple[float, float]):
902
+ 终点x, 终点y = 终点
903
+ 终点控制点x, 终点控制点y = 终点控制点
904
+ # self._清除当前线段数据()
905
+ self.追加顶点(("S", 终点控制点x, 终点控制点y, 终点x, 终点y))
906
+ self._记录当前线段数据(x1=终点控制点x, y1=终点控制点y, x2=终点x, y2=终点y)
907
+ return self
908
+
909
+ def 二次贝塞尔曲线(self, 曲线控制点: tuple[float, float], 终点: tuple[float, float]):
910
+ 终点x, 终点y = 终点
911
+ 曲线控制点x, 曲线控制点y = 曲线控制点
912
+ # self._清除当前线段数据()
913
+ self.追加顶点(("Q", 曲线控制点x, 曲线控制点y, 终点x, 终点y))
914
+ self._记录当前线段数据(x1=曲线控制点x, y1=曲线控制点y, x2=终点x, y2=终点y)
915
+ return self
916
+
917
+ def 平滑的二次贝塞尔曲线(self, 终点: tuple[float, float]):
918
+ 终点x, 终点y = 终点
919
+ 上一个点 = self._获取上一个点的数据()
920
+ if 上一个点 is None:
921
+ x1 = 终点x - 1
922
+ y1 = 终点y
923
+ else:
924
+ x1, y1 = 上一个点
925
+ # self._清除当前线段数据()
926
+ self.追加顶点(("T", 终点x, 终点y))
927
+ self._记录当前线段数据(x1=x1, y1=y1, x2=终点x, y2=终点y)
928
+ return self
929
+
930
+ import math
931
+
932
+ def calculate_slope_of_elliptical_arc_point(self, x1, y1, x2, y2, rx, ry, x_axis_rotation, large_arc_flag,
933
+ sweep_flag, x,
934
+ y):
935
+ """
936
+ 计算使用A命令绘制的椭圆弧上某点的斜率。
937
+
938
+ 参数:
939
+ x1 (float): A命令椭圆弧起始点的x坐标
940
+ y1 (float): A命令椭圆弧起始点的y坐标
941
+ x2 (float): A命令椭圆弧终点的x坐标
942
+ y2 (float): A命令椭圆弧终点的y坐标
943
+ rx (float): 椭圆弧所在椭圆的x轴半径
944
+ ry (float): 椭圆弧所在椭圆的y轴半径
945
+ x_axis_rotation (float): A命令中的x - axis - rotation参数,旋转角度
946
+ large_arc_flag (int): A命令中的large - arc - flag参数,大弧标志(0或1)
947
+ sweep_flag (int): A命令中的sweep - flag参数,绘制方向标志(0或1)
948
+ x (float): 椭圆弧上要计算斜率的点的x坐标
949
+ y (float): 椭圆弧上要计算斜率的点的y坐标
950
+
951
+ 返回:
952
+ float: 椭圆弧上该点的斜率,如果无法计算(例如在垂直切线情况下)返回None
953
+ """
954
+ import math
955
+
956
+ # 将角度转换为弧度
957
+ angle = math.radians(x_axis_rotation)
958
+ cos_angle = math.cos(angle)
959
+ sin_angle = math.sin(angle)
960
+
961
+ # 步骤1:将终点坐标转换到未旋转的椭圆坐标系
962
+ dx = (x1 - x2) / 2
963
+ dy = (y1 - y2) / 2
964
+ x1_ = cos_angle * dx + sin_angle * dy
965
+ y1_ = -sin_angle * dx + cos_angle * dy
966
+
967
+ # 确保半径足够大
968
+ rx = abs(rx)
969
+ ry = abs(ry)
970
+ rx_sq = rx * rx
971
+ ry_sq = ry * ry
972
+ x1_sq = x1_ * x1_
973
+ y1_sq = y1_ * y1_
974
+
975
+ # 计算椭圆中心
976
+ radical = (rx_sq * ry_sq - rx_sq * y1_sq - ry_sq * x1_sq) / (rx_sq * y1_sq + ry_sq * x1_sq)
977
+ if radical < 0:
978
+ radical = 0
979
+ radical = math.sqrt(radical)
980
+
981
+ if large_arc_flag == sweep_flag:
982
+ radical = -radical
983
+
984
+ cx_ = radical * rx * y1_ / ry
985
+ cy_ = -radical * ry * x1_ / rx
986
+
987
+ # 将终点转换回原始坐标系
988
+ cx = cos_angle * cx_ - sin_angle * cy_ + (x1 + x2) / 2
989
+ cy = sin_angle * cx_ + cos_angle * cy_ + (y1 + y2) / 2
990
+
991
+ # 计算终点相对于椭圆中心的角度
992
+ angle_x = (x2 - cx) * cos_angle + (y2 - cy) * sin_angle
993
+ angle_y = -(x2 - cx) * sin_angle + (y2 - cy) * cos_angle
994
+
995
+ # 计算斜率
996
+ try:
997
+ slope = (-rx * angle_y) / (ry * angle_x)
998
+ return slope
999
+ except ZeroDivisionError:
1000
+ return None
1001
+
1002
+ def 画椭圆弧(self, x圆弧半径, y圆弧半径, 终点: tuple[float, float], 圆弧方向=0, 是否大弧=False):
1003
+ # "椭圆弧线": "A", # (rx, ry), x_axis_rotation, (large_arc_flag, sweep_flag), (x, y)
1004
+ 终点x, 终点y = 终点
1005
+ if 圆弧方向 != 0:
1006
+ 圆弧方向 = 1
1007
+ if 是否大弧 == True or 是否大弧 == 1:
1008
+ 是否大弧 = 1
1009
+ else:
1010
+ 是否大弧 = 0
1011
+ # self._清除当前线段数据()
1012
+ self.追加顶点(("A", x圆弧半径, y圆弧半径, 0, 是否大弧, 圆弧方向, 终点x, 终点y))
1013
+ last_x, last_y = self.获取上一个点的位置()
1014
+ # slope = self.calculate_slope_of_elliptical_arc_point(x1=last_x, y1=last_y, x2=终点x, y2=终点y, rx=x圆弧半径,
1015
+ # ry=y圆弧半径,
1016
+ # x_axis_rotation=0, large_arc_flag=0, sweep_flag=0, x=终点x,
1017
+ # y=终点y)
1018
+ self._记录当前线段数据(x1=终点x - 1, y1=终点y, x2=终点x, y2=终点y)
1019
+ return self
1020
+
1021
+ def 画圆弧(self, 圆弧半径, 终点: tuple[float, float], 圆弧方向=0, 是否大弧=False):
1022
+ 终点x, 终点y = 终点
1023
+ if 圆弧方向 != 0:
1024
+ 圆弧方向 = 1
1025
+ # 起点x, 起点y = self.获取上一个点的位置()
1026
+ # self._清除当前线段数据()
1027
+ self.追加顶点(("圆弧线", 圆弧半径, 圆弧方向, 终点x, 终点y, 是否大弧))
1028
+ # last_x, last_y = self.获取上一个点的位置()
1029
+ # slope = self.calculate_slope_of_elliptical_arc_point(x1=last_x,y1=last_y,x2=终点x,y2=终点y,rx=圆弧半径,ry=圆弧半径,
1030
+ # x_axis_rotation=0,large_arc_flag=0, sweep_flag=0,x=终点x,y=终点y)
1031
+ # 斜率k可以表示为:k = (y2 - y1) / (x2 - x1)
1032
+ # slope = (终点y - 起点y) / (终点x - 起点x)
1033
+ # slope * (终点x - 起点x) - 终点y = - 起点y
1034
+ # last_x, last_y = self.获取上一个点的位置()
1035
+ # # 起点x,起点y = last_x, last_y
1036
+ # 起点x = 终点x + 10
1037
+ # 起点y = 终点y - slope * (终点x - 起点x)
1038
+ # print(slope)
1039
+ self._记录当前线段数据(x1=终点x - 1, y1=终点y, x2=终点x, y2=终点y)
1040
+ return self
1041
+
1042
+ def 画圆(self, 圆心: tuple[float, float], 圆方向=0, 起点=None):
1043
+ 圆心x, 圆心y = 圆心
1044
+ if 圆方向 != 0:
1045
+ 圆方向 = 1
1046
+ if 起点 is None:
1047
+ 起点x, 起点y = self.获取上一个点的位置()
1048
+ else:
1049
+ 起点x, 起点y = 起点
1050
+ 点列表 = self.获取属性值("点列表", [])
1051
+ if len(点列表) == 0:
1052
+ self.移动到(起点x, 起点y)
1053
+ else:
1054
+ 上起点x, 上起点y = self.获取上一个点的位置()
1055
+ if 上起点x != 起点x or 上起点y != 起点y:
1056
+ self.画直线(起点x, 起点y)
1057
+
1058
+ 终点x, 终点y = 2 * 圆心x - 起点x, 2 * 圆心y - 起点y
1059
+ 圆半径 = math.sqrt((圆心x - 起点x) ** 2 + (圆心y - 起点y) ** 2)
1060
+ # self.追加顶点(("圆弧线", 圆半径, 圆方向, 终点x, 终点y))
1061
+ # self.追加顶点(("圆弧线", 圆半径, 圆方向, 起点x, 起点y))
1062
+
1063
+ self.画圆弧(圆弧半径=圆半径, 终点=(终点x, 终点y), 圆弧方向=圆方向)
1064
+ self.画圆弧(圆弧半径=圆半径, 终点=(起点x, 起点y), 圆弧方向=圆方向)
1065
+ # self._清除当前线段数据()
1066
+ # self._记录当前线段数据(x1=终点x - 1, y1=终点y, x2=终点x, y2=终点y)
1067
+ return self
1068
+
1069
+ def 路径缩放(self, x=1, y=1):
1070
+ """
1071
+
1072
+ @param x:
1073
+ @param y:
1074
+ @return:
1075
+ """
1076
+ P = self.获取属性值
1077
+ 点列表 = P("点列表")
1078
+
1079
+ 路径点列表 = []
1080
+ from 神笔码靓.神笔库 import 神笔绘图板工具
1081
+ 点列表 = 神笔绘图板工具.转SVG绘制路径命令(点列表)
1082
+
1083
+ # ['M', 'm', 'L', 'l', 'H', 'h', 'V', 'v', 'C', 'c', 'S', 's', 'Q', 'q', 'T', 't', 'A', 'a', 'Z', 'z']
1084
+ for 点 in 点列表:
1085
+ if 点[0] in ["M", "m", "L", "l", "T", "t"]:
1086
+ # 顶点x, 顶点y = 点[1]*x, 点[2]*y
1087
+ 路径点列表.append((点[0], 点[1] * x, 点[2] * y))
1088
+ elif 点[0] in ["C", "c"]:
1089
+ # (x1, y1), (x2, y2), (x, y)
1090
+ 顶点x, 顶点y = 点[5], 点[6]
1091
+ 路径点列表.append((点[0], 点[1] * x, 点[2] * y, 点[3] * x, 点[4] * y, 点[5] * x, 点[6] * y))
1092
+
1093
+ elif 点[0] in ["H", "h"]:
1094
+ 顶点x = 点[1]
1095
+ 路径点列表.append((点[0], 点[1] * x))
1096
+ elif 点[0] in ["V", "v"]:
1097
+ 顶点y = 点[1]
1098
+ 路径点列表.append((点[0], 点[1] * y))
1099
+ elif 点[0] in ["Q", "q", "S", "s"]:
1100
+ # (x1, y1), (x, y)
1101
+ 顶点x, 顶点y = 点[3], 点[4]
1102
+ 路径点列表.append((点[0], 点[1] * x, 点[2] * y, 点[3] * x, 点[4] * y))
1103
+ elif 点[0] in ["A", "a"]:
1104
+ # (rx, ry), x_axis_rotation, (large_arc_flag, sweep_flag), (x, y) =
1105
+ 顶点x, 顶点y = 点[6], 点[7]
1106
+ 路径点列表.append((点[0], 点[1] * x, 点[2] * y, 点[3], 点[4], 点[5], 点[6] * x, 点[7] * y))
1107
+ elif 点[0] in ["Z", "z"]:
1108
+ 路径点列表.append((点[0],))
1109
+ else:
1110
+ 顶点x, 顶点y = 点[0], 点[1]
1111
+ 路径点列表.append((点[0] * x, 点[1] * y))
1112
+
1113
+ self.设置属性值("点列表", 路径点列表)
1114
+
1115
+ return self
1116
+
1117
+ def 获取上一个点的位置(self):
1118
+ P = self.获取属性值
1119
+ 点列表 = P("点列表")
1120
+ if len(点列表) == 0:
1121
+ return 0, 0
1122
+ last_x = None
1123
+ last_y = None
1124
+ for i in range(-1, -len(点列表), -1):
1125
+ 倒数第二点 = 点列表[i]
1126
+ x, y = self._获取终点的坐标(倒数第二点)
1127
+ if x is not None:
1128
+ last_x = x
1129
+ if y is not None:
1130
+ last_y = y
1131
+ if last_x is not None and last_y is not None:
1132
+ break
1133
+
1134
+ return last_x, last_y
1135
+
1136
+ def 列表转方法调用(self):
1137
+ P = self.获取属性值
1138
+ 点列表 = P("点列表")
1139
+ 方法字典 = {
1140
+ "移动": self.移动到,
1141
+ "移动到": self.移动到,
1142
+ "平滑曲线": self.平滑曲线,
1143
+ "曲线": self.画曲线,
1144
+ "直线": self.画直线,
1145
+ "水平直线": self.画水平线,
1146
+ "水平线": self.画水平线,
1147
+ "垂直直线": self.画垂直线,
1148
+ "垂直线": self.画垂直线,
1149
+ "二次贝塞尔曲线": self.二次贝塞尔曲线,
1150
+ "平滑的二次贝塞尔曲线": self.平滑的二次贝塞尔曲线,
1151
+ "画圆弧": self.画圆弧
1152
+ }
1153
+ 方法调用 = ""
1154
+ for 点命令, *参数 in 点列表:
1155
+ 方法 = 方法字典.get(点命令, None)
1156
+ if 方法 is None:
1157
+ 方法 = f".{点命令}()"
1158
+ else:
1159
+ params = self._get_function_params(方法)
1160
+ 方法 = f". \\\n{方法.__name__}("
1161
+ pi = 0
1162
+ for name, param in params.items():
1163
+ if "tuple" in str(param.annotation):
1164
+ 方法 += f"{name}=({参数[pi]}, {参数[pi + 1]}),"
1165
+ pi += 1
1166
+ else:
1167
+ 方法 += f"{name}={参数[pi]},"
1168
+ pi += 1
1169
+
1170
+ 方法调用 += 方法.strip(",") + ")"
1171
+ print(方法调用)
1172
+ return self
1173
+
1174
+ def _get_function_params(self, function):
1175
+ import inspect
1176
+
1177
+ sig = inspect.signature(function)
1178
+ params = sig.parameters
1179
+ return params
1180
+
1181
+ def 追加顶点(self, 顶点命令):
1182
+ P = self.获取属性值
1183
+ 点列表 = P("点列表")
1184
+ 点列表.append(顶点命令)
1185
+ return self
1186
+
1187
+ def 合并路径(self, 路径元素_, 保留=否):
1188
+ 元素_: 路径元素 = 路径元素_
1189
+ 合并点列表 = 元素_.获取属性值("点列表")
1190
+ P = self.获取属性值
1191
+ 现有点列表 = P("点列表")
1192
+ self.设置属性值("点列表", 现有点列表 + 合并点列表)
1193
+ if not 保留:
1194
+ 元素_.所属组.remove(元素_)
1195
+ return self
1196
+
1197
+ def 中心点计算(self, 元素位置: 元素位置信息 = None):
1198
+ from 神笔码靓.神笔库 import 多边形工具
1199
+ 现有点列表 = self.获取路径点列表()
1200
+ # 元素位置.中心点 = 多边形工具.获取中心点(现有点列表)
1201
+ xmin, xmax, ymin, ymax = self.获取边界框()
1202
+ 中心点 = (xmin + xmax) / 2, (ymin + ymax) / 2
1203
+ if 元素位置 is not None:
1204
+ 元素位置.中心点 = 中心点
1205
+ return 中心点
1206
+
1207
+ def 几何重心计算(self, 采样数=1000):
1208
+ """计算路径的几何重心"""
1209
+ import numpy as np
1210
+ # 在路径上均匀采样点
1211
+ path = self._conv_svgpathtools()
1212
+ t_values = np.linspace(0, 1, 采样数)
1213
+ points = np.array([path.point(t) for t in t_values])
1214
+
1215
+ # 分离实部(x)和虚部(y)
1216
+ x = points.real
1217
+ y = points.imag
1218
+
1219
+ # 计算重心
1220
+ centroid_x = np.mean(x)
1221
+ centroid_y = np.mean(y)
1222
+
1223
+ return centroid_x, centroid_y
1224
+
1225
+ def 路径长度(self):
1226
+ import svgpathtools
1227
+ path = svgpathtools.Path(self.获取路径d())
1228
+ return path.length()
1229
+
1230
+ def 交点计算(self, 其他路径):
1231
+ if not isinstance(其他路径, 路径元素):
1232
+ return None
1233
+ import svgpathtools
1234
+ path1 = svgpathtools.Path(self.获取路径d())
1235
+ path2 = svgpathtools.Path(其他路径.获取路径d())
1236
+ intersect_path = path1.intersect(path2)
1237
+ intersections = []
1238
+ # svgpathtools.CompoundPath(merged_path)
1239
+ for (T1, seg1, t1), (T2, seg2, t2) in intersect_path:
1240
+ intersection = path1.point(T1)
1241
+ x, y = intersection.real, intersection.imag
1242
+ intersections.append((x, y))
1243
+ return intersections
1244
+ # for intersection in intersections:
1245
+ # # self.高清图.画圆(intersection.real, intersection.imag, 半径=2, 填充颜色=颜色.红色)
1246
+
1247
+ @property
1248
+ def 路径点列表(self):
1249
+ P = self.获取属性值
1250
+ 点列表 = P("点列表")
1251
+ return 点列表
1252
+
1253
+ # def 原生路径修正(self):
1254
+ # self.设置属性值("原生路径修正", True)
1255
+ # return self
1256
+
1257
+ def 原生path(self, d=None):
1258
+ if d is None:
1259
+ if "原生path" in self.元素属性:
1260
+ return self.元素属性["原生path"]
1261
+ return None
1262
+ self.设置属性值(属性名="原生path", 属性值=d)
1263
+ return self
1264
+
1265
+ def 追加顶点列表(self, 追加顶点列表):
1266
+ P = self.获取属性值
1267
+ 点列表 = P("点列表")
1268
+ 点列表 += 追加顶点列表
1269
+ return self
1270
+
1271
+ def 获取元素范围(self):
1272
+ return self.获取边界框()
1273
+ # return self.获取路径点列表范围()
1274
+
1275
+ # def 路径并集(self, 路径):
1276
+ # if 路径 == self:
1277
+ # return self
1278
+ #
1279
+ # raise NotImplementedError("暂不支持路径并集")
1280
+ #
1281
+ # return self
1282
+ #
1283
+ # def 路径交集(self, 路径):
1284
+ # if 路径 == self:
1285
+ # return self
1286
+ # raise NotImplementedError("暂不支持路径交集")
1287
+ # from svgpathtools import Path, parse_path
1288
+ # if isinstance(路径, str):
1289
+ # path2_str = 路径
1290
+ # elif isinstance(路径, 路径元素):
1291
+ # path2_str = 路径.获取路径d()
1292
+ # path1_str = self.获取路径d()
1293
+ # #
1294
+ # # path1_obj.unite() # unite()和intersect()
1295
+ # path1_obj = Path(path1_str).intersect(path2_str)
1296
+ # # Path.unit_tangent()
1297
+ # self.设置属性值("原生path", path1_obj.d())
1298
+ # return self
1299
+ #
1300
+ # def 路径差集(self, 路径):
1301
+ # if 路径 == self:
1302
+ # return self
1303
+ # from svgpathtools import Path
1304
+ # raise NotImplementedError("暂不支持路径差集")
1305
+ #
1306
+ # return self
1307
+
1308
+ # def 路径并集(self):
1309
+ # from svgpathtools import *
1310
+ # pass
1311
+
1312
+ def 平滑路径(self, 最大关节大小=3, 紧致度=1.99, 忽略无法修正的弯曲=False):
1313
+ 平滑路径参数 = {
1314
+ "maxjointsize": 最大关节大小,
1315
+ "tightness": 紧致度,
1316
+ "ignore_unfixable_kinks": 忽略无法修正的弯曲
1317
+ }
1318
+ self.设置属性值("平滑路径", 平滑路径参数)
1319
+
1320
+ def _get_path(self):
1321
+ P = self.获取属性值
1322
+ 原生path = P("原生path", None)
1323
+ if 原生path is None:
1324
+ 点列表 = P("点列表")
1325
+ 点列表 = 神笔绘图板工具.转SVG绘制路径命令(点列表)
1326
+ # d_list = 神笔绘图板工具.点列表转SVG路径(点列表)
1327
+ path = " ".join(神笔绘图板工具.点列表转SVG路径(点列表))
1328
+ else:
1329
+ path = 原生path
1330
+ return path
1331
+
1332
+ def _conv_svgpathtools(self):
1333
+ from svgpathtools import parse_path
1334
+ path = self._get_path()
1335
+ path_alt = parse_path(path)
1336
+ return path_alt
1337
+
1338
+ def 获取边界框(self, 新版本=True):
1339
+ path_alt = self._conv_svgpathtools()
1340
+ if 新版本:
1341
+ try:
1342
+ xmin, xmax, ymin, ymax = path_alt.bbox()
1343
+ return xmin, xmax, ymin, ymax
1344
+ except:
1345
+ return self.获取路径点列表范围()
1346
+ else:
1347
+ return self.获取路径点列表范围()
1348
+
1349
+ def 获取线段点坐标(self, 线段索引, 位置):
1350
+ """
1351
+ 获取路径上指定线段的指定位置的坐标
1352
+ @param 线段索引:
1353
+ @param 位置:
1354
+ @return:
1355
+ """
1356
+ path_alt = self._conv_svgpathtools()
1357
+ segment = path_alt[线段索引]
1358
+ if 位置 == 0:
1359
+ pt = segment.start
1360
+ elif 位置 == 1:
1361
+ pt = segment.end
1362
+ elif 位置 > 0 and 位置 < 1:
1363
+ pt = segment.point(位置)
1364
+ return pt.real, pt.imag
1365
+
1366
+ def 获取路径点坐标(self, 位置):
1367
+ """
1368
+ 获取路径上指定位置的坐标
1369
+ @param 位置:
1370
+ @return:
1371
+ """
1372
+ path_alt = self._conv_svgpathtools()
1373
+ if 位置 == 0:
1374
+ pt = path_alt.start
1375
+ elif 位置 == 1:
1376
+ pt = path_alt.end
1377
+ elif 位置 > 0 and 位置 < 1:
1378
+ pt = path_alt.point(位置)
1379
+ return pt.real, pt.imag
1380
+
1381
+ def 获取路径d(self):
1382
+ import svgpathtools
1383
+ P = self.获取属性值
1384
+ 原生path = P("原生path", None)
1385
+ if 原生path is not None:
1386
+ return svgpathtools.Path(原生path).d()
1387
+
1388
+ 点列表 = P("点列表")
1389
+ if len(点列表) == 0:
1390
+ return "M0,0 L0,0 z"
1391
+ 点列表 = 神笔绘图板工具.转SVG绘制路径命令(点列表)
1392
+ d_list = 神笔绘图板工具.点列表转SVG路径(点列表)
1393
+ return " ".join(d_list)
1394
+
1395
+ def 位置坐标_old(self, 位置比, 段索引=-1):
1396
+ import svgpathtools
1397
+ d = self.获取路径d()
1398
+ path = svgpathtools.Path(d)
1399
+ if isinstance(位置比, list) or isinstance(位置比, tuple):
1400
+ if 段索引 >= 0:
1401
+ pos = [path[段索引].point(p) for p in 位置比]
1402
+ else:
1403
+ pos = [path.point(p) for p in 位置比]
1404
+ return [(pt.real, pt.imag) for pt in pos]
1405
+ if 段索引 >= 0:
1406
+ point = path[段索引].point(位置比)
1407
+ else:
1408
+ point = path.point(位置比)
1409
+ return point.real, point.imag
1410
+
1411
+ def _计算两点距离(self, p1, p2):
1412
+ """计算两个复数坐标点之间的欧氏距离"""
1413
+ dx = p2.real - p1.real
1414
+ dy = p2.imag - p1.imag
1415
+ return math.hypot(dx, dy)
1416
+
1417
+ def 路径高密度采样(self, path, 采样精度=1000):
1418
+ """
1419
+ 对路径进行高密度采样,返回采样点列表和累计弧长列表
1420
+ :param path: svgpathtools.Path对象
1421
+ :return: (采样点坐标列表, 累计弧长列表)
1422
+ """
1423
+ from svgpathtools import Line, CubicBezier, QuadraticBezier, Arc
1424
+ 采样点列表 = []
1425
+ 累计弧长列表 = [0.0] # 第一个点弧长为0
1426
+ # self.采样精度 = 1000 # 采样点数量,值越大精度越高(1000足够日常使用)
1427
+ 总采样数 = 采样精度
1428
+
1429
+ # 1. 遍历每个路径段,按段长比例分配采样点(保证采样均匀)
1430
+ 各段长度 = []
1431
+ for seg in path:
1432
+ if isinstance(seg, (Line, CubicBezier, QuadraticBezier, Arc)):
1433
+ 各段长度.append(seg.length())
1434
+ else:
1435
+ 各段长度.append(0.0)
1436
+ 总长度 = sum(各段长度)
1437
+
1438
+ if 总长度 == 0:
1439
+ # 空路径返回第一个点
1440
+ if len(path) > 0:
1441
+ first_point = path[0].point(0.0)
1442
+ 采样点列表.append((first_point.real, first_point.imag))
1443
+ return 采样点列表, 累计弧长列表
1444
+
1445
+ # 2. 对每个段分配采样点并采样
1446
+ 累计长度 = 0.0
1447
+ for 段索引, seg in enumerate(path):
1448
+ 段长度 = 各段长度[段索引]
1449
+ if 段长度 == 0:
1450
+ continue
1451
+
1452
+ # 按段长比例分配采样点数量
1453
+ 段采样数 = max(2, int(总采样数 * (段长度 / 总长度)))
1454
+ 段采样点 = []
1455
+
1456
+ # 对当前段进行均匀采样(t从0到1)
1457
+ for i in range(段采样数):
1458
+ t = i / (段采样数 - 1)
1459
+ point = seg.point(t)
1460
+ 段采样点.append((point.real, point.imag))
1461
+
1462
+ # 计算当前段内的累计弧长并合并到总列表
1463
+ for i in range(1, len(段采样点)):
1464
+ 距离 = self._计算两点距离(
1465
+ complex(*段采样点[i - 1]),
1466
+ complex(*段采样点[i])
1467
+ )
1468
+ 累计长度 += 距离
1469
+ 累计弧长列表.append(累计长度)
1470
+
1471
+ # 合并采样点(避免重复添加第一个点)
1472
+ if 采样点列表:
1473
+ 采样点列表.extend(段采样点[1:])
1474
+ else:
1475
+ 采样点列表.extend(段采样点)
1476
+
1477
+ return 采样点列表, 累计弧长列表
1478
+
1479
+ def 按弧长插值找坐标(self, 采样点列表, 累计弧长列表, 目标比例):
1480
+ """
1481
+ 根据采样点和累计弧长,插值计算目标比例的坐标
1482
+ :param 采样点列表: 路径采样点坐标[(x1,y1), (x2,y2), ...]
1483
+ :param 累计弧长列表: 对应采样点的累计弧长[0, l1, l2, ...]
1484
+ :param 目标比例: 0~1的浮点数
1485
+ :return: (x, y) 坐标
1486
+ """
1487
+ if not 采样点列表 or len(累计弧长列表) < 2:
1488
+ return (0.0, 0.0) if not 采样点列表 else 采样点列表[0]
1489
+
1490
+ 总弧长 = 累计弧长列表[-1]
1491
+ if 总弧长 == 0:
1492
+ return 采样点列表[0]
1493
+
1494
+ # 计算目标弧长
1495
+ 目标弧长 = 总弧长 * 目标比例
1496
+
1497
+ # 边界情况:比例超过1或小于0
1498
+ if 目标弧长 <= 0:
1499
+ return 采样点列表[0]
1500
+ if 目标弧长 >= 总弧长:
1501
+ return 采样点列表[-1]
1502
+
1503
+ # 找到目标弧长所在的区间
1504
+ for i in range(1, len(累计弧长列表)):
1505
+ if 累计弧长列表[i] >= 目标弧长:
1506
+ # 找到前后两个点
1507
+ 前弧长 = 累计弧长列表[i - 1]
1508
+ 后弧长 = 累计弧长列表[i]
1509
+ 前点 = 采样点列表[i - 1]
1510
+ 后点 = 采样点列表[i]
1511
+
1512
+ # 计算插值比例
1513
+ 插值比例 = (目标弧长 - 前弧长) / (后弧长 - 前弧长)
1514
+
1515
+ # 线性插值计算坐标
1516
+ x = 前点[0] + 插值比例 * (后点[0] - 前点[0])
1517
+ y = 前点[1] + 插值比例 * (后点[1] - 前点[1])
1518
+ return (x, y)
1519
+
1520
+ return 采样点列表[-1]
1521
+
1522
+ def 位置坐标(self, 位置比, 段索引=-1, 采样精度=1000):
1523
+ """
1524
+ 最终优化版:高密度采样+线性插值,获取路径上准确的坐标
1525
+ :param 位置比: 0~1的浮点数,或列表/元组(多个比例)
1526
+ :param 段索引: 指定路径段(-1表示整个路径)
1527
+ :return: 坐标(x,y)或坐标列表
1528
+ """
1529
+ import svgpathtools
1530
+ from svgpathtools.path import Path
1531
+ d = self.获取路径d()
1532
+ path = svgpathtools.Path(d)
1533
+
1534
+ # 处理指定单段的情况
1535
+ if 段索引 >= 0 and 段索引 < len(path):
1536
+ 单段路径 = Path(path[段索引])
1537
+ 采样点, 累计弧长 = self.路径高密度采样(单段路径, 采样精度=采样精度)
1538
+ else:
1539
+ 采样点, 累计弧长 = self.路径高密度采样(path, 采样精度=采样精度)
1540
+
1541
+ # 处理多个位置比
1542
+ if isinstance(位置比, (list, tuple)):
1543
+ return [self.按弧长插值找坐标(采样点, 累计弧长, p) for p in 位置比]
1544
+
1545
+ # 处理单个位置比
1546
+ return self.按弧长插值找坐标(采样点, 累计弧长, 位置比)
1547
+
1548
+ def 构建SVG元素(self):
1549
+ from svgpathtools.path import scale, translate, rotate
1550
+ import svgpathtools
1551
+ path_d = self.获取路径d()
1552
+ P = self.获取属性值
1553
+ 缩放列表 = P("坐标缩放", None)
1554
+ if 缩放列表 is not None:
1555
+ path_ = svgpathtools.Path(path_d)
1556
+ for 缩放 in 缩放列表:
1557
+ 缩放X, 缩放Y, 缩放中心点 = 缩放
1558
+ path_ = scale(path_, 缩放X, 缩放Y, 缩放中心点)
1559
+ path_d = path_.d()
1560
+
1561
+ 平移列表 = P("坐标平移", None)
1562
+ if 平移列表 is not None:
1563
+ path_ = svgpathtools.Path(path_d)
1564
+ for 平移 in 平移列表:
1565
+ 平移X, 平移Y = 平移
1566
+ path_ = translate(path_, complex(平移X, 平移Y))
1567
+ # path_d = translate(svgpathtools.Path(path_d), complex(平移X, 平移Y)).d()
1568
+ path_d = path_.d()
1569
+
1570
+ 旋转列表 = P("坐标旋转", None)
1571
+ if 旋转列表 is not None:
1572
+ path_ = svgpathtools.Path(path_d)
1573
+ for 旋转 in 旋转列表:
1574
+ 旋转角度, 旋转中心点 = 旋转
1575
+ path_ = rotate(path_, 旋转角度, 旋转中心点)
1576
+ # path
1577
+ path_d = path_.d()
1578
+ # 旋转角度, 旋转中心点 = 旋转
1579
+ # if 旋转中心点 is not None:
1580
+ # path_d = rotate(svgpathtools.Path(path_d), 旋转角度, 旋转中心点).d()
1581
+ # else:
1582
+ # path_d = rotate(svgpathtools.Path(path_d), 旋转角度).d()
1583
+ # 路径偏移 = P("路径偏移", None)
1584
+ # if 路径偏移 is not None:
1585
+ # import svgpathtools
1586
+ # path_ = svgpathtools.Path(path_d)
1587
+ # path_ = self._offset_curve(path_, 路径偏移)
1588
+ # path_d = path_.d()
1589
+
1590
+ if P("闭合", 否):
1591
+ path_d += 'Z'
1592
+
1593
+ path = self.dwg.path(d=path_d,
1594
+ shape_rendering='auto',
1595
+ id=self.获取元素id(t="p"))
1596
+
1597
+ 样式可修改元素.属性修改处理(self, path)
1598
+ 可变换元素.属性修改处理(self, path)
1599
+ return path
1600
+
1601
+ def _offset_curve(self, path, offset_distance, steps=1000):
1602
+ """Takes in a Path object, `path`, and a distance,
1603
+ `offset_distance`, and outputs an piecewise-linear approximation
1604
+ of the 'parallel' offset curve."""
1605
+ from svgpathtools import parse_path, Line, Path, wsvg
1606
+ nls = []
1607
+ for seg in path:
1608
+ ct = 1
1609
+ for k in range(steps):
1610
+ t = k / steps
1611
+ offset_vector = offset_distance * seg.normal(t)
1612
+ nl = Line(seg.point(t), seg.point(t) + offset_vector)
1613
+ nls.append(nl)
1614
+ connect_the_dots = [Line(nls[k].end, nls[k + 1].end) for k in range(len(nls) - 1)]
1615
+ if path.isclosed():
1616
+ connect_the_dots.append(Line(nls[-1].end, nls[0].end))
1617
+ offset_path = Path(*connect_the_dots)
1618
+ return offset_path
1619
+
1620
+ def _坐标缩放(self, 缩放X, 缩放Y=None, 缩放中心点=None):
1621
+ from svgpathtools.path import scale
1622
+ if 缩放Y is None:
1623
+ 缩放Y = 缩放X
1624
+ path = self._conv_svgpathtools()
1625
+ if 缩放中心点 is None:
1626
+ 缩放中心点 = 0j
1627
+ path = scale(path, 缩放X, 缩放Y, 缩放中心点)
1628
+ self.元素属性["原生path"] = path.d()
1629
+ return self
1630
+
1631
+ def _坐标平移(self, 位移X, 位移Y=None):
1632
+ from svgpathtools.path import translate
1633
+ if 位移Y is None:
1634
+ 位移Y = 位移X
1635
+ path = self._conv_svgpathtools()
1636
+ path = translate(path, complex(位移X, 位移Y))
1637
+ self.元素属性["原生path"] = path.d()
1638
+ return self
1639
+
1640
+ def _坐标旋转(self, 旋转角度, 旋转中心点=None):
1641
+ from svgpathtools.path import rotate
1642
+ path = self._conv_svgpathtools()
1643
+ if 旋转中心点 is not None:
1644
+ 旋转中心点 = complex(旋转中心点[0], 旋转中心点[1])
1645
+ path = rotate(path, 旋转角度, 旋转中心点)
1646
+ self.元素属性["原生path"] = path.d()
1647
+ return self
1648
+
1649
+ def 复制(self) -> "路径元素":
1650
+ 路径_ = 路径元素(self.高清图, self.高清图.默认组)
1651
+ for p in self.元素属性:
1652
+ 路径_.设置属性值(p, self.元素属性[p])
1653
+ return 路径_
1654
+
1655
+ def _构建SVG元素_delete(self):
1656
+ P = self.获取属性值
1657
+ C = self.获取颜色值
1658
+
1659
+ 原生path = P("原生path", None)
1660
+ if 原生path is None:
1661
+ 点列表 = P("点列表")
1662
+ 点列表 = 神笔绘图板工具.转SVG绘制路径命令(点列表)
1663
+
1664
+ if len(点列表) == 0:
1665
+ path = self.dwg.path(d="M0,0 L0,0 z",
1666
+ shape_rendering='auto',
1667
+ id=self.获取元素id(t="p"))
1668
+
1669
+ 样式可修改元素.属性修改处理(self, path)
1670
+ 可变换元素.属性修改处理(self, path)
1671
+ return path
1672
+
1673
+ fp = 点列表[0]
1674
+ if fp[0] in ["M", "m"]:
1675
+ t, x, y = fp
1676
+ elif len(fp) == 2:
1677
+ t, x, y = "M", fp[0], fp[1]
1678
+ else:
1679
+ t, x, y = "M", 0, 0
1680
+ 点列表 = [(t, x, y)] + 点列表
1681
+
1682
+ path = self.dwg.path(d="{}{:.2f},{:.2f} ".format(t, float(x), float(y)),
1683
+ shape_rendering='auto',
1684
+ id=self.获取元素id(t="p"))
1685
+
1686
+ d_list = 神笔绘图板工具.点列表转SVG路径(点列表)
1687
+
1688
+ for di in d_list[1:]:
1689
+ if di[0] == "z":
1690
+ path.push('Z')
1691
+ continue
1692
+ path.push(di)
1693
+
1694
+ if P("闭合", 否):
1695
+ path.push('Z')
1696
+
1697
+ from svgpathtools import parse_path
1698
+ path_d_str = " ".join(path.commands)
1699
+ path_d = parse_path(path_d_str)
1700
+ path = self.dwg.path(d=path_d,
1701
+ shape_rendering='auto',
1702
+ id=self.获取元素id(t="p"))
1703
+
1704
+ else:
1705
+ from svgpathtools import parse_path
1706
+ 原生path = parse_path(原生path).d()
1707
+ path = self.dwg.path(d=原生path,
1708
+ shape_rendering='auto',
1709
+ id=self.获取元素id(t="p"))
1710
+
1711
+ 样式可修改元素.属性修改处理(self, path)
1712
+ 可变换元素.属性修改处理(self, path)
1713
+
1714
+ return path
1715
+
1716
+
1717
+ def 路径合并测试():
1718
+ from 神笔码靓.神笔库 import 神笔绘图板
1719
+
1720
+ 神笔 = 神笔绘图板(作品文件路径="路径合并.svg")
1721
+ y = 神笔.高 / 2
1722
+ 圆 = 神笔.符号.圆(中心点=(神笔.宽 / 2, y + 2), 半径=6)
1723
+ 神笔.符号.叉(中心点=(神笔.宽 / 2, y + 18), 线长=12).合并路径(圆, 是).落笔(100, 100). \
1724
+ 画直线(50, 50).画水平线(200).画垂直线(300).平滑的二次贝塞尔曲线((100, 100)).平滑的二次贝塞尔曲线((90, 200))
1725
+ 神笔.完成()
1726
+
1727
+
1728
+ def 偏转直行():
1729
+ from 神笔码靓.神笔库 import 神笔绘图板
1730
+ 神笔 = 神笔绘图板(作品文件路径="偏转直行.svg")
1731
+ 路径 = 神笔.路径(id_="路径").移动到(300, 100).画垂直线(200).画直线(400, 200).画垂直线(400).画水平线(100).画直线(300,
1732
+ 300)
1733
+ for i in range(10):
1734
+ 路径.右转直线(90, 20).左转直线(90, 20)
1735
+
1736
+ 路径.画垂直线(100).右转直线(45, 20).左转直线(45, 20).画直线(100, 500) # .画圆((0,0),100)
1737
+
1738
+ for i in range(10):
1739
+ 路径.右转直线(-140, 20).左转直线(-140, 20)
1740
+
1741
+ 路径.新描边样式("3,3", id_="新路径").画直线(100, 100).寻找路径(id_="路径").画直线(0, 0)
1742
+ 神笔.完成()
1743
+
1744
+
1745
+ def 偏转直行画放射线():
1746
+ from 神笔码靓.神笔库 import 神笔绘图板
1747
+ 神笔 = 神笔绘图板(作品文件路径="偏转直行画放射线.svg")
1748
+ 路径 = 神笔.路径(id_="路径")
1749
+
1750
+ for i in range(0, 180):
1751
+ 路径 = 路径.新路径().描边宽度(0.5).移动到(300, 300).右转直线(i * 2, 50).描边颜色(颜色.随机色()). \
1752
+ 右转直线(10, 10).右转直线(-10, 10)
1753
+ 神笔.完成()
1754
+
1755
+
1756
+ def 综合测试():
1757
+ from 神笔码靓.神笔库 import 神笔绘图板
1758
+ 绘图板 = 神笔绘图板(作品文件路径="路径综合测试.svg")
1759
+ A = (100, 200)
1760
+ B = (400, 200)
1761
+ 绘图板.路径().点辅助开关(开).移动到(A).画直线(B).点辅助(开启=否).平滑曲线(终点控制点=(110, 90),
1762
+ 终点=(110, 220)).前进直线(100).点辅助(
1763
+ 开启=是) \
1764
+ .画垂直线(400).点辅助(开启=是).画曲线(开始控制点=(110, 500), 终点控制点=(32, 500), 终点=(45, 600)).点辅助(
1765
+ 开启=是).前进直线(20).点辅助(开启=是) \
1766
+ .二次贝塞尔曲线(曲线控制点=(100, 800), 终点=(200, 500)).点辅助(开启=是) \
1767
+ .平滑的二次贝塞尔曲线(终点=(300, 200)).点辅助(开启=是).平滑的二次贝塞尔曲线(终点=(320, 180)).点辅助(开启=是) \
1768
+ .右转直线(6, 120).点辅助(开启=是).画圆弧(3, (450, 104), 圆弧方向=1).前进直线(20)
1769
+ 绘图板.完成()
1770
+
1771
+
1772
+ def 画圆弧求斜率测试():
1773
+ from 神笔码靓.神笔库 import 神笔绘图板
1774
+ 绘图板 = 神笔绘图板(作品文件路径="画圆弧求斜率测试.svg")
1775
+ A = (100, 200)
1776
+ B = (400, 200)
1777
+ 绘图板.路径().点辅助开关(开).移动到(A).画直线(B).画圆弧(200, (400, 400), 圆弧方向=0).前进直线(150)
1778
+
1779
+ 绘图板.完成()
1780
+
1781
+
1782
+ if __name__ == '__main__':
1783
+ # 路径合并测试()
1784
+ # 偏转直行()
1785
+ # 综合测试()
1786
+ 画圆弧求斜率测试()