diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..4bdb6ff5 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 731d6a64095622abcf804ab3c237209d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..7582b511 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +docs.unicontsoft.com \ No newline at end of file diff --git a/_images/20240219-cliconfig.png b/_images/20240219-cliconfig.png new file mode 100644 index 00000000..37ca2c53 Binary files /dev/null and b/_images/20240219-cliconfig.png differ diff --git a/_images/20240311-dimensions1.png b/_images/20240311-dimensions1.png new file mode 100644 index 00000000..3f8bd316 Binary files /dev/null and b/_images/20240311-dimensions1.png differ diff --git a/_images/20240311-dimensions2.png b/_images/20240311-dimensions2.png new file mode 100644 index 00000000..e3954d53 Binary files /dev/null and b/_images/20240311-dimensions2.png differ diff --git a/_images/20240321-def-vat1.png b/_images/20240321-def-vat1.png new file mode 100644 index 00000000..04197059 Binary files /dev/null and b/_images/20240321-def-vat1.png differ diff --git a/_images/20240321-def-vat2.png b/_images/20240321-def-vat2.png new file mode 100644 index 00000000..81099f48 Binary files /dev/null and b/_images/20240321-def-vat2.png differ diff --git a/_images/20240321-def-vat3.png b/_images/20240321-def-vat3.png new file mode 100644 index 00000000..f3103f7d Binary files /dev/null and b/_images/20240321-def-vat3.png differ diff --git a/_images/20240321-def-vat4.png b/_images/20240321-def-vat4.png new file mode 100644 index 00000000..90c152e2 Binary files /dev/null and b/_images/20240321-def-vat4.png differ diff --git a/_images/20240321-def-vat5.png b/_images/20240321-def-vat5.png new file mode 100644 index 00000000..d0b738b8 Binary files /dev/null and b/_images/20240321-def-vat5.png differ diff --git a/_images/20240321-def-vat6.png b/_images/20240321-def-vat6.png new file mode 100644 index 00000000..d98ac842 Binary files /dev/null and b/_images/20240321-def-vat6.png differ diff --git a/_images/20240321-def-vat7.png b/_images/20240321-def-vat7.png new file mode 100644 index 00000000..0a33d01f Binary files /dev/null and b/_images/20240321-def-vat7.png differ diff --git a/_images/20240321-def-vat8.png b/_images/20240321-def-vat8.png new file mode 100644 index 00000000..a165a9e7 Binary files /dev/null and b/_images/20240321-def-vat8.png differ diff --git a/_images/20240327-deferred-and-future-expenses1.png b/_images/20240327-deferred-and-future-expenses1.png new file mode 100644 index 00000000..f64f50a0 Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses1.png differ diff --git a/_images/20240327-deferred-and-future-expenses10.png b/_images/20240327-deferred-and-future-expenses10.png new file mode 100644 index 00000000..f2872a8c Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses10.png differ diff --git a/_images/20240327-deferred-and-future-expenses2.png b/_images/20240327-deferred-and-future-expenses2.png new file mode 100644 index 00000000..1ff76351 Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses2.png differ diff --git a/_images/20240327-deferred-and-future-expenses3.png b/_images/20240327-deferred-and-future-expenses3.png new file mode 100644 index 00000000..f79ebd86 Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses3.png differ diff --git a/_images/20240327-deferred-and-future-expenses4.png b/_images/20240327-deferred-and-future-expenses4.png new file mode 100644 index 00000000..aef5c7e4 Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses4.png differ diff --git a/_images/20240327-deferred-and-future-expenses5.png b/_images/20240327-deferred-and-future-expenses5.png new file mode 100644 index 00000000..2b44cf9f Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses5.png differ diff --git a/_images/20240327-deferred-and-future-expenses6.png b/_images/20240327-deferred-and-future-expenses6.png new file mode 100644 index 00000000..79868400 Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses6.png differ diff --git a/_images/20240327-deferred-and-future-expenses7.png b/_images/20240327-deferred-and-future-expenses7.png new file mode 100644 index 00000000..63200df2 Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses7.png differ diff --git a/_images/20240327-deferred-and-future-expenses8.png b/_images/20240327-deferred-and-future-expenses8.png new file mode 100644 index 00000000..34e71881 Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses8.png differ diff --git a/_images/20240327-deferred-and-future-expenses9.png b/_images/20240327-deferred-and-future-expenses9.png new file mode 100644 index 00000000..5b6ecb0d Binary files /dev/null and b/_images/20240327-deferred-and-future-expenses9.png differ diff --git a/_images/20240327-deferred-and-future-incomes1.png b/_images/20240327-deferred-and-future-incomes1.png new file mode 100644 index 00000000..9ed13037 Binary files /dev/null and b/_images/20240327-deferred-and-future-incomes1.png differ diff --git a/_images/20240327-deferred-and-future-incomes2.png b/_images/20240327-deferred-and-future-incomes2.png new file mode 100644 index 00000000..585fca87 Binary files /dev/null and b/_images/20240327-deferred-and-future-incomes2.png differ diff --git a/_images/20240327-deferred-and-future-incomes3.png b/_images/20240327-deferred-and-future-incomes3.png new file mode 100644 index 00000000..df17f2a7 Binary files /dev/null and b/_images/20240327-deferred-and-future-incomes3.png differ diff --git a/_images/20240327-deferred-and-future-incomes4.png b/_images/20240327-deferred-and-future-incomes4.png new file mode 100644 index 00000000..19a59c16 Binary files /dev/null and b/_images/20240327-deferred-and-future-incomes4.png differ diff --git a/_images/20240327-deferred-and-future-incomes5.png b/_images/20240327-deferred-and-future-incomes5.png new file mode 100644 index 00000000..0a9353bf Binary files /dev/null and b/_images/20240327-deferred-and-future-incomes5.png differ diff --git a/_images/20240327-deferred-and-future-incomes6.png b/_images/20240327-deferred-and-future-incomes6.png new file mode 100644 index 00000000..ced7d609 Binary files /dev/null and b/_images/20240327-deferred-and-future-incomes6.png differ diff --git a/_images/20240331-correction-doc1.png b/_images/20240331-correction-doc1.png new file mode 100644 index 00000000..100f8b63 Binary files /dev/null and b/_images/20240331-correction-doc1.png differ diff --git a/_images/20240331-correction-doc2.png b/_images/20240331-correction-doc2.png new file mode 100644 index 00000000..b5b7cae8 Binary files /dev/null and b/_images/20240331-correction-doc2.png differ diff --git a/_images/20240331-correction-doc3.png b/_images/20240331-correction-doc3.png new file mode 100644 index 00000000..cd6c434d Binary files /dev/null and b/_images/20240331-correction-doc3.png differ diff --git a/_images/20240331-correction-doc4.png b/_images/20240331-correction-doc4.png new file mode 100644 index 00000000..dc3905c8 Binary files /dev/null and b/_images/20240331-correction-doc4.png differ diff --git a/_images/20240331-correction-doc5.png b/_images/20240331-correction-doc5.png new file mode 100644 index 00000000..a7488462 Binary files /dev/null and b/_images/20240331-correction-doc5.png differ diff --git a/_images/20240411-allocate-acquisition-costs1.png b/_images/20240411-allocate-acquisition-costs1.png new file mode 100644 index 00000000..aecb5f34 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs1.png differ diff --git a/_images/20240411-allocate-acquisition-costs10.png b/_images/20240411-allocate-acquisition-costs10.png new file mode 100644 index 00000000..898cfd59 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs10.png differ diff --git a/_images/20240411-allocate-acquisition-costs11.png b/_images/20240411-allocate-acquisition-costs11.png new file mode 100644 index 00000000..8cda50e0 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs11.png differ diff --git a/_images/20240411-allocate-acquisition-costs12.png b/_images/20240411-allocate-acquisition-costs12.png new file mode 100644 index 00000000..b88305a8 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs12.png differ diff --git a/_images/20240411-allocate-acquisition-costs13.png b/_images/20240411-allocate-acquisition-costs13.png new file mode 100644 index 00000000..e94bc6e6 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs13.png differ diff --git a/_images/20240411-allocate-acquisition-costs14.png b/_images/20240411-allocate-acquisition-costs14.png new file mode 100644 index 00000000..245d5646 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs14.png differ diff --git a/_images/20240411-allocate-acquisition-costs15.png b/_images/20240411-allocate-acquisition-costs15.png new file mode 100644 index 00000000..6d2db9e3 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs15.png differ diff --git a/_images/20240411-allocate-acquisition-costs16.png b/_images/20240411-allocate-acquisition-costs16.png new file mode 100644 index 00000000..ff05e810 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs16.png differ diff --git a/_images/20240411-allocate-acquisition-costs17.png b/_images/20240411-allocate-acquisition-costs17.png new file mode 100644 index 00000000..b98459cb Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs17.png differ diff --git a/_images/20240411-allocate-acquisition-costs2.png b/_images/20240411-allocate-acquisition-costs2.png new file mode 100644 index 00000000..aeaed666 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs2.png differ diff --git a/_images/20240411-allocate-acquisition-costs3.png b/_images/20240411-allocate-acquisition-costs3.png new file mode 100644 index 00000000..864c9474 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs3.png differ diff --git a/_images/20240411-allocate-acquisition-costs4.png b/_images/20240411-allocate-acquisition-costs4.png new file mode 100644 index 00000000..a2f439b8 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs4.png differ diff --git a/_images/20240411-allocate-acquisition-costs5.png b/_images/20240411-allocate-acquisition-costs5.png new file mode 100644 index 00000000..174cf981 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs5.png differ diff --git a/_images/20240411-allocate-acquisition-costs6.png b/_images/20240411-allocate-acquisition-costs6.png new file mode 100644 index 00000000..4e1939f5 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs6.png differ diff --git a/_images/20240411-allocate-acquisition-costs7.png b/_images/20240411-allocate-acquisition-costs7.png new file mode 100644 index 00000000..64d7b121 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs7.png differ diff --git a/_images/20240411-allocate-acquisition-costs8.png b/_images/20240411-allocate-acquisition-costs8.png new file mode 100644 index 00000000..313706c4 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs8.png differ diff --git a/_images/20240411-allocate-acquisition-costs9.png b/_images/20240411-allocate-acquisition-costs9.png new file mode 100644 index 00000000..5c3c7e85 Binary files /dev/null and b/_images/20240411-allocate-acquisition-costs9.png differ diff --git a/_images/20240416-allocate-sales-costs1.png b/_images/20240416-allocate-sales-costs1.png new file mode 100644 index 00000000..b2ce7d78 Binary files /dev/null and b/_images/20240416-allocate-sales-costs1.png differ diff --git a/_images/20240416-allocate-sales-costs10.png b/_images/20240416-allocate-sales-costs10.png new file mode 100644 index 00000000..741519d4 Binary files /dev/null and b/_images/20240416-allocate-sales-costs10.png differ diff --git a/_images/20240416-allocate-sales-costs11.png b/_images/20240416-allocate-sales-costs11.png new file mode 100644 index 00000000..aac45573 Binary files /dev/null and b/_images/20240416-allocate-sales-costs11.png differ diff --git a/_images/20240416-allocate-sales-costs12.png b/_images/20240416-allocate-sales-costs12.png new file mode 100644 index 00000000..b9eba4f1 Binary files /dev/null and b/_images/20240416-allocate-sales-costs12.png differ diff --git a/_images/20240416-allocate-sales-costs13.png b/_images/20240416-allocate-sales-costs13.png new file mode 100644 index 00000000..6a248731 Binary files /dev/null and b/_images/20240416-allocate-sales-costs13.png differ diff --git a/_images/20240416-allocate-sales-costs14.png b/_images/20240416-allocate-sales-costs14.png new file mode 100644 index 00000000..2730246d Binary files /dev/null and b/_images/20240416-allocate-sales-costs14.png differ diff --git a/_images/20240416-allocate-sales-costs15.png b/_images/20240416-allocate-sales-costs15.png new file mode 100644 index 00000000..d9d82955 Binary files /dev/null and b/_images/20240416-allocate-sales-costs15.png differ diff --git a/_images/20240416-allocate-sales-costs2.png b/_images/20240416-allocate-sales-costs2.png new file mode 100644 index 00000000..f9be790c Binary files /dev/null and b/_images/20240416-allocate-sales-costs2.png differ diff --git a/_images/20240416-allocate-sales-costs3.png b/_images/20240416-allocate-sales-costs3.png new file mode 100644 index 00000000..5007b9ad Binary files /dev/null and b/_images/20240416-allocate-sales-costs3.png differ diff --git a/_images/20240416-allocate-sales-costs4.png b/_images/20240416-allocate-sales-costs4.png new file mode 100644 index 00000000..328edfb9 Binary files /dev/null and b/_images/20240416-allocate-sales-costs4.png differ diff --git a/_images/20240416-allocate-sales-costs5.png b/_images/20240416-allocate-sales-costs5.png new file mode 100644 index 00000000..70088d48 Binary files /dev/null and b/_images/20240416-allocate-sales-costs5.png differ diff --git a/_images/20240416-allocate-sales-costs6.png b/_images/20240416-allocate-sales-costs6.png new file mode 100644 index 00000000..c5a8af11 Binary files /dev/null and b/_images/20240416-allocate-sales-costs6.png differ diff --git a/_images/20240416-allocate-sales-costs7.png b/_images/20240416-allocate-sales-costs7.png new file mode 100644 index 00000000..b1eebc8d Binary files /dev/null and b/_images/20240416-allocate-sales-costs7.png differ diff --git a/_images/20240416-allocate-sales-costs8.png b/_images/20240416-allocate-sales-costs8.png new file mode 100644 index 00000000..a785fa90 Binary files /dev/null and b/_images/20240416-allocate-sales-costs8.png differ diff --git a/_images/20240416-allocate-sales-costs9.png b/_images/20240416-allocate-sales-costs9.png new file mode 100644 index 00000000..b9be561d Binary files /dev/null and b/_images/20240416-allocate-sales-costs9.png differ diff --git a/_images/20240423-fixed-assets1.png b/_images/20240423-fixed-assets1.png new file mode 100644 index 00000000..fbc9da0a Binary files /dev/null and b/_images/20240423-fixed-assets1.png differ diff --git a/_images/20240423-fixed-assets10.png b/_images/20240423-fixed-assets10.png new file mode 100644 index 00000000..8dc8f6b0 Binary files /dev/null and b/_images/20240423-fixed-assets10.png differ diff --git a/_images/20240423-fixed-assets11.png b/_images/20240423-fixed-assets11.png new file mode 100644 index 00000000..8ef49607 Binary files /dev/null and b/_images/20240423-fixed-assets11.png differ diff --git a/_images/20240423-fixed-assets12.png b/_images/20240423-fixed-assets12.png new file mode 100644 index 00000000..8470ad44 Binary files /dev/null and b/_images/20240423-fixed-assets12.png differ diff --git a/_images/20240423-fixed-assets13.png b/_images/20240423-fixed-assets13.png new file mode 100644 index 00000000..6bd050e5 Binary files /dev/null and b/_images/20240423-fixed-assets13.png differ diff --git a/_images/20240423-fixed-assets14.png b/_images/20240423-fixed-assets14.png new file mode 100644 index 00000000..09621fd0 Binary files /dev/null and b/_images/20240423-fixed-assets14.png differ diff --git a/_images/20240423-fixed-assets15.png b/_images/20240423-fixed-assets15.png new file mode 100644 index 00000000..561c6557 Binary files /dev/null and b/_images/20240423-fixed-assets15.png differ diff --git a/_images/20240423-fixed-assets16.png b/_images/20240423-fixed-assets16.png new file mode 100644 index 00000000..db625553 Binary files /dev/null and b/_images/20240423-fixed-assets16.png differ diff --git a/_images/20240423-fixed-assets17.png b/_images/20240423-fixed-assets17.png new file mode 100644 index 00000000..2245fd60 Binary files /dev/null and b/_images/20240423-fixed-assets17.png differ diff --git a/_images/20240423-fixed-assets2.png b/_images/20240423-fixed-assets2.png new file mode 100644 index 00000000..fac44dbb Binary files /dev/null and b/_images/20240423-fixed-assets2.png differ diff --git a/_images/20240423-fixed-assets3.png b/_images/20240423-fixed-assets3.png new file mode 100644 index 00000000..8db96700 Binary files /dev/null and b/_images/20240423-fixed-assets3.png differ diff --git a/_images/20240423-fixed-assets4.png b/_images/20240423-fixed-assets4.png new file mode 100644 index 00000000..cb08eabe Binary files /dev/null and b/_images/20240423-fixed-assets4.png differ diff --git a/_images/20240423-fixed-assets5.png b/_images/20240423-fixed-assets5.png new file mode 100644 index 00000000..e49c625a Binary files /dev/null and b/_images/20240423-fixed-assets5.png differ diff --git a/_images/20240423-fixed-assets6.png b/_images/20240423-fixed-assets6.png new file mode 100644 index 00000000..2a968414 Binary files /dev/null and b/_images/20240423-fixed-assets6.png differ diff --git a/_images/20240423-fixed-assets7.png b/_images/20240423-fixed-assets7.png new file mode 100644 index 00000000..74f8d1f2 Binary files /dev/null and b/_images/20240423-fixed-assets7.png differ diff --git a/_images/20240423-fixed-assets8.png b/_images/20240423-fixed-assets8.png new file mode 100644 index 00000000..1ceadfbe Binary files /dev/null and b/_images/20240423-fixed-assets8.png differ diff --git a/_images/20240423-fixed-assets9.png b/_images/20240423-fixed-assets9.png new file mode 100644 index 00000000..fe2ac65a Binary files /dev/null and b/_images/20240423-fixed-assets9.png differ diff --git a/_images/20240507-attached-files1.png b/_images/20240507-attached-files1.png new file mode 100644 index 00000000..9236beba Binary files /dev/null and b/_images/20240507-attached-files1.png differ diff --git a/_images/20240507-attached-files10.png b/_images/20240507-attached-files10.png new file mode 100644 index 00000000..6f34d00d Binary files /dev/null and b/_images/20240507-attached-files10.png differ diff --git a/_images/20240507-attached-files2.png b/_images/20240507-attached-files2.png new file mode 100644 index 00000000..10970856 Binary files /dev/null and b/_images/20240507-attached-files2.png differ diff --git a/_images/20240507-attached-files3.png b/_images/20240507-attached-files3.png new file mode 100644 index 00000000..e511e728 Binary files /dev/null and b/_images/20240507-attached-files3.png differ diff --git a/_images/20240507-attached-files4.png b/_images/20240507-attached-files4.png new file mode 100644 index 00000000..c63af141 Binary files /dev/null and b/_images/20240507-attached-files4.png differ diff --git a/_images/20240507-attached-files5.png b/_images/20240507-attached-files5.png new file mode 100644 index 00000000..9d8e54c4 Binary files /dev/null and b/_images/20240507-attached-files5.png differ diff --git a/_images/20240507-attached-files6.png b/_images/20240507-attached-files6.png new file mode 100644 index 00000000..50c4441d Binary files /dev/null and b/_images/20240507-attached-files6.png differ diff --git a/_images/20240507-attached-files7.png b/_images/20240507-attached-files7.png new file mode 100644 index 00000000..c567c0dc Binary files /dev/null and b/_images/20240507-attached-files7.png differ diff --git a/_images/20240507-attached-files8.png b/_images/20240507-attached-files8.png new file mode 100644 index 00000000..3586c906 Binary files /dev/null and b/_images/20240507-attached-files8.png differ diff --git a/_images/20240507-attached-files9.png b/_images/20240507-attached-files9.png new file mode 100644 index 00000000..29ddddfd Binary files /dev/null and b/_images/20240507-attached-files9.png differ diff --git a/_images/20240517-working-periods1.png b/_images/20240517-working-periods1.png new file mode 100644 index 00000000..96aa61b1 Binary files /dev/null and b/_images/20240517-working-periods1.png differ diff --git a/_images/20240517-working-periods2.png b/_images/20240517-working-periods2.png new file mode 100644 index 00000000..4b0177c7 Binary files /dev/null and b/_images/20240517-working-periods2.png differ diff --git a/_images/20240517-working-periods3.png b/_images/20240517-working-periods3.png new file mode 100644 index 00000000..26717f01 Binary files /dev/null and b/_images/20240517-working-periods3.png differ diff --git a/_images/20240517-working-periods4.png b/_images/20240517-working-periods4.png new file mode 100644 index 00000000..637f043e Binary files /dev/null and b/_images/20240517-working-periods4.png differ diff --git a/_images/20240517-working-periods5.png b/_images/20240517-working-periods5.png new file mode 100644 index 00000000..89e6a9e7 Binary files /dev/null and b/_images/20240517-working-periods5.png differ diff --git a/_images/20240517-working-periods6.png b/_images/20240517-working-periods6.png new file mode 100644 index 00000000..6e83227f Binary files /dev/null and b/_images/20240517-working-periods6.png differ diff --git a/_images/20240517-working-periods7.png b/_images/20240517-working-periods7.png new file mode 100644 index 00000000..7bfab1ad Binary files /dev/null and b/_images/20240517-working-periods7.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes1.png b/_images/20240522-price-lists-and-discount-schemes1.png new file mode 100644 index 00000000..54adbe55 Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes1.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes2.png b/_images/20240522-price-lists-and-discount-schemes2.png new file mode 100644 index 00000000..ad07b4d4 Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes2.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes3.png b/_images/20240522-price-lists-and-discount-schemes3.png new file mode 100644 index 00000000..30663412 Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes3.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes4.png b/_images/20240522-price-lists-and-discount-schemes4.png new file mode 100644 index 00000000..1c5ea3cc Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes4.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes5.png b/_images/20240522-price-lists-and-discount-schemes5.png new file mode 100644 index 00000000..ca68d09a Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes5.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes6.png b/_images/20240522-price-lists-and-discount-schemes6.png new file mode 100644 index 00000000..f282fe4c Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes6.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes7.png b/_images/20240522-price-lists-and-discount-schemes7.png new file mode 100644 index 00000000..55fd23b9 Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes7.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes8.png b/_images/20240522-price-lists-and-discount-schemes8.png new file mode 100644 index 00000000..a03625dd Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes8.png differ diff --git a/_images/20240522-price-lists-and-discount-schemes9.png b/_images/20240522-price-lists-and-discount-schemes9.png new file mode 100644 index 00000000..ffa80611 Binary files /dev/null and b/_images/20240522-price-lists-and-discount-schemes9.png differ diff --git a/_images/20240603-product-import1.png b/_images/20240603-product-import1.png new file mode 100644 index 00000000..a5a2d926 Binary files /dev/null and b/_images/20240603-product-import1.png differ diff --git a/_images/20240603-product-import2.png b/_images/20240603-product-import2.png new file mode 100644 index 00000000..9a5e0736 Binary files /dev/null and b/_images/20240603-product-import2.png differ diff --git a/_images/20240603-product-import3.png b/_images/20240603-product-import3.png new file mode 100644 index 00000000..acbbaef2 Binary files /dev/null and b/_images/20240603-product-import3.png differ diff --git a/_images/20240603-product-import4.png b/_images/20240603-product-import4.png new file mode 100644 index 00000000..6463bc65 Binary files /dev/null and b/_images/20240603-product-import4.png differ diff --git a/_images/20240603-product-import5.png b/_images/20240603-product-import5.png new file mode 100644 index 00000000..05130e74 Binary files /dev/null and b/_images/20240603-product-import5.png differ diff --git a/_images/20240603-product-import6.png b/_images/20240603-product-import6.png new file mode 100644 index 00000000..cb3e13e8 Binary files /dev/null and b/_images/20240603-product-import6.png differ diff --git a/_images/20240603-product-import7.png b/_images/20240603-product-import7.png new file mode 100644 index 00000000..b916c928 Binary files /dev/null and b/_images/20240603-product-import7.png differ diff --git a/_images/20241112-lists-configuration1.png b/_images/20241112-lists-configuration1.png new file mode 100644 index 00000000..50614b22 Binary files /dev/null and b/_images/20241112-lists-configuration1.png differ diff --git a/_images/20241112-lists-configuration10.png b/_images/20241112-lists-configuration10.png new file mode 100644 index 00000000..50e540ef Binary files /dev/null and b/_images/20241112-lists-configuration10.png differ diff --git a/_images/20241112-lists-configuration11.png b/_images/20241112-lists-configuration11.png new file mode 100644 index 00000000..5363c4f7 Binary files /dev/null and b/_images/20241112-lists-configuration11.png differ diff --git a/_images/20241112-lists-configuration12.png b/_images/20241112-lists-configuration12.png new file mode 100644 index 00000000..812f26bc Binary files /dev/null and b/_images/20241112-lists-configuration12.png differ diff --git a/_images/20241112-lists-configuration13.png b/_images/20241112-lists-configuration13.png new file mode 100644 index 00000000..a34a96b4 Binary files /dev/null and b/_images/20241112-lists-configuration13.png differ diff --git a/_images/20241112-lists-configuration14.png b/_images/20241112-lists-configuration14.png new file mode 100644 index 00000000..29ee1786 Binary files /dev/null and b/_images/20241112-lists-configuration14.png differ diff --git a/_images/20241112-lists-configuration2.png b/_images/20241112-lists-configuration2.png new file mode 100644 index 00000000..6465422f Binary files /dev/null and b/_images/20241112-lists-configuration2.png differ diff --git a/_images/20241112-lists-configuration3.png b/_images/20241112-lists-configuration3.png new file mode 100644 index 00000000..74d6785c Binary files /dev/null and b/_images/20241112-lists-configuration3.png differ diff --git a/_images/20241112-lists-configuration4.png b/_images/20241112-lists-configuration4.png new file mode 100644 index 00000000..453bf099 Binary files /dev/null and b/_images/20241112-lists-configuration4.png differ diff --git a/_images/20241112-lists-configuration5.png b/_images/20241112-lists-configuration5.png new file mode 100644 index 00000000..86833e6e Binary files /dev/null and b/_images/20241112-lists-configuration5.png differ diff --git a/_images/20241112-lists-configuration6.png b/_images/20241112-lists-configuration6.png new file mode 100644 index 00000000..0fc1f54c Binary files /dev/null and b/_images/20241112-lists-configuration6.png differ diff --git a/_images/20241112-lists-configuration7.png b/_images/20241112-lists-configuration7.png new file mode 100644 index 00000000..157f2866 Binary files /dev/null and b/_images/20241112-lists-configuration7.png differ diff --git a/_images/20241112-lists-configuration8.png b/_images/20241112-lists-configuration8.png new file mode 100644 index 00000000..bb09f5ba Binary files /dev/null and b/_images/20241112-lists-configuration8.png differ diff --git a/_images/20241112-lists-configuration9.png b/_images/20241112-lists-configuration9.png new file mode 100644 index 00000000..96c230c4 Binary files /dev/null and b/_images/20241112-lists-configuration9.png differ diff --git a/_images/20241121-bank-statement-import1.png b/_images/20241121-bank-statement-import1.png new file mode 100644 index 00000000..de410403 Binary files /dev/null and b/_images/20241121-bank-statement-import1.png differ diff --git a/_images/20241121-bank-statement-import2.png b/_images/20241121-bank-statement-import2.png new file mode 100644 index 00000000..4d13b004 Binary files /dev/null and b/_images/20241121-bank-statement-import2.png differ diff --git a/_images/20241121-bank-statement-import3.png b/_images/20241121-bank-statement-import3.png new file mode 100644 index 00000000..ff87bdbb Binary files /dev/null and b/_images/20241121-bank-statement-import3.png differ diff --git a/_images/20241121-bank-statement-import4.png b/_images/20241121-bank-statement-import4.png new file mode 100644 index 00000000..04c01e16 Binary files /dev/null and b/_images/20241121-bank-statement-import4.png differ diff --git a/_images/20241121-bank-statement-import5.png b/_images/20241121-bank-statement-import5.png new file mode 100644 index 00000000..41f5dcab Binary files /dev/null and b/_images/20241121-bank-statement-import5.png differ diff --git a/_images/20241121-bank-statement-import6.png b/_images/20241121-bank-statement-import6.png new file mode 100644 index 00000000..1e541db1 Binary files /dev/null and b/_images/20241121-bank-statement-import6.png differ diff --git a/_images/20241121-bank-statement-import7.png b/_images/20241121-bank-statement-import7.png new file mode 100644 index 00000000..0961e6ec Binary files /dev/null and b/_images/20241121-bank-statement-import7.png differ diff --git a/_images/901-chart-of-acc1.png b/_images/901-chart-of-acc1.png new file mode 100644 index 00000000..91aa9483 Binary files /dev/null and b/_images/901-chart-of-acc1.png differ diff --git a/_images/901-chart-of-acc2.png b/_images/901-chart-of-acc2.png new file mode 100644 index 00000000..83a045d7 Binary files /dev/null and b/_images/901-chart-of-acc2.png differ diff --git a/_images/901-image106.png b/_images/901-image106.png new file mode 100644 index 00000000..71248349 Binary files /dev/null and b/_images/901-image106.png differ diff --git a/_images/901-image25.png b/_images/901-image25.png new file mode 100644 index 00000000..5a4c7e4b Binary files /dev/null and b/_images/901-image25.png differ diff --git a/_images/901-image30.png b/_images/901-image30.png new file mode 100644 index 00000000..46010560 Binary files /dev/null and b/_images/901-image30.png differ diff --git a/_images/901-image38.png b/_images/901-image38.png new file mode 100644 index 00000000..48a97d91 Binary files /dev/null and b/_images/901-image38.png differ diff --git a/_images/901-image89.png b/_images/901-image89.png new file mode 100644 index 00000000..9fbd27ac Binary files /dev/null and b/_images/901-image89.png differ diff --git a/_images/901-image98.png b/_images/901-image98.png new file mode 100644 index 00000000..8d7907bb Binary files /dev/null and b/_images/901-image98.png differ diff --git a/_images/901-purchase-activate.png b/_images/901-purchase-activate.png new file mode 100644 index 00000000..a11303f6 Binary files /dev/null and b/_images/901-purchase-activate.png differ diff --git a/_images/901-users1.png b/_images/901-users1.png new file mode 100644 index 00000000..f54b3521 Binary files /dev/null and b/_images/901-users1.png differ diff --git a/_images/901-users2.png b/_images/901-users2.png new file mode 100644 index 00000000..c5d76e2a Binary files /dev/null and b/_images/901-users2.png differ diff --git a/_images/901-users3.png b/_images/901-users3.png new file mode 100644 index 00000000..46e22712 Binary files /dev/null and b/_images/901-users3.png differ diff --git a/_images/901-users4.png b/_images/901-users4.png new file mode 100644 index 00000000..7a63f73d Binary files /dev/null and b/_images/901-users4.png differ diff --git a/_images/901-users5.png b/_images/901-users5.png new file mode 100644 index 00000000..1acc0307 Binary files /dev/null and b/_images/901-users5.png differ diff --git a/_images/902-acc-wizard1.png b/_images/902-acc-wizard1.png new file mode 100644 index 00000000..8cc0ebb4 Binary files /dev/null and b/_images/902-acc-wizard1.png differ diff --git a/_images/902-contragent-form1.png b/_images/902-contragent-form1.png new file mode 100644 index 00000000..13a000bf Binary files /dev/null and b/_images/902-contragent-form1.png differ diff --git a/_images/902-image107.png b/_images/902-image107.png new file mode 100644 index 00000000..755622fe Binary files /dev/null and b/_images/902-image107.png differ diff --git a/_images/902-image26.png b/_images/902-image26.png new file mode 100644 index 00000000..0afceec9 Binary files /dev/null and b/_images/902-image26.png differ diff --git a/_images/902-image31.png b/_images/902-image31.png new file mode 100644 index 00000000..b7f45560 Binary files /dev/null and b/_images/902-image31.png differ diff --git a/_images/902-image39.png b/_images/902-image39.png new file mode 100644 index 00000000..b53ef155 Binary files /dev/null and b/_images/902-image39.png differ diff --git a/_images/902-image90.png b/_images/902-image90.png new file mode 100644 index 00000000..2496ae1e Binary files /dev/null and b/_images/902-image90.png differ diff --git a/_images/902-image99.png b/_images/902-image99.png new file mode 100644 index 00000000..50f9aa0d Binary files /dev/null and b/_images/902-image99.png differ diff --git a/_images/902-permissions1.png b/_images/902-permissions1.png new file mode 100644 index 00000000..b2080927 Binary files /dev/null and b/_images/902-permissions1.png differ diff --git a/_images/902-permissions2.png b/_images/902-permissions2.png new file mode 100644 index 00000000..401f06eb Binary files /dev/null and b/_images/902-permissions2.png differ diff --git a/_images/902-permissions3.png b/_images/902-permissions3.png new file mode 100644 index 00000000..3aa521ec Binary files /dev/null and b/_images/902-permissions3.png differ diff --git a/_images/902-permissions4.png b/_images/902-permissions4.png new file mode 100644 index 00000000..58e87a25 Binary files /dev/null and b/_images/902-permissions4.png differ diff --git a/_images/902-purchase-gener.png b/_images/902-purchase-gener.png new file mode 100644 index 00000000..6135dcf1 Binary files /dev/null and b/_images/902-purchase-gener.png differ diff --git a/_images/903-acc-admin-settings1.png b/_images/903-acc-admin-settings1.png new file mode 100644 index 00000000..54d81314 Binary files /dev/null and b/_images/903-acc-admin-settings1.png differ diff --git a/_images/903-image100.png b/_images/903-image100.png new file mode 100644 index 00000000..9f03a491 Binary files /dev/null and b/_images/903-image100.png differ diff --git a/_images/903-image108.png b/_images/903-image108.png new file mode 100644 index 00000000..aae597b4 Binary files /dev/null and b/_images/903-image108.png differ diff --git a/_images/903-image12.png b/_images/903-image12.png new file mode 100644 index 00000000..8a9eca89 Binary files /dev/null and b/_images/903-image12.png differ diff --git a/_images/903-image27.png b/_images/903-image27.png new file mode 100644 index 00000000..2324ea24 Binary files /dev/null and b/_images/903-image27.png differ diff --git a/_images/903-image32.png b/_images/903-image32.png new file mode 100644 index 00000000..e59c62ae Binary files /dev/null and b/_images/903-image32.png differ diff --git a/_images/903-image66.png b/_images/903-image66.png new file mode 100644 index 00000000..34328319 Binary files /dev/null and b/_images/903-image66.png differ diff --git a/_images/903-item-form1.png b/_images/903-item-form1.png new file mode 100644 index 00000000..640bf2bd Binary files /dev/null and b/_images/903-item-form1.png differ diff --git a/_images/904-assets1.png b/_images/904-assets1.png new file mode 100644 index 00000000..b9ade41d Binary files /dev/null and b/_images/904-assets1.png differ diff --git a/_images/904-assets2.png b/_images/904-assets2.png new file mode 100644 index 00000000..0703dc78 Binary files /dev/null and b/_images/904-assets2.png differ diff --git a/_images/904-assets3.png b/_images/904-assets3.png new file mode 100644 index 00000000..21ee6127 Binary files /dev/null and b/_images/904-assets3.png differ diff --git a/_images/904-image101.png b/_images/904-image101.png new file mode 100644 index 00000000..bff9bdbc Binary files /dev/null and b/_images/904-image101.png differ diff --git a/_images/904-image109.png b/_images/904-image109.png new file mode 100644 index 00000000..2524a6a9 Binary files /dev/null and b/_images/904-image109.png differ diff --git a/_images/904-image13.png b/_images/904-image13.png new file mode 100644 index 00000000..00fe4d1d Binary files /dev/null and b/_images/904-image13.png differ diff --git a/_images/904-image28.png b/_images/904-image28.png new file mode 100644 index 00000000..3d7bc643 Binary files /dev/null and b/_images/904-image28.png differ diff --git a/_images/904-image33.png b/_images/904-image33.png new file mode 100644 index 00000000..71816577 Binary files /dev/null and b/_images/904-image33.png differ diff --git a/_images/904-image67.png b/_images/904-image67.png new file mode 100644 index 00000000..0c58efc5 Binary files /dev/null and b/_images/904-image67.png differ diff --git a/_images/905-image102.png b/_images/905-image102.png new file mode 100644 index 00000000..50f59902 Binary files /dev/null and b/_images/905-image102.png differ diff --git a/_images/905-image1021.png b/_images/905-image1021.png new file mode 100644 index 00000000..cc067594 Binary files /dev/null and b/_images/905-image1021.png differ diff --git a/_images/905-image110.png b/_images/905-image110.png new file mode 100644 index 00000000..53130f5b Binary files /dev/null and b/_images/905-image110.png differ diff --git a/_images/905-image14.png b/_images/905-image14.png new file mode 100644 index 00000000..a6a8c26c Binary files /dev/null and b/_images/905-image14.png differ diff --git a/_images/905-image29.png b/_images/905-image29.png new file mode 100644 index 00000000..bea006fb Binary files /dev/null and b/_images/905-image29.png differ diff --git a/_images/905-image34.png b/_images/905-image34.png new file mode 100644 index 00000000..e76201bf Binary files /dev/null and b/_images/905-image34.png differ diff --git a/_images/905-image50.png b/_images/905-image50.png new file mode 100644 index 00000000..f6aa3d8a Binary files /dev/null and b/_images/905-image50.png differ diff --git a/_images/905-image68.png b/_images/905-image68.png new file mode 100644 index 00000000..2657f5f6 Binary files /dev/null and b/_images/905-image68.png differ diff --git a/_images/905-price-list1.png b/_images/905-price-list1.png new file mode 100644 index 00000000..9593d7b9 Binary files /dev/null and b/_images/905-price-list1.png differ diff --git a/_images/905-price-list2.png b/_images/905-price-list2.png new file mode 100644 index 00000000..304752b7 Binary files /dev/null and b/_images/905-price-list2.png differ diff --git a/_images/905-price-list3.png b/_images/905-price-list3.png new file mode 100644 index 00000000..3a9c173a Binary files /dev/null and b/_images/905-price-list3.png differ diff --git a/_images/906-discount-schemes1.png b/_images/906-discount-schemes1.png new file mode 100644 index 00000000..64595b1f Binary files /dev/null and b/_images/906-discount-schemes1.png differ diff --git a/_images/906-discount-schemes2.png b/_images/906-discount-schemes2.png new file mode 100644 index 00000000..f571a1dd Binary files /dev/null and b/_images/906-discount-schemes2.png differ diff --git a/_images/906-discount-schemes3.png b/_images/906-discount-schemes3.png new file mode 100644 index 00000000..d7c04b94 Binary files /dev/null and b/_images/906-discount-schemes3.png differ diff --git a/_images/906-image103.png b/_images/906-image103.png new file mode 100644 index 00000000..88de1ffc Binary files /dev/null and b/_images/906-image103.png differ diff --git a/_images/906-image111.png b/_images/906-image111.png new file mode 100644 index 00000000..8e4d64ef Binary files /dev/null and b/_images/906-image111.png differ diff --git a/_images/906-image15.png b/_images/906-image15.png new file mode 100644 index 00000000..92ac5c74 Binary files /dev/null and b/_images/906-image15.png differ diff --git a/_images/906-image35.png b/_images/906-image35.png new file mode 100644 index 00000000..2687ca64 Binary files /dev/null and b/_images/906-image35.png differ diff --git a/_images/906-image69.png b/_images/906-image69.png new file mode 100644 index 00000000..5968df43 Binary files /dev/null and b/_images/906-image69.png differ diff --git a/_images/907-image104.png b/_images/907-image104.png new file mode 100644 index 00000000..6159b288 Binary files /dev/null and b/_images/907-image104.png differ diff --git a/_images/907-image16.png b/_images/907-image16.png new file mode 100644 index 00000000..5c89fd82 Binary files /dev/null and b/_images/907-image16.png differ diff --git a/_images/907-image36.png b/_images/907-image36.png new file mode 100644 index 00000000..d7ed7c81 Binary files /dev/null and b/_images/907-image36.png differ diff --git a/_images/907-image51.png b/_images/907-image51.png new file mode 100644 index 00000000..a1aa288b Binary files /dev/null and b/_images/907-image51.png differ diff --git a/_images/907-image70.png b/_images/907-image70.png new file mode 100644 index 00000000..77881672 Binary files /dev/null and b/_images/907-image70.png differ diff --git a/_images/907-loyalty-programs1.png b/_images/907-loyalty-programs1.png new file mode 100644 index 00000000..06dcecb4 Binary files /dev/null and b/_images/907-loyalty-programs1.png differ diff --git a/_images/907-loyalty-programs2.png b/_images/907-loyalty-programs2.png new file mode 100644 index 00000000..0c191fa4 Binary files /dev/null and b/_images/907-loyalty-programs2.png differ diff --git a/_images/907-loyalty-programs3.png b/_images/907-loyalty-programs3.png new file mode 100644 index 00000000..7bd1b801 Binary files /dev/null and b/_images/907-loyalty-programs3.png differ diff --git a/_images/908-dimensions1.png b/_images/908-dimensions1.png new file mode 100644 index 00000000..73f69564 Binary files /dev/null and b/_images/908-dimensions1.png differ diff --git a/_images/908-dimensions2.png b/_images/908-dimensions2.png new file mode 100644 index 00000000..ecee15a0 Binary files /dev/null and b/_images/908-dimensions2.png differ diff --git a/_images/908-dimensions3.png b/_images/908-dimensions3.png new file mode 100644 index 00000000..9437b67c Binary files /dev/null and b/_images/908-dimensions3.png differ diff --git a/_images/908-dimensions4.png b/_images/908-dimensions4.png new file mode 100644 index 00000000..67dbd9ed Binary files /dev/null and b/_images/908-dimensions4.png differ diff --git a/_images/908-dimensions5.png b/_images/908-dimensions5.png new file mode 100644 index 00000000..001e08d1 Binary files /dev/null and b/_images/908-dimensions5.png differ diff --git a/_images/908-dimensions6.png b/_images/908-dimensions6.png new file mode 100644 index 00000000..fa449822 Binary files /dev/null and b/_images/908-dimensions6.png differ diff --git a/_images/908-image105.png b/_images/908-image105.png new file mode 100644 index 00000000..be5bdb36 Binary files /dev/null and b/_images/908-image105.png differ diff --git a/_images/908-image17.png b/_images/908-image17.png new file mode 100644 index 00000000..5e114c4a Binary files /dev/null and b/_images/908-image17.png differ diff --git a/_images/908-image37.png b/_images/908-image37.png new file mode 100644 index 00000000..e8520616 Binary files /dev/null and b/_images/908-image37.png differ diff --git a/_images/908-image52.png b/_images/908-image52.png new file mode 100644 index 00000000..d51d2efe Binary files /dev/null and b/_images/908-image52.png differ diff --git a/_images/908-image71.png b/_images/908-image71.png new file mode 100644 index 00000000..5a82e191 Binary files /dev/null and b/_images/908-image71.png differ diff --git a/_images/909-image18.png b/_images/909-image18.png new file mode 100644 index 00000000..e401ff14 Binary files /dev/null and b/_images/909-image18.png differ diff --git a/_images/909-image53.png b/_images/909-image53.png new file mode 100644 index 00000000..a1051493 Binary files /dev/null and b/_images/909-image53.png differ diff --git a/_images/909-image72.png b/_images/909-image72.png new file mode 100644 index 00000000..f597f955 Binary files /dev/null and b/_images/909-image72.png differ diff --git a/_images/910-image19.png b/_images/910-image19.png new file mode 100644 index 00000000..0293c8a9 Binary files /dev/null and b/_images/910-image19.png differ diff --git a/_images/910-image54.png b/_images/910-image54.png new file mode 100644 index 00000000..6f1e259a Binary files /dev/null and b/_images/910-image54.png differ diff --git a/_images/910-image73.png b/_images/910-image73.png new file mode 100644 index 00000000..18231e44 Binary files /dev/null and b/_images/910-image73.png differ diff --git a/_images/911-image20.png b/_images/911-image20.png new file mode 100644 index 00000000..f4c95364 Binary files /dev/null and b/_images/911-image20.png differ diff --git a/_images/911-image74.png b/_images/911-image74.png new file mode 100644 index 00000000..629b5845 Binary files /dev/null and b/_images/911-image74.png differ diff --git a/_images/912-image21.png b/_images/912-image21.png new file mode 100644 index 00000000..c11da6d8 Binary files /dev/null and b/_images/912-image21.png differ diff --git a/_images/912-image75.png b/_images/912-image75.png new file mode 100644 index 00000000..dca1b6a1 Binary files /dev/null and b/_images/912-image75.png differ diff --git a/_images/913-image22.png b/_images/913-image22.png new file mode 100644 index 00000000..601e13d5 Binary files /dev/null and b/_images/913-image22.png differ diff --git a/_images/913-image76.png b/_images/913-image76.png new file mode 100644 index 00000000..6e80715d Binary files /dev/null and b/_images/913-image76.png differ diff --git a/_images/914-image23.png b/_images/914-image23.png new file mode 100644 index 00000000..a66ab545 Binary files /dev/null and b/_images/914-image23.png differ diff --git a/_images/914-image77.png b/_images/914-image77.png new file mode 100644 index 00000000..c8f1e901 Binary files /dev/null and b/_images/914-image77.png differ diff --git a/_images/915-image24.png b/_images/915-image24.png new file mode 100644 index 00000000..a9628713 Binary files /dev/null and b/_images/915-image24.png differ diff --git a/_images/915-image78.png b/_images/915-image78.png new file mode 100644 index 00000000..84bc9039 Binary files /dev/null and b/_images/915-image78.png differ diff --git a/_images/916-image79.png b/_images/916-image79.png new file mode 100644 index 00000000..1f3bd13d Binary files /dev/null and b/_images/916-image79.png differ diff --git a/_images/917-image80.png b/_images/917-image80.png new file mode 100644 index 00000000..8d4fd0ac Binary files /dev/null and b/_images/917-image80.png differ diff --git a/_images/918-image81.png b/_images/918-image81.png new file mode 100644 index 00000000..8582a973 Binary files /dev/null and b/_images/918-image81.png differ diff --git a/_images/919-image82.png b/_images/919-image82.png new file mode 100644 index 00000000..ff622f3b Binary files /dev/null and b/_images/919-image82.png differ diff --git a/_images/920-image83.png b/_images/920-image83.png new file mode 100644 index 00000000..2a9c478e Binary files /dev/null and b/_images/920-image83.png differ diff --git a/_images/921-image84.png b/_images/921-image84.png new file mode 100644 index 00000000..cc814a49 Binary files /dev/null and b/_images/921-image84.png differ diff --git a/_images/922-image85.png b/_images/922-image85.png new file mode 100644 index 00000000..5b97435f Binary files /dev/null and b/_images/922-image85.png differ diff --git a/_images/923-image86.png b/_images/923-image86.png new file mode 100644 index 00000000..31f9146a Binary files /dev/null and b/_images/923-image86.png differ diff --git a/_images/924-image87.png b/_images/924-image87.png new file mode 100644 index 00000000..90388ada Binary files /dev/null and b/_images/924-image87.png differ diff --git a/_images/925-image88.png b/_images/925-image88.png new file mode 100644 index 00000000..3834511d Binary files /dev/null and b/_images/925-image88.png differ diff --git a/_sources/blog/000-index.md b/_sources/blog/000-index.md new file mode 100644 index 00000000..c4ba3cd6 --- /dev/null +++ b/_sources/blog/000-index.md @@ -0,0 +1,9 @@ +# Блог + +```{toctree} +:glob: +:reversed: +:maxdepth: 1 + +* +``` diff --git a/_sources/blog/20240219-POS-in-LAN.md b/_sources/blog/20240219-POS-in-LAN.md new file mode 100644 index 00000000..397cc3bd --- /dev/null +++ b/_sources/blog/20240219-POS-in-LAN.md @@ -0,0 +1,27 @@ +# Как да използваме Dreem POS в локална мрежа + +```{warning} +ВАЖНО! Unicontsoft не поддържа подобна настройка на системата! Описанието и стъпките по-долу са FYI (само за информация)! +``` + +Приемаме че имате Windows локална мрежа с компютри **POS-PC** и **DREEM-PC** и искате Dreem POS на първата машина (**POS-PC**) да използва базата данни на Dreem Personal на другата машина (**DREEM-PC**). + + 1. Уверете се, че на **POS-PC** можете да отваряте и копирате файлове от машина **DREEM-PC** + - ако машините са в domain, използвайте потребител от domain-а + - ако машините са в workgroup, настройка Sharing and security model for local accounts трябва да е Classic – local users authenticate as themselves и паролата на текущия потребител на **POS-PC** трябва да съвпада с паролата на същия потрелител на **DREEM-PC** + - във **firewall.cpl** в раздел *Exceptions* трябва да е разрешен **File and Print Sharing** + 2. След това се уверете, че на двете машини има инсталирана еднаква [**последна реализация на Dreem Personal**](https://www.unicontsoft.com/bg/download.html) + +На **POS-PC** трябва да настроите пренасочващ псевдоним с име **ucs-instance**, който ще се използва от Dreem Pos за да достъпва базата данни на Dreem Personal + + 1. На **POS-PC** от **Start->Run** стартирайте **cliconfg.exe** (На 64-битови OS стартирайте **C:\Windows\SysWOW64\cliconfg.exe**) + 2. В раздел *Alias* на **Client Network Utility** създавайте нов псевдоним **ucs-instance** (виж т.1 на графиката) по **Named Pipes** (виж т.2) и го насочете към инстанция **DREEM-PC\UCS** (виж т.3) + + ![](20240219-cliconfig.png){ class=align-center } + + 3. На **POS-PC** стартирайте Dreem Pos и проверете дали имате достъп до данните на Dreem Personal на **DREEM-PC** +Имайте предвид, че при обновяване на реализацията на Dreem Personal трябва на **POS-PC** и на **DREEM-PC** това да се случва едновременно, така че да се използва една и съща реализация на двете машини. + +***Още веднъж предупреждаваме: Използвайте това решение на свой риск само ако знаете какво правите! Unicontsoft не носи отговорност за възможна загуба на данни!*** + +***Напълно възможно e системата да не работи оптимално или въобще в някои гранични случаи, защото горната настройка не е тествана и не се поддържа официално от Unicontsoft!*** diff --git a/_sources/blog/20240311-dimensions.md b/_sources/blog/20240311-dimensions.md new file mode 100644 index 00000000..029f6a4f --- /dev/null +++ b/_sources/blog/20240311-dimensions.md @@ -0,0 +1,25 @@ + +# Потребителски дименсии + + +***Потребителски дименсии*** е ключова настройка за системата. Чрез нея класифицирате номенклатурите в категории по определен критерий. Освен тази ѝ основна роля, тя дава възможност да отработите и частни случаи в параметрите на продукти, контрагенти и други. При добро конфигуриране на дименсиите изключително улеснявате работата си с основни номенклатури, особено при работа с обемни по съдържание списъци с продукти и контрагенти. Така, колкото по-прецизни настройки направите, толкова по-богата и детайлна информация ще получите като резултат от справките в системата. +Списъци с категории може да оформяте като линейни или като йерархични( дървовидни) структури. Ето един опростен дървовиден списък за пример: + +![](20240311-dimensions1.png){ class=align-center } + +При него в един общ списък се показват категории и подкатегории на различни нива, което в определени случаи може да има предимства. Но преди да направите подобна настройка, обърнете внимание и на явните ѝ недостатъци: дървовидните списъци могат да достигнат голям брой редове, затрудняващи работата, могат излишно да се дублират подкатегории и пр. Твърде вероятно, дори сигурно, ще се появят и затруднения в тълкуването на резултатите в справките. Това ни отнема възможността да ги анализираме вярно. А това са все неща, далеч от добрите практики. Затова съветваме да използвате вариант с множество отделни списъци. При тях всяка категория ще е описана отделно. + +![](20240311-dimensions2.png){ class=align-center } + +Цялостното планиране и изграждането на списъците с категории е процес - по всяко време може да ги актуализирате, развивате и оптимизирате за целите на Вашите справки. +За повече детайли разгледайте в [Настройка на списъци](https://docs.unicontsoft.com/blog/20240318-cms.html#id2). + +Съществен момент при настройването на дименсии е да се определи техният тип. Най-общо може да разглеждаме типовете като списъчни и несписъчни. Към първите се отнасят дименсии от тип *Списък* и *Множество* и справките работят именно с тях по отношение на *Продукти и материали* и *Контрагенти и поделения*. Дименсиите, настроени за продукти, различни от *Списък* и *Множество*, се визуализират единствено в списъците с продукти. Аналогично, същото важи за контрагентите. Разгледайте повече в [Настройка на дименсии](https://docs.unicontsoft.com/blog/20240318-cms.html#id3). +В момента, освен номенклатури, в настройка на дименсии участват и някои типове документи - *Договори*, *Продажби*, *Покупки*, *Заявки*, *Складови документи*, *Касови* и *Банкови документи*, *Гаранционни карти*, а също и *Планиране на производство*. +За някои от тях, например, може да се окаже удобно създаването на паралелен списък, показващ някакво обстоятелство, различаващо се по съдържание от *Статуси*. Тези настройки на дименсии, отнасящи се за документи, се прилагат единствено върху документи в състояние на редакция - един или множество. тези дименсиите се визуализират единствено в съответния списък по тип документ. + +Друг важен момент, при използването на дименсии, е осигуряване на връзка с външни системи - мобилно приложение, електронен магазин и други. +Чрез дименсии може да посочите, например, как отделните продукти да се позициионират в уебсайта Ви. Така, с лесна настройка в системата, бързо актуализирате данните в свързаните електронни магазини. +Дименсиите от типовете *Текст* и *Число* позволяват въвеждане съответно на произволно текстово и цифрово съдържание, при типове *Дата* и *Час* се прави избор на дата или задаване на час, а за тип *Да/не* трябва да изберем дали номенклатурата отговаря или не на определен критерий. Тези настройки може да се приложат към един или едновременно към няколко продукта или контрагента. + +За да проследите в каква последователност се създават настройките от началото, може да разгледате статията [Как да настроим Потребителски дименсии](https://docs.unicontsoft.com/blog/20240318-cms.html). diff --git a/_sources/blog/20240321-deferred-vat.md b/_sources/blog/20240321-deferred-vat.md new file mode 100644 index 00000000..536dfc01 --- /dev/null +++ b/_sources/blog/20240321-deferred-vat.md @@ -0,0 +1,87 @@ +```{only} html +[Нагоре](000-index) +``` + +# Отложено начисляване на ДДС за покупки +- [Въведение и задължителни настройки](https://docs.unicontsoft.com/blog/20240321-deferred-vat.html#id2) +- [Покупка с отложено начисляване на ДДС](https://docs.unicontsoft.com/blog/20240321-deferred-vat.html#id3) +- [Въвеждане на фактура за покупка, получена със закъснение](https://docs.unicontsoft.com/blog/20240321-deferred-vat.html#id4) + + +## Въведение и задължителни настройки + +[Законът за ДДС](https://dv.parliament.bg/DVWeb/showMaterialDV.jsp?idMat=201969) дава право на регистрираните по него лица да използват данъчния кредит при покупките в рамките на следващите 12 месеца. Системата предлага автоматизация на процеса по отложено начисляване на ДДС. За целта се изисква предварително да настроим транзитна сметка за отложен ДДС. + +Настройката е еднократна и се намира в **Администрация || Настройки || Група: Счетоводни настройки**. След като се навигираме до реда със **Сметка разсрочен ДДС за покупки**, в колона *Стойност* избираме сметка за отложен ДДС, която предварително сме настроили в **Сметкоплан**. Направените промени трябва да бъдат записани. + +![](20240321-def-vat1.png){ class=align-center } + +```{tip} +При работа с документи, засягащи минали или бъдещи данъчни периоди, е задължително настройките в **Администрация || Работни периоди** да бъдат съобразени. При липсващ разрешителен период системата не позволява приключване на документи или редактиране на дати. +``` + +## Покупка с отложено начисляване на ДДС + +След като сте изпълнили горните изисквания, документът с покупката може да бъде въведен и осчетоводен коректно. +Така, в крайна сметка, ще имате следните две счетоводни статии: + +**31.01.2024 г.** +```{admonition} Статия +|Дт Сметка|Кт Сметка|Признак|Сума| +|-------------|-------------|--|-----------| +|6023 | | |166,67 лв. | +|4533 | | |33,33 лв. | +| |4011 | |200,00 лв. | +``` +**01.03.2024 г.** +```{admonition} Статия +|Дт Сметка|Кт Сметка|Признак|Сума| +|-------------|-------------|--|-----------| +|4531 | | |33,33 лв. | +| |4533 | |33,33 лв. | +``` + +В следващия пример показваме как за фактура от 31.01.2024 г., получена в срок през февруари, ще отложим данъчния кредит за месец март. +За дата на документа посочваме датата на издаване - 31.01.2024 г. и обзавеждаме останалите реквизити без особености. + +![](20240321-def-vat2.png){ class=align-center } + +Важното при схемата за отлагане на ДДС е в панел **Допълнителни**, поле **Дата на ДДС** да изберем месец март. Именно това ще определи отчетната дата, на която ДДС ще се отрази по дебита на сметка 4531. + +![](20240321-def-vat3.png){ class=align-center } + +```{tip} +Системата ограничава избора на дата в рамките на 12 месеца от датата на фактурата. +``` +Приключваме фактурата за покупка и генерираме счетоводно записване. + +![](20240321-def-vat4.png){ class=align-center } + +С това системата генерира едновременно два счетоводни документа: + +![](20240321-def-vat5.png){ class=align-center } + +1. Основен счетоводен документ с датата на фактурата (31.01.2024 г.), където сумата на ДДС се отразява в Дт на настроената разчетна сметка: + +![](20240321-def-vat6.png){ class=align-center } + +2. Свързан, наречен *Скачен счетоводен документ*, който е с отчетна дата през месец март. В него сумата на ДДС се прехвърля от разчетна с/ка 4533 като ДДС за внасяне в дебита на с/ка 4531: + +![](20240321-def-vat7.png){ class=align-center } + +## Въвеждане на фактура за покупка, получена със закъснение + +> Предлагаме да използвате тази схема за автоматично осчетоводяване, когато въвеждате също и получени със закъснение фактури за покупка. + +Да речем, че в месец март получавате фактура за наето паркомясто, която е била издадена на 01.01.2024. Разбира се, фактурата се въвежда с датата на издаване, т.е. *Док.дата* е 01.01.2024. +И, както вече казахме, за да се отрази правилно ДДС на документа през месец март, трябва от панел **Допълнителни** да посочим това в реквизит **Дата на ДДС**. + +![](20240321-def-vat8.png){ class=align-center } + +Приключваме фактурата за покупка стандартно и генерираме счетоводно записване, при което системата създава едновременно две счетоводни записвания: основен и скачен документ. +В основния счетоводен документ, с отчетна дата 01.01.2024 г., сумата на ДДС се отразява в Дт на настроената разчетна сметка, а в скачения счетоводен документ, същата сума се закрива в с/ка 4533 през месец март. + +> За да начислим ДДС отложено, е нужно: +> - Настройка на **Сметка разсрочен ДДС за покупки** в **Администрация || Настройки || Група: > Счетоводни настройки** +> - Избор на **Дата на ДДС** в панел **Допълнителни** на документа (фактурата) за покупка +> - Генериране на счетоводни документи към фактурата за покупка \ No newline at end of file diff --git a/_sources/blog/20240327-deferred-and-future-expenses.md b/_sources/blog/20240327-deferred-and-future-expenses.md new file mode 100644 index 00000000..36c45539 --- /dev/null +++ b/_sources/blog/20240327-deferred-and-future-expenses.md @@ -0,0 +1,76 @@ +```{only} html +[Нагоре](000-index) +``` + +# Разходи за минали и бъдещи периоди +- [Въведение и настройки](https://docs.unicontsoft.com/blog/20240327-deferred-and-future-expenses.html#id2) +- [Разходи за минали периоди](https://docs.unicontsoft.com/blog/20240327-deferred-and-future-expenses.html#id3) +- [Разходи за бъдещи периоди](https://docs.unicontsoft.com/blog/20240327-deferred-and-future-expenses.html#id4) + +## Въведение и настройки + +В редица случаи се налага въвеждане на документ, издаден в текущия данъчен период (календарна година), но отнасящ се за минал такъв. Това са, например, кредитните известия с обща отстъпка като бонус оборот, фактури от януари за покупки в декември и други. +Подобни случаи отработваме в системата, използвайки схема за отразяване на разхода за избран период още с въвеждането на документа. Този метод може да се прилага при работа с разходи за минали и бъдещи периоди. + +> За да работи тази схема, предварително в **Администрация || Настройки** трябва да имате посочени и счетоводни сметки, и типове счетоводни документи, в които системата да създаде счетоводните записвания. Ако тази настройка липсва, в редовете на документите/фактурите за покупка ще бъдат заключени колоните **Начална дата на разхода**, **КРайна дата на разхода** и **Период на разхода**. + +![](20240327-deferred-and-future-expenses1.png){ class=align-center } + +При работа с документи за минали или бъдещи периоди е задължително настройките на [**Работни периоди**](https://docs.unicontsoft.com/blog/20240517-working-periods.html) в **Администрация** да бъдат съобразени. При липсващ разрешителен период, системата не позволява приключване на документи или редактиране на дати. + +Системата дава избор как да се раздели разходът - *Месечен*, *Месечен с равни суми*, *Годишен* и *Годишен с равни суми*. +При месечното разделяне системата ще създаде по един документ за всеки от участващите месеци, като сумата в него ще е съобразена или с броя календарни дни(*Месечен*), или ще е еднаква за всеки от месеците (*Месечен с развни суми*). При отнасянето на разхода на годишна база, ще имаме по един документ за всяка от участващите години. И тук сумите могат да бъдат съобразени с броя участващи дни (*Годишен*) или да се използва еднаква сума за всяка година (*Годишен с равни суми*). + +## Разходи за минали периоди + +С пример ще покажем как би изглеждало въвеждането на документ, включващ разход за минал период. +В месец февруари 2024 г. получавате фактура с наем за декември 2023 г., в която са включени и други разходи за обекта за януари. Документът е бил издаден на 03.01.2024 г. + +При въвеждане на фактурата в *Док.дата* записвате 03.01.2024. Другите разходи, участващи във фактурата, са в текущата календарна година, затова въвеждате без особености. + +![](20240327-deferred-and-future-expenses2.png){ class=align-center } + +Наемът, обаче, се отнася за минала календарна година и е коректно да бъде отразен като разход за минал период. Затова за продукт *Наем*, в колони **Начална дата на разхода** и **Крайна дата на разхода**,записвате съответните дати, които обхващат периода, за който се отнася разходът. В случая това са 01. - 31.12.2023 г. Разходът е за един месец и в **Период на разхода** избирате тип *Месечен*. +Ако колоните не са видими, могат да бъдат изведени от *Изглед на списък*, който се достъпва с десен бутон на мишката върху реда с имена на колоните. + +Приключвате фактурата за покупка и генерирате счетоводно записване: + +![](20240327-deferred-and-future-expenses3.png){ class=align-center } + +Така системата създава едновременно следните счетоводни записвания: + +![](20240327-deferred-and-future-expenses4.png){ class=align-center } + +1. Основният счетоводен документ е с отчетна дата 03.01.2024 г. В него сумата на наема от декември е отразена в настроената за *Сметка за разходи в минал период* с/ка 499. Другите разходи са в текуща календарна година, затова се осчетоводяват в гр. 60 според настроения *Сметкоплан*. + +![](20240327-deferred-and-future-expenses5.png){ class=align-center } + +2. Скаченият документ *МО* съдържа отнасянето на сумата на наема по дебита в гр. 60 с отчетна дата 31.12.2023 г. + +![](20240327-deferred-and-future-expenses6.png){ class=align-center } + +Салдото, което остава по кредита на с/ка 499, ще се закрие в 2024 г. с основния счетоводен документ на фактурата. + +## Разходи за бъдещи периоди + +Един от най-често срещаните случаи на разходи за бъдещи периоди са застраховките. Ще въведем примерен документ за годишна застраховка от 27.03.2024 г. За целта, както посочихме, трябва да бъдат направени съответните настройки в меню **Администрация**, за да са достъпни колоните **Начална дата на разхода**, **Крайна дата на разхода** и **Период на разхода**. В тях посочвате срока на застраховката и избирате тип на разхода. Нека изберем **Годишен**, като така системата ще разпредели сумите на база брой дни от всяка участваща година. + +![](20240327-deferred-and-future-expenses7.png){ class=align-center } + +Документът за покупка трябва да се приключи със счетоводно записване. Така системата генерира два свързани счетоводни документа - *ФПок* и *МО*. + +![](20240327-deferred-and-future-expenses8.png){ class=align-center } + +В основния счетоводен документ *ФПок* отчетната дата е 27.03.2024 г. Тук, спрямо избрания тип на разхода **Годишен**, системата е осчетоводила автоматично сумата за 2024 г. в настроената от гр.60 сметка в *Сметкоплан*. Оставащата за 2025 г. сума отива по сметката *Разходи за бъдещи периоди*, настроена в **Администрация**. + +![](20240327-deferred-and-future-expenses9.png){ class=align-center } + +В скачения счетоводен документ *МО* сумата на застраховката за 2025 г. се прехвърля от сметката за разходи за бъдещи периоди в настроената сметка за застраховки от гр.60. +Отчетната дата е първият ден в 2025 г. + +![](20240327-deferred-and-future-expenses10.png){ class=align-center } + +> За да въведем разходи за минал или бъдещ период, е нужно: +> - Настройка на съответните счетоводни сметки и типове документи в **Администрация || Настройки || Група: > Счетоводни настройки** +> - Избор на **Начална дата на разхода**, **Крайна дата на разхода** и **Период на разхода** в документа (фактурата) за покупка +> - Генериране на счетоводно записване към фактурата за покупка \ No newline at end of file diff --git a/_sources/blog/20240327-deferred-and-future-incomes.md b/_sources/blog/20240327-deferred-and-future-incomes.md new file mode 100644 index 00000000..4f06229b --- /dev/null +++ b/_sources/blog/20240327-deferred-and-future-incomes.md @@ -0,0 +1,63 @@ +```{only} html +[Нагоре](000-index) +``` + + +# Приходи за бъдещи и минали периоди +- [Въведение и настройки](https://docs.unicontsoft.com/blog/20240327-deferred-and-future-incomes.html#id2) +- [Отразяване на приходите за бъдещи и минали периоди](https://docs.unicontsoft.com/blog/20240327-deferred-and-future-incomes.html#id3) + +## Въведение и настройки + +Документите за продажба участват в генериране на приходите в системата. Затова отработваме случаите с приходи за бъдещи и минали периоди, използвайки схема за отразяването им още със създаването на документа. Ако все още се запознавате със системата, разгледайте стъпка по стъпка принципа за работа с продажби в [Как да създадем Документ за продажба](https://www.unicontsoft.com/cms/node/26). + +За да използвате възможността, която системата дава, за отразяване на приходи за бъдещи и минали периоди, са необходими няколко предварителни настройки. + +> В меню **Администрация || Настройки** трябва да имате посочени и счетоводни сметки, и типове счетоводни документи, в които системата да създаде счетоводните записвания. Ако тази настройка липсва, в редовете на документите/фактурите за продажба ще бъдат заключени колоните **Начална дата на прихода**, **Крайна дата на прихода** и **Период на прихода**. + +![](20240327-deferred-and-future-incomes1.png){ class=align-center } + +При работа с документи за минали или бъдещи периоди е задължително настройките на [**Работни периоди**](https://docs.unicontsoft.com/blog/20240517-working-periods.html) в **Администрация** да бъдат съобразени. При липсващ разрешителен период, системата не позволява приключване на документи или редактиране на дати. + +В документа за продажба ще имате избор как да се раздели прихода - *Месечен*, *Месечен с равни суми*, *Годишен* и *Годишен с равни суми*. +При месечното разделяне системата ще създаде по един документ за всеки от участващите месеци, като сумата в него ще е съобразена или с броя календарни дни(*Месечен*), или ще е еднаква за всеки от месеците (*Месечен с развни суми*). При отнасянето на прихода на годишна база, ще имаме по един документ за всяка от участващите години. И тук сумите могат да бъдат съобразени с броя участващи дни (*Годишен*) или да се използва еднаква сума за всяка година (*Годишен с равни суми*). + +## Отразяване на приходите за бъдещи и минали периоди + +Ще разгледаме с пример създаване на документ за продажба и генериране на фактура за ежемесечна абонаментна услуга. Документът ще бъде от дата 01.12.2023 г. за срок от 6 месеца. +В новосъздадения документ обзавеждате нужните реквизити. На реда с продукт *Абонамента услуга*, в колони **Начална дата на прихода** и **Крайна дата на прихода**,записвате съответните дати, които обхващат периода, за който се отнася приходът - 01.12.2023 г.-31.05.2024 г. Приходът е за шест месеца, затова в **Период на прихода** избирате тип *Месечен с равни суми*. +Ако колоните не са видими, могат да бъдат изведени от *Изглед на списък*, който се достъпва с десен бутон на мишката върху реда с имена на колоните. + +![](20240327-deferred-and-future-incomes2.png){ class=align-center } + +Приключвате документа за продажба, като задължително генерирате фактура със счетоводно записване: + +![](20240327-deferred-and-future-incomes3.png){ class=align-center } + +Така системата създава едновременно следните счетоводни записвания, свързани с фактурата: + +![](20240327-deferred-and-future-incomes4.png){ class=align-center } + +1. Основният счетоводен документ *ФПрод* е с отчетна дата 01.12.2023 г. Той включва начислението на прихода за текущата година със сумата за месец декември по Кт на настроената за това сметка. Остатъкът от общата фактурирана сума е начислен по Кт на с/ка 704, която настроихме в **Сметка приходи за бъдещи периоди**. + +![](20240327-deferred-and-future-incomes5.png){ class=align-center } + +2. Скачени счетоводни документи - *МО*, в които месечната сума за абонамент се начислява като текущ приход от продажби: + +> **31.01.2024г.** +> Дт 704 - 416.67 лв. +> Кт 703 - 416.67 лв. + +![](20240327-deferred-and-future-incomes6.png){ class=align-center } + +Броят на генерираните *МО* отговаря на броя оставащи месеци в приходи за бъдещи периоди. Така е, защото избрахме типът на разхода да е на месечна база. Всеки *МО* е с дата последен ден от месеца, за който се отнася. + +```{tip} +Ако по някаква причина се налага създаване на документ в текущия данъчен период, приходът от който се отнася за минал такъв, отново може да използвате гореописаната схема. +``` + +> За да въведете приходи за минал или бъдещ период, е нужно: +> - Настройка на съответните счетоводни сметки и типове документи в **Администрация || Настройки || Група: Счетоводни настройки** +> - Разрешенителни настройки в **Работни периоди** за минал/бъдещ такъв +> - Избор на **Начална дата на прихода**, **Крайна дата на прихода** и **Период на прихода** в документа (фактурата) за продажба +> - Генериране на счетоводно записване към фактурата за продажба \ No newline at end of file diff --git a/_sources/blog/20240331-correction-doc.md b/_sources/blog/20240331-correction-doc.md new file mode 100644 index 00000000..a8c81658 --- /dev/null +++ b/_sources/blog/20240331-correction-doc.md @@ -0,0 +1,68 @@ +```{only} html +[Нагоре](000-index) +``` + +# Коригиращи документи при продажба +- [Въведение](https://docs.unicontsoft.com/blog/20240331-correction-doc.html#id2) +- [Кредитен документ към една продажба](https://docs.unicontsoft.com/blog/20240331-correction-doc.html#id3) +- [Кредитен документ към няколко продажби](https://docs.unicontsoft.com/blog/20240331-correction-doc.html#id4) +- [Кредитен документ без връзка с продажба](https://docs.unicontsoft.com/blog/20240331-correction-doc.html#id5) +- [Дебитни документи](https://docs.unicontsoft.com/blog/20240331-correction-doc.html#id6) + +## Въведение + +Използването на коригиращи документи се налага, когато за вече валидирана продажба трябва да променим цената или количество за един или няколко продукта. Ако тези промени са в посока намаление, говорим за кредитни документи. Когато искаме да намалим цена, се създават кредитни документи тип *Корекция на цена*, а при намаляване на количество - тип *Корекция на количество*. +И при двата типа системата прави генерация на коригиращ документ с отрицателен знак, задължително свързан с една или повече продажби/фактури. + +> Когато използвате вътрешнофирмени документи и първо създавате *Продажба*, към която генерирате данъчен документ (*Фактура*), същия ред спазвате и при коригиращите документи. Тоест, първо генерирате *Кредитен документ*, свързан с *Продажба*. При неговото приключване системата ще предложи издаване и на данъчен документ - *Кредитно известие*, автоматично свързано с *Фактура*. + +Ако част от количество по продажба/и е върнато от клиента по някаква причина или няма да пристигне, отразявате това чрез коригиращ документ от тип **Корекция на количество**. +Повече за стъпките, които да следвате, прочетете в темата [**Как да създадем Кредитен документ/Кредитно известие за количество**](https://www.unicontsoft.com/cms/node/48). + +Когато искате да намалите цената, на която сте продали продукт/и, избирате тип на коригиращия документ **Корекция на цени**. +Разгледайте в детайли как да направите това в [**Как да създадем Кредитен документ/Кредитно известие за цена**](https://www.unicontsoft.com/cms/node/28). + +Системата позволява различни варианти за генерация на тези документи. Всеки от тях е удобен в различна ситуация. + +## Кредитен документ към една продажба + +Ако създавате кредитен документ към една продажба, най-лесно е да използвате опцията **Генериране коригиращ документ**, която се намира в меню **Средства** в самата продажба. Така системата създава копие на документа за продажба, но с отрицателен знак. + +![](20240331-correction-doc1.png){ class=align-center } + +## Кредитен документ към няколко продажби + +Когато създавате общ кредитен документ към няколко продажби, имате избор дали да го направите от списъка с документи, или чрез създаване на нов документ. +Генерацията на кредитен документ от списъка с документи предполага да филтрирате така документите в него, че желаните продажби да са лесни за маркиране. След което с десен бутон на мишката върху маркировката избирате **Други средства || Генериране на кредитен документ/известие** и следвате стъпките. + +![](20240331-correction-doc2.png){ class=align-center } + +При генерация чрез нов документ, първо създавате такъв, след което от меню **Средства || Генериране кредитен документ/известие** извеждате списъка с продажби. Тук филтрирате, за да изберете желаните документи, към които ще създадете коригиращ документ. + +![](20240331-correction-doc3.png){ class=align-center } + +## Кредитен документ без връзка с продажба + +Дотук обсъжданите генерации изискват и служат за създаване на свързаност между продажба и коригиращ я документ. Има случаи, обаче, в които не може да посочим конкретни документи/фактура за продажба, а се налага издаване на кредитен документ. Например - когато искате да направите обща отстъпка за натрупан оборот, когато по някаква причина документът за продажба липсва в системата и пр. + +За тези случаи в системата има и трети тип коригиращ документ - **Корекция като бонус**. С използването му имате свобода при неговото създаване, каквато при типове *Корекция на цена* и *Корекция на количество* не се допуска. При тях се позволява да бъдат включени единствено продукти, участващи в свързаните продажби. Докато при типа *Корекция като бонус* съдържанието на кредитния документ може да бъде свободно избрано. + +> Документ от тип *Корекция като бонус* се създава единствено чрез *Нов документ*, в който ръчно обзавеждате всички реквизити. +> Най-често при този тип кредитен документ се въвежда един ред с обща отстъпка. За целта в системата се настройва отделен продукт от тип *Услуга*, който не изисква водене на склад. + +![](20240331-correction-doc4.png){ class=align-center } + +Тук отново важи правилото, че ако работите с вътрешнофирмени документи, първо се създава *Кредитен документ*, към който може да се генерира данъчният - *Кредитно известие*. + +## Дебитни документи + +Дебитните документи са коригиращ тип документ, използван за увеличаване на цена или количество по една или няколко продажби. Както споменахме при кредитните документи, така и при дебитните може да се коригират цена или количество единствено на участващи в продажбата продукти. + +> Ако желаете да завишите количества, може вместо дебитен документ да издадете нов документ за продажба. + +Генерацията на дебитните документи в системата следва същите стъпки, които разгледахме за кредитни документи. Тъй като така се генерират коригиращи документи с отрицателен знак, задължително трябва да смените *Док. тип*. +Когато работите с вътрешнофирмени документи, типът на документа трябва да бъде *Дебитен документ за продажба*. При приключването му системата ще генерира автоматично и данъчния документ - *Дебитно известие за продажба*. + +![](20240331-correction-doc5.png){ class=align-center } + +В статиите за [Дебитен документ/Дебитно известие за цена](https://www.unicontsoft.com/cms/node/43) и [Дебитен документ/Дебитно известие за количество](https://www.unicontsoft.com/cms/node/66) ще откриете подробни инструкции. \ No newline at end of file diff --git a/_sources/blog/20240411-allocate-acquisition-costs.md b/_sources/blog/20240411-allocate-acquisition-costs.md new file mode 100644 index 00000000..550cea8a --- /dev/null +++ b/_sources/blog/20240411-allocate-acquisition-costs.md @@ -0,0 +1,189 @@ +```{only} html +[Нагоре](000-index) +``` + + +# Разпределение на разходи за придобиване + +- [Въведение](https://docs.unicontsoft.com/blog/20240411-allocate-acquisition-costs.html#id2) +- [Методи за разпределение](https://docs.unicontsoft.com/blog/20240411-allocate-acquisition-costs.html#id3) +- [Разпределение на разходи при общ документ с покупката на стоки](https://docs.unicontsoft.com/blog/20240411-allocate-acquisition-costs.html#id4) +- [Справки за разпределение на разходите по придобиване](https://docs.unicontsoft.com/blog/20240411-allocate-acquisition-costs.html#id5) +- [Счетоводни настройки и документи](https://docs.unicontsoft.com/blog/20240411-allocate-acquisition-costs.html#id6) + +## Въведение + +Получените от доставчик стоково-материални запаси се отразяват в системата чрез [въвеждането на документи за покупка](https://www.unicontsoft.com/cms/node/23). Към тях се генерират складови документи, с което продуктите се заприходяват по покупна цена(без ДДС). +Разходите по закупуване, обаче, може да включват също вносни мита и такси, невъзстановими данъци и акцизи, разходи по доставката, товаро-разтоварни операции, монтаж и др. + +> Всички тези разходи, свързани със закупуване, преработка и доставка, формират доставната стойност на стоково-материалните запаси. + +Системата разполага със средство за автоматично разпределяне на разходите по покупки. Като резултат на неговото използване, в справки ще разполагате с реалната себестойност на продукти и материали. +Схемата е подробно описана в статията [Как да разпределим разходи по покупка](https://www.unicontsoft.com/cms/node/148), с която е добре да се запознаете, ако темата е нова за Вас. + +```{tip} +Препоръчително е за различните разходи, които ще разпределяте (напр. транспорт), да въведете отделни продукти при продажба, при придобиване и като общи разходи. Тоест трябва да имате веднъж продукт *Транспорт (по придобиване)*, втори продукт - *Транспорт (при продажба)* и отделно *Транспорт (общи разходи)*. +Всички те трябва да бъдат от тип на продукта, настроен като услуга, със съответното осчетоводяване. +``` + +## Методи за разпределение + +Нека направим примерно разпределяне на транспортни разходи, при което доставката е извършена от фирма, различна от доставчика на стоките. + +> Предварително трябва да са въведени и валидирани в системата вътрешнофирмените документи за покупка на стоки - *Документ за покупка* и *Приходен складов документ*. + +Създавате нов вътрешнофирмен документ за покупка, в който е важно да изберете точния продукт за транспортни услуги. В случая това е *Транспорт (по придобиване)*. +Навигирате се до меню **Средства || Разпределение на разходи за придобиване**, с което отваряте формата за избор на свързани документи: + +![](20240411-allocate-acquisition-costs1.png){ class=align-center } + +```{tip} +Опцията *Разпределение на разходи за придобиване* е активна в *Документ за покупка* единствено, когато той е в състояние на редакция. +``` + +В колона *Ред от свързан документ* на реда за нов запис отваряте за избор списъците с приходни складови документи или покупки. Вие решавате с кой от двата списъка ще работите. +Ако изберете списък *Складови документи*, трябва да посочите ПСД с доставката на стоките, върху които ще разпределяте транспортните разходи. Избирайки *Документи за покупка*, посочвате вътрешнофирмения документ с покупката. +Да намерите бързо и лесно точния документ зависи от зададените филтри в съответния списък. + +> Може да маркирате едновременно няколко документа, когато разходът за разпределяне е общ за тях. + +![](20240411-allocate-acquisition-costs2.png){ class=align-center } + +След като сте избрали желания свързан документ, следва да маркирате един, няколко или всички продукти, върху които ще разпределите транспортните разходи. +Системата ще добави на отделен ред всеки един от тях, предлагайки сума за разпределяне на база **Отчетна стойност**. + +![](20240411-allocate-acquisition-costs3.png){ class=align-center } + +```{tip} +Общата сума на разходите за разпределяне е винаги без ДДС. +``` + +След като потвърдите избора, системата разпределя разхода на избраната за това база. + +Освен предложения по подразбиране метод, системата дава възможност за избор между още няколко: + +- **Ръчно** - При него системата "отключва" колона *Сума за разпределяне* и имате пълната свобода да разделите общата сума на разхода по продукти. + +![](20240411-allocate-acquisition-costs4.png){ class=align-center } + +- **Количество по основна мярка** - При този метод системата автоматично разпределя общата сума на разхода спрямо количествата в основна мерна единица. +Което е нашия пример би изглеждало по следния начин: + +![](20240411-allocate-acquisition-costs5.png){ class=align-center } + +- **Количество по допълнителна мярка** - За да използвате този метод, трябва предварително да настроите допълнителни мерки на продуктите. +В примера за всички продукти има добавена допълнителна мярка *Кашон*, съдържащ 10 броя шампоан. Ето как би изглеждало примерното разпределение на разходите: + +![](20240411-allocate-acquisition-costs6.png){ class=align-center } + +- **Нето тегло** - При този метод също е нужна предварителна настройка в панел *Допълнителни* във форма за редакция на продукта. +При разпределението на транспорта системата дава информация с тези настройки в колона *Основа за разпределение на единица* и *Мярка на основата*. + +![](20240411-allocate-acquisition-costs7.png){ class=align-center } + +- **Нето обем** - Методът отново изисква предварителна настройка с нето обем за всеки продукт. Разпределението на разхода ще се извърши на база настроените обеми. Системата визуализира тези настройки в колони *Основа за разпределение на единица* и *Мярка на основата*. + +![](20240411-allocate-acquisition-costs8.png){ class=align-center } + +- **Отчетна цена** - С този метод системата автоматично разпределя общата сума на разхода спрямо единичната цена на продуктите. + +![](20240411-allocate-acquisition-costs9.png){ class=align-center } + +## Разпределение на разходи при общ документ с покупката на стоки + +Има случаи, когато доставчикът издава фактура, включваща както стоката, така и допълнителни услуги - например, извършва транспортирането ѝ. +Тук отново може да разпределите разхода, което става по [описания начин](https://www.unicontsoft.com/cms/node/148), но с една особеност. + +> Документът за покупка трябва да е валидиран с приключен ПСД към него. След което покупката се връща в състояние на редакция. + +![](20240411-allocate-acquisition-costs10.png){ class=align-center } + +Следвате стъпките от меню **Средства || Разпределение на разходи за придобиване**. + +![](20240411-allocate-acquisition-costs11.png){ class=align-center } + +В колона *Ред от свързан документ* посочвате или текущата покупка, или генерирания към нея ПСД. + +![](20240411-allocate-acquisition-costs12.png){ class=align-center } + +Избирате желания метод и завършвате разпределението на разхода за транспорт по гореописания начин. + +## Справки за разпределение на разходите по придобиване + +В системата имате възможност да проверите дали има разпределени разходи по придобиване по няколко начина и в различни справки. + +За сте сигурни, че желаните покупки са разпределени като разходи по придобиване, може да следите колона **Разпределено като разходи за придобиване %**. Тя се намира в списък **Документи за покупка** и ако не е видима, се извежда с десен бутон върху реда с имена на колони - *Изглед на списък*. + +![](20240411-allocate-acquisition-costs13.png){ class=align-center } + +Информация за разпределени разходи може да видите и в панел **Свързани документи** на документа за покупка, съдържаща разхода: + +![](20240411-allocate-acquisition-costs14.png){ class=align-center } + +## Счетоводни настройки и документи + +Най-подходящият начин разпределянето на разходи по придобиване да се отрази счетоводно е чрез използване на транзитна сметка от гр. 30. Обикновено това е с/ка 301. +Уверете се, че в **Номенклатури || Сметкоплан** за тази сметка има поставена отметка в колона *Признак задължителен*. Същото важи и за сметка 304. +Така в генерираните счетоводни записи системата ще цитира отделните продукти. + +> Въведените през списък *Продукти и материали* номенклатури се визуализират в **Счетоводство** като списък *Признаци*. + +Следващите задължителни настройки са в **Счетоводство || Автоматичен осчетоводител**. + +За група **Документи за покупка** трябва да направите настройки в *Кореспонденции*. Както ще видите на примерното изображение, създават се отделни редове за всички типове продукти, които ще се осчетоводяват през транзитната сметка. +Като резултат, в счетоводните документи към фактурите за покупка стоките и допълнителните разходи се отнасят по с/ка 301. + +![](20240411-allocate-acquisition-costs15.png){ class=align-center } + +Необходими са настройки и за група **Складови документи**. Целта тук е в счетоводния документ към ПСД стоките да се прехвърлят по основната с/ка 304. +Настройте за *Водеща сметка* в документ тип *ПСД* осчетоводяването на транзитната с/ка 301 да е в кредит. В *Кореспонденции* направете настройка за осчетоводяване на приходните документи по дебита на с/ка 304. +Разгледайте маркираните редове на изображението по-долу: + +![](20240411-allocate-acquisition-costs16.png){ class=align-center } + +В счетоводните документи, след като сте изпълнили задължителните условия, ще имате подобни записвания: + +- В документа за доставка на стоки счетоводната статия е една. Единствената особеност тук е, че стоките са заприходени чрез избраната за транзитна с/ка 301. + +**ФПок (доставка на стоки)** +```{admonition} Статия +|Дт Сметка|Кт Сметка|Признак|Сума| +|-------------|------------|---------------|-------------| +|301 | |Шампоан 150 мл |750.00 лв. | +|301 | |Шампоан 530 мл |1666.67 лв. | +|301 | |Шампоан 150 мл |1333.33 лв. | +|4531 | | |750.00 лв. | +| |4011 | |4500.00 лв. | +``` + +- При осчетоводяването на фактурата за транспорт, като разход за разпределение, отново участва транзитната сметка. +Сумата от нея - 83.33 лв., ще бъде разпределена към доставната стойност на продуктите. + +**ФПок (разходи за разпределение)** +```{admonition} Статия +|Дт Сметка|Кт Сметка|Признак|Сума| +|-------------|------------|----------|-----------| +|301 | |Транспорт |83.33 лв. | +|4531 | | |16.67 лв. | +| |4011 | |100.00 лв. | +``` + +- Същинското разпределение на разходи става в *ПСД*. В този счетоводен документ за всеки продукт се генерира отделна статия. +В следващия пример виждате как доставната цена и разпределените разходи от с/ка 301 формират новата себестойност на продукта в с/ка 304. + + **ПСД (доставка на стоки)** +```{admonition} Статия 1 +|Дт Сметка|Кт Сметка|Признак|Сума| +|-------------|------------|---------------|-----------| +|304 | |Шампоан 150 мл |766.67 лв. | +| |301 |Шампоан 150 мл |750.00 лв. | +| |301 |Транспорт |16.67 лв. | +``` + +![](20240411-allocate-acquisition-costs17.png){ class=align-center } + +> За да разпределим разходи по придобиване, трябва покупката на стоките да е валидирана с приключен приходен складов документ към нея. +> Документът за покупка, съдържащ разходите за разпределяне, трябва да е в състояние на редакция. +> Върху един *Документ за покупка* може да разпределим един или няколко разхода. +> Може да разпределим един разход както върху една, така и върху няколко *Документа за покупка*. +> Може също да разпределим разход, когато с покупката на стоки са получени в общ документ. \ No newline at end of file diff --git a/_sources/blog/20240416-allocate-sales-costs.md b/_sources/blog/20240416-allocate-sales-costs.md new file mode 100644 index 00000000..c32ba08a --- /dev/null +++ b/_sources/blog/20240416-allocate-sales-costs.md @@ -0,0 +1,122 @@ +```{only} html +[Нагоре](000-index) +``` + +# Разпределение на разходи за продажби + +- [Въведение](https://docs.unicontsoft.com/blog/20240416-allocate-sales-costs.html#id2) +- [Методи на разпределение](https://docs.unicontsoft.com/blog/20240416-allocate-sales-costs.html#id3) +- [Справки за разпределение на разходите по продажби](https://docs.unicontsoft.com/blog/20240416-allocate-sales-costs.html#id4) + + +## Въведение + +Системата разполага с инструмент, чрез който лесно да разпределите допълнителни разходи, свързани с една или няколко продажби. Такива разходи могат да бъдат транспорт, опаковане, застраховка, монтаж и други. +Тези разходи не са включени в себестойността на продуктите, както се случва при разпределнието на разходи по придобиване. + +> Правилно разпределените разходи по продажби намаляват постъпленията от една или няколко избрани продажби. + +Препоръчително е за различните разходи, които ще разпределяте (напр. транспорт), да въведете отделни продукти при продажба, при придобиване и като общи разходи. Тоест трябва да имате като отделни продукти *Транспорт (по придобиване)*, *Транспорт (при продажба)* и *Транспорт (общи разходи)*. +Всички те трябва да бъдат от тип на продукта, настроен като услуга, със съответното осчетоводяване. + +```{tip} +Предварително трябва да са въведени и валидирани в системата вътрешнофирмените документи за продажбата на продукт/и. +``` +## Методи на разпределение + +Нека направим разпределяне на транспортни разходи, при следната ситуация - продали сте стока, за чиято доставка сте поели ангажимент. Наели сте външна фирма за транспорта и разходът е за Ваша сметка. + +> При въвеждане на *Документ за покупка* с транспортната услуга е важно да изберете настроения за целта продукт. + +В нашия пример това ще бъде *Транспорт (по продажби)*, от тип на продукта *Разходи за външни услуги*, който може да се осчетоводява автоматично по с/ка 602. +Следва да въведете в системата *Документа за покупка* с транспорта. Попълвате нужните реквизити и се навигирате до меню **Средства || Разпределение на разходи за продажба**. + +```{tip} +Опцията *Разпределение на разходи за продажби* е активна в *Документ за покупка* единствено, когато той е в състояние на редакция. +``` + +![](20240416-allocate-sales-costs1.png){ class=align-center } + +В така отворената форма *Разпределение*, заставайки на реда за нов запис, отваряте списък с продажби в колона *Ред от сързан документ*. Трябва да маркирате документа, върху която ще разпределите разходи. +Да намерите бързо и лесно точния документ зависи от зададените филтри в съответния списък. + +> Може да маркирате едновременно няколко продажби, когато разходът за разпределяне е общ за тях. + +![](20240416-allocate-sales-costs2.png){ class=align-center } + +На следващата стъпка трябва да изберете за кои продукти ще разпределите транспортните разходи. +Системата ще добави на отделен ред всеки един от тях, предлагайки сума за разпределяне на база **Продажна стойност**. + +![](20240416-allocate-sales-costs3.png){ class=align-center } + +```{tip} +Общата сума на разходите за разпределяне е винаги без ДДС. +``` + +След като потвърдите избора, системата разпределя разхода на избраната за това база. + +Освен предложения по подразбиране метод, системата дава възможност за избор между още няколко: + +- **Ръчно** - При него системата "отключва" колона *Сума за разпределяне* и имате пълната свобода да разделите общата сума на разхода по продукти. + +![](20240416-allocate-sales-costs4.png){ class=align-center } + +- **Количество по основна мярка** - При този метод системата автоматично разпределя общата сума на разхода спрямо количествата в основна мерна единица. +Което е нашия пример би изглеждало по следния начин: + +![](20240416-allocate-sales-costs5.png){ class=align-center } + +- **Количество по допълнителна мярка** - За да използвате този метод, трябва предварително да настроите допълнителни мерки на продуктите. +В примера за всички продукти има добавена допълнителна мярка *Кашон*, съдържащ 10 броя шампоан. Ето как би изглеждало примерното разпределение на разходите: + +![](20240416-allocate-sales-costs6.png){ class=align-center } + +- **Нето тегло** - При този метод също е нужна предварителна настройка в панел *Допълнителни* във форма за редакция на продукта. +При разпределението на транспорта системата дава информация с тези настройки в колона *Основа за разпределение на единица* и *Мярка на основата*. + +![](20240416-allocate-sales-costs7.png){ class=align-center } + +- **Нето обем** - Методът отново изисква предварителна настройка с нето обем за всеки продукт. Разпределението на разхода ще се извърши на база настроените обеми. Системата визуализира тези настройки в колони *Основа за разпределение на единица* и *Мярка на основата*. + +![](20240416-allocate-sales-costs8.png){ class=align-center } + +- **Продажна цена** - С този метод системата автоматично разпределя общата сума на разхода спрямо единичната цена на продуктите. + +![](20240416-allocate-sales-costs9.png){ class=align-center } + + +## Справки за разпределение на разходите по продажби + +В системата имате възможност да проверите дали има разпределени разходи по продажба в няколко справки. +Първата от тях може да намерите в **Други справки || Разходи по продажби**. След като заредите справката, в списъка ще видите единствено продажби, върху които са разпределени разходи. Справката дава информация за количеството и цената на всички разходи. + +![](20240416-allocate-sales-costs10.png){ class=align-center } + +**Мениджмънт || Марж и рентабилност** + +За да заредите справката с информация за разпределените допълнителни разходи, във филтъра избирате специално предназначения за това *Шаблон* - **По документи с информация за допълнителни разходи**. + +![](20240416-allocate-sales-costs11.png){ class=align-center } + +В справката ще получите цялостна информация за продажбите с цена на придобиване, продажна цена( вкл. коригиращи документи), допълнителни разходи и съответните марж и надценка. + +![](20240416-allocate-sales-costs12.png){ class=align-center } + +Освен в посочените справки, информация за разпределени разходи може да видите и в панел **Свързани документи**: +- В документа за продажба, към която има допълнителни разходи: + +![](20240416-allocate-sales-costs13.png){ class=align-center } + +- В документа за покупка, съдържащ разпределени разходи по продажба/и: + +![](20240416-allocate-sales-costs14.png){ class=align-center } + +За сте сигурни, че желаните покупки са разпределени като разходи по продажби, може да следите колона **Разпределено към продажби %**. Тя се намира в списък **Документи за покупка** и ако не е видима, се извежда с десен бутон върху реда с имена на колони - *Изглед на списък*. + +![](20240416-allocate-sales-costs15.png){ class=align-center } + + +> За да разпределим разходи по продажба, трябва документът с продажба на стоките да е приключен. +> Документът за покупка, съдържащ разходите за разпределяне, трябва да е в състояние на редакция, докато разпределим разходите. +> Върху един *Документ за продажба* може да разпределим един или няколко разхода. +> Може да разпределим един разход както върху една, така и върху няколко *Документа за продажба*. \ No newline at end of file diff --git a/_sources/blog/20240423-fixed-assets.md b/_sources/blog/20240423-fixed-assets.md new file mode 100644 index 00000000..7e65666d --- /dev/null +++ b/_sources/blog/20240423-fixed-assets.md @@ -0,0 +1,166 @@ +```{only} html +[Нагоре](000-index) +``` + +# Дълготрайни активи + +- [Настройки](https://docs.unicontsoft.com/blog/20240423-fixed-assets.html#id2) +- [Амортизация на дълготрайни активи](https://docs.unicontsoft.com/blog/20240423-fixed-assets.html#id3) +- [Първоначално придобиване на ДА](https://docs.unicontsoft.com/blog/20240423-fixed-assets.html#id4) +- [Печат на протокол за въвеждане в експлоатация](https://docs.unicontsoft.com/blog/20240423-fixed-assets.html#id5) +- [Консервации на ДА](https://docs.unicontsoft.com/blog/20240423-fixed-assets.html#id6) +- [Подобрения на ДА](https://docs.unicontsoft.com/blog/20240423-fixed-assets.html#id7) + +## Настройки + +**Дълготрайни активи** е отделна номенклатура, която системата третира аналогично на **Продукти и материали** и затова попадат в общ списък. Така, въпреки специфичните си настройки, активите може да се използват в документите за покупка и продажба. +При [въвеждането на ДА](https://www.unicontsoft.com/cms/node/100) системата изисква някои задължителни реквизити, отбелязани с червен маркер. Такива са наименование на *ДА*, стойност и дата на придобиване, дата на въвеждане в експлоатация, счетоводна група и категория(по чл. 55 от ЗКПО). + +Счетоводни групи, методи за амортизация, коефициент на преоценка и категории по чл.55 (ЗКПО) могат да бъдат въведени и редактирани от **Номенклатури || Референтни номенклатури || Дълготрайни активи**. Тези настрийки са базови за *ДА* и трябва да се направят преди създаването на нов актив. +Ако все още не сте направили настройките, темата [Как да въведем Групи ДА](https://www.unicontsoft.com/cms/node/152) ще е полезна. По описания в нея начин се въвеждат и останалите базови за *ДА* настройки. + +Нека въведем в системата един примерен актив - *Лек автомобил*, който попада в *Категория V* с амортизационната норма 25% на година. +Автомобилът е закупен на 23.04.2024 г. за 39'000 лв. и ще бъде въведен в експлоатация на 01.05.2024 г. + +![](20240423-fixed-assets1.png){ class=align-center } + +> Препоръчително е да запишете въведените до момента данни, преди да продължите с настройките. + +В **Допълнителни** системата е попълнила автоматично задължителните полета, свързани с данъчния и със счетоводния амортизационен план. +Тук може да добавите също сума за неамортизируема остатъчна стойност на *ДА*. + +```{tip} +За *ДА* могат да се настроят също и различни дименсии, както е при **Продукти и материали**. +``` + +![](20240423-fixed-assets2.png){ class=align-center } + +На третия панел **Списъци** ще откриете настройки за подобрения, консервации и амортизационните норми и план на *ДА*. +Докато първите две са възможни при определени обстоятелства, то амортизацията е неизбежна след пускане на актива в експлоатация. +Затова следва да направите нужните настройки за амортизационни норми и амортизационен план. + +Използвайки бутона *Генериране* в лентата с инструменти ще изберете амортизационна норма(или период на експлоатация) и метод на амортизация. + +![](20240423-fixed-assets3.png){ class=align-center } + +Системата предлага по подразбиране *Линеен метод* на амортизация. При него годишните амортизационни квоти са еднакви за целия амортизационен период. +За генерацията на амортизационен план трябва да попълните или поле *Период на експлоатация*, или *Амортизационна норма*. След което потвърждавате избора и записвате промените. + +![](20240423-fixed-assets4.png){ class=align-center } + +Вече може да разгледате генерираните примерни амортизационни планове за този *ДА* - данъчен и счетоводен. + +![](20240423-fixed-assets5.png){ class=align-center } + +```{tip} +Ако пожелаете да редактирате амортизационните норми в избран *ДА*, респ. амортизационния му план, може да повторите описаната вече генерация. +``` + +Системата дава възможност за избор от следните методи на амортизация: + +- *Константно дегресивен метод* със снижаващ се остатък. +- *Линеен метод* с годишните амортизационни квоти, които са еднакви за целия амортизационен период. +- *Метод на сумата на числата* +- *Неравномерно дегресивен метод* +- *Прогресивен нелинеен метод* +- *Произволен метод* + +## Амортизация на ДА - справки и генерация на счетоводни документи + +Генерираните в системата амортизационни планове могат да бъдат видени отделно за всеки актив. Както споменахме, това става във формата за редакция на избрания *ДА*. +Също така има справка, включваща всички активи, достъпна в **Счетоводство || Печат на амортизационен план*. +Във филтъра може да изберете вида и типа на амортизационния план, период и други. + +![](20240423-fixed-assets6.png){ class=align-center } + +Справката, която се зарежда според настроените филтри, включва всички *ДА* със състояние *Активен*. + +![](20240423-fixed-assets7.png){ class=align-center } + +> Системата разполага с инструмент за автоматична генерация на счетоводни документи с предложените амортизационни квоти. +> Намира се в меню **Счетоводство || Генерация на ДА**. + +За да бъдат създадени счетоводни записвания за всички активни *ДА*, трябва да потвърдите желания период. +Ако поставите отметка за *Приключване*, системата ще валидира счетоводните документи. Пропуснете тази настройка, ако предпочитате да приключите документите ръчно, след като сте проверили тяхното съдържание. + +![](20240423-fixed-assets8.png){ class=align-center } + +По този начин в меню **Счетоводство || Счетоводни документи** са генерирани по месеци документи от тип **АмПл**. +От момента на приключването им, данните в тях ще бъдат видими в счетоводните справки. + +![](20240423-fixed-assets9.png){ class=align-center } + +## Първоначално придобиване на ДА + +Първоначалното придобиване на *ДА* се отразява в системата с въвеждане на документа за неговата покупка. Ако предварително не сте създали актива като номенклатура, може да го направите и по време на обработка на покупката. +Ще покажем такова въвеждане на *ДА* с примерна фактура за покупка на лаптоп Lenovo на стойност 1800 лв. +За целта в **Търговска система || Документи за покупка** създавате [нов документ](https://www.unicontsoft.com/cms/node/23). + +> В този случай отново важи правилото, когато работите с вътрешнофирмени документи, да започнете с документ тип *Покупка*. + +За да въведете *ДА*, на реда за нов запис отваряте списъка с продукти. Създавате нов продукт *Лаптоп Lenovo* от бутона в лентата с инструменти или с десен бутон на мишката - *Нов продукт*. +Обзавеждате нужните реквизити, след което записвате настройката. +Имайте предвид, че за да настроите поле *Тип*, предварително трябва да сте въвели [типове продукти](https://www.unicontsoft.com/cms/node/9). + +![](20240423-fixed-assets10.png){ class=align-center } + +В списъка с продукти вече фигурира *Лаптоп lenovo*, като ще забележите разлика между неговата икона и тези на вече въведени *ДА*. Така системата разграничава номенклатурите, отговарящи на специфичните изисквания и настроени като *ДА*. + +> Въведените *ДА* през **Номенклатури || Дълготрайни активи** се визуализират и в списък **Продукти и материали**. +> Обратното не е валидно. + +![](20240423-fixed-assets11.png){ class=align-center } + +Според разпределените роли и правата в системата е възможно номенклатурата **Дълготрайни активи** да не е достъпна за всеки. +Именно затова, до момента имате въведен *Лаптоп Lenovo* като продукт, което е достатъчно да завършите въвеждането на покупката. + +![](20240423-fixed-assets12.png){ class=align-center } + +На следващ етап настройката на продукта *Лаптоп Lenovo* трябва да бъде довършена, така че системата да го третира като дълготраен актив. +Това става от списък **Продукти и материали**. С десен бутон на мишката върху продукта избирате **Други средства || Редакция ДА**. + +![](20240423-fixed-assets13.png){ class=align-center } + +В отворената форма за редакция добавяте настройките, показани в началото на темата. + +## Печат на протокол за въвеждане в експлоатация + +Системата дава възможност за печат на Протокол за въвеждане в експлоатация на дълготраен амортизируем актив, съгл. чл. 58 от ЗКПО. +За целта, от картон на ДА (форма за редакция на ДА) използвайте бутоните *Преглед* или *Печат* от лентата с инструменти. Автоматично в протокола се обзавеждат нужните полета според настроените в ДА данни. + +![](20240423-fixed-assets14.png){ class=align-center } + +## Консервации на ДА + +Когато дълготраен актив е изведен от употреба за минимум дванадесет месеца, без значение от причините, се допуска неговата консервация. След изтичането на периода на консервация се очаква неговото повторно въвеждане в употреба. +Начисляването на данъчни амортизации се преустановява от месеца, следващ месеца на преустановяване на използване на ДА. Начисляването се възобновява от началото на месеца на връщането на актива в експлоатация. Данъчният амортизируем актив не се отписва от данъчния амортизационен план. + +Период на консервация може да настроите от форма за редакция на ДА в *Списъци || Консервации*. Тук посочете началната и крайната дата на извеждане от експлоатация, като може да добавите коментар с обстоятелствата, налагащи това. + +![](20240423-fixed-assets15.png){ class=align-center } + +## Подобрения на ДА + +Подобрение на ДА е извършването на последващи разходи, свързани с актива, които увеличават неговата икономическа изгода. +Разходите за извършване на подобрения подлежат на капитализиране - увеличават отчетната стойност на актива. + +В системата сумата на извършените разходи се посочва в поле *Стойност*, избира се и *Дата на подобрението*. Настройките ще откриете в картон на ДА, панел *Списъци || Подобрения*. + +![](20240423-fixed-assets16.png){ class=align-center } + +В чл. 63 от ЗКПО е посочено, че данъчната амортизируема стойност се увеличава от началото на месеца, през който са завършени последващите разходи. + +![](20240423-fixed-assets17.png){ class=align-center } + +След записване на промените системата актуализира данните в данъчния и в счетоводния амортизационен план. + +> Ако подобрението увеличава срока на полезно ползване на ДА, препоръчително е да се въведе нов актив. + +--- + +- Въведените *ДА* през **Номенклатури || Дълготрайни активи** се визуализират и в списък **Продукти и материали**. Тоест, *ДА* могат да участват в търговски документи, както участват продуктите. +- Задължителни са настройките за амортизационни норми и амортизационен план на *ДА*. +- Всички настроени *ДА* участват в справката **Печат на амортизационен план*. +- Системата разполага с инструмент за автоматична генерация на счетоводни документи с предложените амортизационни квоти. +- Възможност за печат на Протокол за въвеждане в експлоатация на дълготраен амортизируем актив, съгл. чл. 58 от ЗКПО + diff --git a/_sources/blog/20240507-attached-files.md b/_sources/blog/20240507-attached-files.md new file mode 100644 index 00000000..e489d2e7 --- /dev/null +++ b/_sources/blog/20240507-attached-files.md @@ -0,0 +1,104 @@ +```{only} html +[Нагоре](000-index) +``` + +# Прикачени файлове +- [Въведение](https://docs.unicontsoft.com/blog/20240507-attached-files.html#id2) +- [Прикачване на файл за контрагент](https://docs.unicontsoft.com/blog/20240507-attached-files.html#id3) +- [Прикачване на файл към продукт](https://docs.unicontsoft.com/blog/20240507-attached-files.html#id4) +- [Прикачване на файл в документ](https://docs.unicontsoft.com/blog/20240507-attached-files.html#id5) + +## Въведение + +Прикачените файлове са удобен начин за съхраняване и споделяне на информация. Системата дава възможност да прикачите един или няколко файла, както в някои от номенклатурите, така и в документи от **Търговска система**. +Това предоставя на отделните потребители бърз достъп до важни детайли от един общ източник. Една от ползите е улесняване на комуникацията и предотвратяване на грешки. +Данните лесно могат да бъдат добре систематизирани от меню **Номенклатури || Медия каталог**. + +![](20240507-attached-files1.png){ class=align-center } + +За да се ориентирате бързо сред различните файлове, желателно е да ги организирате в подпапки, използвайки достатъчно ясни имена. +Така ще избегнете неудобните и безразборни списъци. +Можете да създавате и редактирате папки чрез бутоните от лентата с инструменти или с десен бутон на мишката. + +> Условието потребителите да виждат прикачените файлове е да имат достъп до съответната локация. + +Процесът на прикачване на файл в системата не се различава особено от прикачването в имейл, чат приложение и т.н. +Първо маркирате желаната папка от списъка вляво. Може да използвате функцията за влачене и пускане с левия бутон на мишката. +Ако този начин не е удобен, използвайте десен бутон на мишката върху полето вдясно и изберете опция **Нова медия**. + +![](20240507-attached-files2.png){ class=align-center } + +Попълвате задължителните реквизити *Име* и *Тип* на файла, а от бутона в края на полето *Източник* посочвате пътя до желания файл. + +![](20240507-attached-files3.png){ class=align-center } + +При импорта, според типа на файла, системата извежда различно съобщение за потвърждение на избора. +Промените трябва да бъдат записани, след което файлове ще са достъпни за прикачване в **Контрагенти**, **Продукти и материали**, както и в някои документи. + +## Прикачване на файл за контрагент + +Всяка информация, касаеща даден контрагент, може да бъде оформена в документ, таблица, изображение или друго и добавена към настройките му. +Можете да добавяте множество на брой и различен тип файлове. За целта отваряте форма за редакция на избрания контрагент, навигирайки се до панел **Списъци || Прикачени файлове**. +Ако файлът не е въведен предварително, това може да стане на момента чрез функцията на влачене и пускане (drag&drop). + +Ако файлът е предварително качен, в колона *Файл* на реда за нов запис посочвате пътя му до папката от **Медия каталог**. + +Ето как изглеждат вече прикачени файлове тип *Изображение* и тип *Документ*: + +![](20240507-attached-files4.png){ class=align-center } + +На реда към всеки от файловете може да добавите и *Забележка*. +Промените трябва да бъде записани. + +```{tip} +Ако настроите по подразбиране прикачен файл тип *Изображение*, той ще се визуализира в колона *Миниатюри* от списъка с контрагенти. +Същото изображение се показва и в панел **Основни** на формата за редакция на контрагент. +``` + +![](20240507-attached-files5.png){ class=align-center } + +В списък **Контрагенти** системата дава информация за общо прикачените файлове за всеки един контрагент. За целта трябва да изведете колона *Брой прикачени файлове*. + +![](20240507-attached-files6.png){ class=align-center } + +## Прикачване на файл към продукт + +Често към продуктите е важно да бъде добавено изображение, галерия, видео с инструкции или други файлове с полезна информация. +Тези файлове може или да са предварително въведени чрез **Медия каталог**, или да се прикачват на момента. + +Нека добавим примерно изображение от форма за редакция на продукт, панел **Списъци || Прикачени файлове**. + +Ако предварително сте въвели изображението в желаната папка, в колона *Файл* посочвате пътя до него. + +![](20240507-attached-files7.png){ class=align-center } + +Когато искате да качите файла текущо, използвайте drag&drop функцията. Системата ще предложи към коя папка в **Медия каталог** да добави файла. + +![](20240507-attached-files8.png){ class=align-center } + +За да бъдат запазени настройките, промените трябва да бъде записани. + +```{tip} +Ако настроите по подразбиране прикачен файл тип *Изображение*, той ще се визуализира в колона *Миниатюри* от списъка с продукти. +Същото изображение се показва и в панел **Основни** на формата за редакция на продукта. +``` +![](20240507-attached-files9.png){ class=align-center } + +## Прикачване на файл в документ + +Типовете документи, в които можете да добавите файл, са продажби, покупки, заявки, складови документи и договори. Във всеки един от тях опцията отново е налична в панел **Списъци**. +И тук прикачването на файлове не е по-различно от вече разгледаните в темата. Файловете може или да са въведени предварително в папките от **Медия каталог**, или да се добавят в момента. + +> Документът, в който ще прикачвате файл, трябва да е в състояние на *Редакция*. +> Файл може да се прикачи при състояние *Приключен* единствено когато се използва функцията drag&drop. + +В **Списъци || Прикачени файлове** от полето *Файл* избирате желания документ, след което покупката трябва да се приключи. + +![](20240507-attached-files10.png){ class=align-center } + +--- +- Прикачените файлове могат да бъдат в различен формат, като имат ограничение от ...MB всеки. +- За да бъдат файловете видими за всеки, потребителите на системата трябва да имат достъп до местоположението им. +- Удобно ще е в **Медия каталог** предварително да се създаде организация на папките, в които ще се добавят файловете. +- Файлове могат да се прикачват в панел **Списъци** от форма за редакция на контрагенти, продукти и документи - продажби, покупки, заявки, складови документи и договори. +- Когато се прикачва файл в документ, той трябва да е в състояние на *Редакция*, след което отново да се приключи. Файл може да бъде прикачен при състояние *Приключен* единствено с влачене и пускане - функция drag&drop. \ No newline at end of file diff --git a/_sources/blog/20240517-working-periods.md b/_sources/blog/20240517-working-periods.md new file mode 100644 index 00000000..4fe2d856 --- /dev/null +++ b/_sources/blog/20240517-working-periods.md @@ -0,0 +1,113 @@ +```{only} html +[Нагоре](000-index) +``` + +# Работни периоди + +- [Въведение](https://docs.unicontsoft.com/blog/20240517-working-periods.html#id2) +- [Разрешителен работен период](https://docs.unicontsoft.com/blog/20240517-working-periods.html#id3) +- [Настройка на забранителен период след годишно счетоводно приключване](https://docs.unicontsoft.com/blog/20240517-working-periods.html#id4) +- [Настройка на забранителен период след подадени месечни отчети по ЗДДС](https://docs.unicontsoft.com/blog/20240517-working-periods.html#id5) + +## Въведение + +Има ситуации, когато създаването или редактирането на документи в минал/бъдещ период би довело до съществени грешки. Тогава би било полезно определени действия да бъдат ограничавани за документите, попадащи в тези времеви интервали. +С функционалност **Работни периоди**, която ще откриете в **Администрация**, системата предоставя именно такава възможност. + +> Работните периоди дават възможност за настройка, при която документите от избрани периоди остават видими, но недостъпни за корекции. + +Процесът при всички случаи е еднакъв. Започва със задължителното създаване на разрешителен работен период. По желание допълнително се добавят работните периоди със забранителни настройки. + +Нова настройка **Работен период** се създава с бутон *Нов* - от лентата с инструменти или с десен бутон на мишката. +Във формата за редакция разполагате с всички необходими реквизити за детайлна настройка: + +- **Име** - Когато попълвате наименование, е удобно да посочите и дали работният период е разрешаващ или забраняващ. Името може да бъде редактирано по всяко време. +- **От дата** и **До дата** - С тях, разбира се, контролирате продължителността на работния период. +- **Активен** - Както навсякъде в системата, поставената отметка потвърждава, че настройката е в сила. С махане на отметката ще деактивирате работния период. + +![](20240517-working-periods1.png){ class=align-center } + +- **Функционалност** - В тази колона може да посочите функционалност на системата, за която ще се отнасят настройките от реда. Ако настройките касаят всички функционалности, оставете полето празно. В противен случай всяка от тях се настройва на отделен ред. +- **Тип док.** - Системата позволява тук да правите по-детайлни настройки по тип на документа. Използвайте тази колона, когато настройките не се отнасят за цяла функционалност, а само за избрани типове документи от нея. +- **Група** - Ако настройките на реда ще се отнасят еднакво за всяка група потребители, в полето изберете *Всички*. Когато конфигурацията на ограниченията е различна за отделните групи, се изисква всяка от тях да бъде на отделен ред. Групите и разпределянето на потребителите в тях се настройват предварително от **Администрация || Потребители и групи**. +- **Права** - В полето от тази колона отваряте форма за редакция *Права на групи*. Имате два изгледа на опциите, участващите в списъка - *Общи* и *Разширени*. +Именно тук, маркирайки с *Разрешени* или *Забранени**, конфигурирате ограниченията. +За прецизна настройка на действията, които ще се разрешават/забраняват, използвайте изглед *Разширени*. +Ако настройвате разрешаващ работен период, в *Разрешени* отбележете само позволените опции. И обратното - при забраняващ работен период е достатъчно да поставите отметки единствено в *Забранени*. + +![](20240517-working-periods2.png){ class=align-center } + +Забранителните настройки имат по-голяма тежест от разрешителните и определят параметрите на ограниченията. + +Това е основно правило при конфигурирането на работните периоди. Ще покажем как на тази база лесно да организирате настройките с един разрешителен и няколко забранителни периоди. + +В темата ще разгледаме два от най-честите примери, когато са удачни забранителни настройки - след годишно счетоводно приключване и след подадени месечни отчети по ЗДДС. + +## Разрешителен работен период + +Още при стартиране на работа със системата задължително е настроен разрешителен работен период. Най-удачно е той да бъде настроен общо за всички групи потребители като безсрочен. +При това положение на реда за нов запис ще са обзаведени единствено колона **Групи** с *Всички* и колона **Права** - *Разрешени: (Всички)*. +За да е безсрочен разрешителният период, полета **От дата** и **До дата** остават празни. + +![](20240517-working-periods3.png){ class=align-center } + +```{tip} +Ако по някаква причина решите да посочите начална дата, създаване/редакция на документ с предходна дата няма да е позволено. +Аналогично, при настроена крайна дата, създаване/редакция на документи с последваща дата не е възможно. +``` + +## Настройка на забранителен период след годишно счетоводно приключване + +След счетоводното приключване на отчетен период и подадени ГФО, ГДД, статистически форми към НСИ, е най-добре да се "заключи" цялата отминала година. +Достъпът до документите може да остане разрешен. Забраняват се, обаче, всяка промяна на състоянието им, създаване на нов, генерация, редакции или изтриване. + +В следващия пример ще покажем как може да "заключите" всички типове документи за период, обхващащ цялата отминала година. +Въведените забрани ще се отнасят само за две от предварително настроените в системата групи. + +Създайте нов работен период и изберете подходящо име, така че след това лесно да се ориентирате в списъка с всички работни периоди. + +![](20240517-working-periods4.png){ class=align-center } + +В полетата **От дата** и **До дата** въведете съответно началната (1. януари) и крайната дата (31. декември). +Тъй като настройките ще се отнасят за всички документи, на реда за нов запис оставете празни полетата в колони **Функционалност** и **Тип док.**. +Продължете с колона **Група**, където посочвате първата група потребители, за която ще има ограничения. А конкретните права на групи трябва да настроите във формата за избор от колона **Права**. Списъкът с права има два изгледа - *Общи* и *Разширени* настройки. + +![](20240517-working-periods5.png){ class=align-center } + +За целите на текущия пример раздел *Общи* е по-удобен. Достатъчно е да маркирате първите две опции - *Промяна на състояние* и *Работа с детайли*, след което потвърдете настройките. +Продължете по същия начин, добавяйки отделен ред за всяка следваща група потребители. +Групите, които не участват в работен период *Забрана 2023 г.*, ще продължат да имат настроените в разрешителния работен период права. + +```{tip} +Ако решите да направите забранителни настройки, валидни за всички потребители, създайте само един ред с колона **Група: Всички**. Конкретните ограничения отново настройте в колона **Права**. +Завършвайте настройките винаги със *Запис* на направените промени. +``` + +## Настройка на забранителен период след подадени месечни отчети по ЗДДС + +При фирмите, ежемесечно подаващи справка-декларация и отчетни регистри от ЗДДС, е желателно да се "заключат" някои документи от отминалите месеци в текущата година. +Това са документите за покупка и продажба, данни от които се декларират в НАП. И тъй като всякакво разминаване в информацията е нежелателно, системата предлага инструмент да го избегнете напълно. +За целта може да създадете **Работен период**, обхващащ всички отминали месеци от януари т.г. до последния месец с подаден ДДС. Идеята е да използвате този един запис, който ще редактирате всеки месец, променяйки крайната дата на периода. + +Вече сте запознати с принципите и стъпките при създаване на настройка **Работен период**. Тук ще дадем идея с примерна настройка, която да създадете в подобен порядък. +На новодобавения работен период ще дадем наименование **Забрана покупки и продажби след подадени ДДС регистри**. Използвайте такова име за периода, което да отговаря най-добре на Вашите нужди. +За начална дата изберете 01. януари, като тази дата след това не се променя. Крайната дата на периода, обаче, трябва да актуализирате всеки месец. Така, ако сте подали ДДС регистрите за месец април, в **До дата** посочвате последния ден от 04. месец. Веднага щом подадете данните за 05. месец, редактирайте **До дата** с 31. май и т.н. + +![](20240517-working-periods6.png){ class=align-center } + +Тези настройки имат смисъл, ако за всички потребители се "заключат" всички типове документи за покупка и продажба. +Такава настройка се постига, когато на реда за нов запис във **Функционалност** посочите *Документи за продажба*. Не трябва да цитирате отделните видове в колона **Док. тип** - тя остава празна. +Остава да посочите за кои потребители ще важи забраната. Когато тя ще се отнася еднакво за всички, в колона **Група** изберете *Всички*. +Избраните ограничения за промяна на състояние и работа с детайли в продажби посочвате в колоната **Права**. Във формата за редакция, която ще отворите от полето, маркирайте съответните опции със *Забранени*. + +![](20240517-working-periods7.png){ class=align-center } + +Така направените настройки за продажбите трябва да повторите и за покупки. Това означава да добавите отделен ред с **Функционалност** - *Документи за покупка*. Останалите настройки на реда са аналогични с тези при продажби. + + +--- +- Задължително е да има настроен разрешаващ работен период, докато забранителните са пожелателни. +- Документите, попадащи в забранителните работни периоди, могат да остават видими, но недостъпни за корекции. +- Забранителните настройки имат по-голяма тежест от разрешителните. +- **Работни периоди** могат да се настройват както общо за всички потребители, така и за предварително определени групи. +- Всеки един работен период може да бъде деактивиран и активиран повторно по всяко време. diff --git a/_sources/blog/20240522-price-lists-and-discount-schemes.md b/_sources/blog/20240522-price-lists-and-discount-schemes.md new file mode 100644 index 00000000..4568912e --- /dev/null +++ b/_sources/blog/20240522-price-lists-and-discount-schemes.md @@ -0,0 +1,118 @@ +```{only} html +[Нагоре](000-index) +``` + +# Ценови листи и схеми с търговски отстъпки + +- [Ценови листи](https://docs.unicontsoft.com/blog/20240522-price-lists-and-discount-schemes.html#id2) +- [Промоции](https://docs.unicontsoft.com/blog/20240522-price-lists-and-discount-schemes.html#id3) +- [Търговски отстъпки](https://docs.unicontsoft.com/blog/20240522-price-lists-and-discount-schemes.html#id4) + +## Ценови листи + +Ценовите листи представляват списъци с продукти и цени, чието прилагане в документите за покупка и продажба обзавежда цената за всеки от настроените продукти. Системата позволява създаването и поддържането на множество такива списъци. Така има възможност за настройка освен на общи ценови листи, така и на персонализирани - различни за отделни контрагенти. + +> **Ценови листи** е номенклатура, която може да бъде настроена ръчно, или да се използва автоматично ценообразуване. + +При първия вариант всяка една от цените по продукти се въвежда ръчно. Обикновено се използва, когато няма ясно установена надценка или база, върху която да се ценообразува. За системата такава база могат да бъдат: вече настроена друга основна ценова листа, последните доставни цени или среднопретеглените цени. +Когато има избрана основа, т.е. има базова цена, към която да се прибави надценката, системата ще може автоматично да обновява цените в списъка. + +Подробно ръководство за поетапното създаване и ценообразуване в ЦЛ ще откриете в [Как да създадем Ценова листа](https://www.unicontsoft.com/cms/node/14). +В тази тема ще разгледаме конкретно подчинените ценови листи и възможностите за добавяне на промоции. + +Ще покажем как може да създадете примерна подчинена *ЦЛ Клиенти 3-то ниво* на вече съществуващата *ЦЛ База*, при което се използва ценообразуване на база *3-Основна ценова листа*. В последствие към подчинената ценова листа ще настроим и няколко *Промоции*. + +В **Номенклатури || Ценови листи** създавате нова ценова листа, като в панел **Основни** се попълва единствено *Име: ЦЛ Клиенти 3-то ниво*. +Същинските настройки за вида ценообразуване се правят в панел **Допълнителни**. Тук обзавеждате редовете *На база: 3-Основна ценова листа* и *Основна ценова листа: ЦЛ База*. + +Друга важна настройка, която не е желателно да пропускате, е *Ритейл*. При избор *Ритейл: Да* системата ще закръглява цените в текущата ЦЛ по *Цена с ДДС*. И обратното - при настройка *Ритейл: Не* закръгленията ще са по *Цена*. + +![](20240522-price-lists-and-discount-schemes1.png){ class=align-center } + +Следващата стъпка е да посочите на системата какъв процент надценка и/или добавка с точна сума ще прибавя към цените. Това може да направите от панел **Списъци**. +Тук настройвате *Ценообразуване по групи* и *Ценообразуване по продукти*, като второто е с приоритет. Това ще рече, че системата взема предвид първо настройките за продукт. Ако липсват такива, прилага тези от *Ценообразуване по групи*. + +```{tip} +Системата допуска *Надценка %* и *Добавка* да се настройват и с отрицателни числа, което на практика е отстъпка от цената. Затова има основание да се използва при ценообразуване на база *3-Основна ценова листа*. +``` +Избираме да добавим нулева надценка и добавка за продукт *Маска с колаген*. Това на практика означава, че системата ще вземе цената от *ЦЛ База* без промяна. За продукт *Маска с витамини* системата ще приложи надценка 5%. + +![](20240522-price-lists-and-discount-schemes2.png){ class=align-center } + +В *Ценообразуване по групи* ще настроим 15% надценка за групата *Маска за лице*. Тоест системата ще прилага този процент за всички продукти, участващи в групата, с изключение на двата с индивидуална настройка. +Настройките за групите *Шампоан* и *Комплект* са аналогични. Нека при тях настроим и *Добавка* - точна сума, която ще се прибави към цената. + +![](20240522-price-lists-and-discount-schemes3.png){ class=align-center } + +В тази ценова листа все още няма формиран списък с продукти и новите им цени. Такъв може да се обзаведе автоматично, след като направите *Ценообразуване на подчинени ценови листи* в основната ЦЛ. +За целта записвате промените в новосъздадената *ЦЛ Клиенти 3-то ниво* и отваряне форма за редакция на *ЦЛ База*. + +![](20240522-price-lists-and-discount-schemes4.png){ class=align-center } + +От меню **Средства**, използвайки опция *Ценообразуване на подчинени ценови листи*, отворете форма за избор на ценови листи и операции. + +![](20240522-price-lists-and-discount-schemes5.png){ class=align-center } + +Предложеният от системата списък включва всички ценови листи, при които *ЦЛ База* е използвана за ценообразуване. + +Операциите, които може да се осъществят автоматично, са: +- *Добавяне нови продукти* - Опция, с която от базовата ЦЛ могат автоматично да се добавят продукти в списъка на подчинената ЦЛ. Това включва единствено продукти, за които в подчинената листа има настройки в **Списъци** - *Ценообразуване по продукти* или *Ценообразуване по групи*. +- *Премахване липсващи* - +- *Ценообразуване* - Чрез тази операция се извършва изчисляване на новите цените във всяка от маркираните подчинени ЦЛ. Ценообразуването, разбира се, се извършва въз основа на индивидуалните настройки във всяка ценова листа. + +В нашия случай задължтелните операции са *Добавяне нови продукти* и *Ценообразуване*. +След като потвърдите избора си от наличните опции, затворете форма за редакция с *ЦЛ База*. + +С това автоматичното ценообразуване е завършено. +Списъкът с продукти в *ЦЛ Клиенти 3-то ниво* е формиран. При прилагане на ценовата листа системата ще предлага цените от колони *Цена* и *Цена с ДДС*. В колоните *Надценка %* и *Надбавка* ще видите какви настройки е приложила системата при ценообразуването. + +![](20240522-price-lists-and-discount-schemes6.png){ class=align-center } + +## Промоции + +Промоциите са отделни ценови листи с намалени цени, за които може да се настрои срок на валидност. +Настройката им изисква на първо място да се [създадат нови ЦЛ](https://www.unicontsoft.com/cms/node/14) за продуктите с промоционални цени. +След това тези промоционални ЦЛ могат да бъдат настройвани към която и да било друга ценова листа. Могат да бъдат добавяни множество промоции. +Настройката е лесна и се прави еднократно. + +Ако първоначално са настроени коректно началната и крайната дата на валидност, не е необходимо допълнително проследяване. Системата следи валидността и прилага промоционалните цени единствено в документите, издавани през посочения период. + +Нека продължим с примера за *ЦЛ Клиенти 3-то ниво* и добавянето на промоции с определена валидност към нея. Ще настроим две месечни промоции. +За целта отваряте формата за редакция с тази ценова листа на панел **Списъци || Промоции**. От реда за нов запис вдясно добавяте отделен ред за всяка промоционална ЦЛ. В колона *Промоция* системата предлага за избор само предварително въведените ценови листи. +Начална и крайна дата се посочват в съответната колона за всеки ред. Именно така задавате от кога до кога е в сила дадената промоционална ЦЛ. + +![](20240522-price-lists-and-discount-schemes7.png){ class=align-center } + +При желание, всяка промоция може да бъде деактивирана и активирана повторно. Това е възможно във всеки един момент чрез отметката в колона *Активна*. + +> Промоционалните ЦЛ могат да се използват и самостоятелно, както всяка друга ЦЛ, и да се прилагат ръчно в документ за продажба. При това положение настроените начална и крайна дата с валидност на промоцията не се вземат предвид. + +## Търговски отстъпки + +В общия случай схемите с търговски отстъпки се използват в комбинация с настроените ценови листи. Те се прилагат върху основната цена в покупки и продажби, формирайки по този начин крайната цена в тези документи. За разлика от ценовите листи, при създаването на схема с ТО% не се оформя списък с продукти и новите им цени. Това е така, защото всяка схема с ТО% е еднакво приложима за всяка една ЦЛ. Разбира се, условието е да има съвпадение на продуктите, т.е. продуктите да участват и в двете настройки. + +> За да е в състояние системата да прилага автоматично ТО% в продажби, схемата трябва да е настроена по подразбиране в реквизитите на съответния контрагент. + +Единственото, което се изисква като настройка във всяка схема с ТО, е процент на отстъпката за продукти и/или категории. Може да се запознаете подробно с настройките при [създаването на схеми с ТО%](https://www.unicontsoft.com/cms/node/15), което ще използваме в долния пример. + +Да разгледаме пример с продажба на нов клиент, получаващ за първата си поръчка 15% отстъпка на всички продукти, с изключение на две категории. +За целта от **Номенклатури || Търговски отстъпки** създавате нова схема, която след това ще може да прилагате в документ за продажба. + +Във форма за редакция **Схема търговски отстъпки** се навигирате до панел **Списъци || Отстъпки по групи**. Вдясно добавяте новите записи в списъка, като обзавеждате колони *Група* и *Отстъпка%*. + +![](20240522-price-lists-and-discount-schemes8.png){ class=align-center } + +Трябва да настроите един ред с *Група: (Всички)* и *Отстъпка%: 15*, с което системата ще приложи -15% към цените в продажбата. +Има, обаче, две категории продукти, които са изключение за отстъпката. Следва да добавите с отделен ред всяка от групите, настройвайки ги с нулева отстъпка. +Така всички продукти от документа за продажба, участващи в тези групи, ще бъдат с 0% ТО. Тоест, при прилагайки схемата с ТО, системата ще вземе с приоритет настройките за цитирани групи продукти. За всички останали групи ще приложи общата настройка - отстъпка от 15%. + +![](20240522-price-lists-and-discount-schemes9.png){ class=align-center } + +Схема с ТО% се настройва по подразбиране в *Контрагент*, когато отстъпката ще е постоянна. В противен случай, ако ще ползвате схема с ТО% еднократно, може да я приложите ръчно в продажбата. + +--- +- Ценовите листи могат да се обзаведат ръчно или да се използва метод за автоматично ценообразуване - на база друга ценова листа, последни доставни или среднопретеглени цени. +- За всяка ценова листа се прави настройка на начин на закръгляване - по цена с или без ДДС. +- Надценка в % или добавка с точна сума могат да се настройват както по отделни продукти, така и за цели категории. Това важи и за **Ценови листи**, и за **Търговски отстъпки**. +- Системата се съобразява с приоритет с настройка по продукт. Ако няма настройки по продукти, системата прилага настройките по групи продукти. Това важи както за **Ценови листи**, така и за **Търговски отстъпки** +- Системата дава възможност всеки контрагент да има индивидуално настроени ценова листа и/или търговска отстъпка. Те ще се обзаведат автоматично в продажба, след като е избран дадения контрагент. diff --git a/_sources/blog/20240601-how-to-start.md b/_sources/blog/20240601-how-to-start.md new file mode 100644 index 00000000..9b222aa6 --- /dev/null +++ b/_sources/blog/20240601-how-to-start.md @@ -0,0 +1,86 @@ +```{only} html +[Нагоре](000-index) +``` + +# Първи стъпки с Dreem ERP + +Стремежът на всяка компания, инвестирайки в ERP система, е да намали грешките и разходите си. Повишената ефективност на процесите в крайна сметка ще подобри рентабилността и цялостното представяне на организацията. +Затова фокусът трябва да бъде върху оптимално използване на софтуера, извличайки най-доброто от него. + +Помощната ни информация е достъпна по всяко време и само на клик разстояние към [инструкции](https://www.unicontsoft.com/cms/), [форум](https://www.unicontsoft.com/forum/) и [статии](https://docs.unicontsoft.com/blog/000-index.html). + + +Особено важни са първите стъпки - стартирането с навременни настройки и коректни данни, което да даде стабилна база. Затова отделете време, разгледайте добрите практики и проектирайте вашите стандарти за управление на данни. +Уверете се, че всеки в компанията е запознат с тях и по възможност са унифицирани между отделите. + +По-голяма част от настройките в **Dreem ERP** се създават в **Номенклатури**. Едва след като те бъдат конфигурирани, може свободно да се работи с документите в системата. Те, от своя страна, се въвеждат през **Търговска система**. В тази група функционалности са добавени също най-често използваните оперативни справки. + +Друга част от настройките, касаещи цялостната работа на системата - достъпност, стойности по подразбиране, автоматични генерации, номератори, се извършват в **Администрация**. + +Запознайте се с [функционалностите на контейнера](https://www.unicontsoft.com/cms/node/253), за да опознаете структурата на **Dreem ERP**. + +## **Номенклатури** + +Първата функционалност от **Номенклатури**, където са поместени базовите настройки, е [**Референтни номенклатури**](https://www.unicontsoft.com/cms/node/22). За улеснение, редица от тези настройки са системно създадени. +Референтните номенклатури са списъчни настройки, които освен с ръчно изписване, могат да се въведат с копиране. За целта могат да се използват отделни файлове с подготвени списъци. Условието е колоните за съответната номеклатура във файла и в системата да съвпадат. + +> Конфигурирането на такъв файл и копирането са оправдани, когато се въвежда по-голямо съдържание. Ако става дума за единични редове, ръчното добавяне често е по-бързо. + +Нови референтни номенклатури се въвеждат еднотипно чрез използване на т.нар. *ред за добавяне на нов запис*. Този ред е статичен, винаги най-отгоре в списъка и не може да бъде изтрит. +Ще го забележите и на други места в системата, където се изисква добавяне на редове в списъци. + +Може да добавяте нови и да редактирате съществуващи референтни номенклатури във всеки момент. Изтриване се позволява единствено за неизползваните настройки. Тези, които вече са прилагани в системата, могат единствено да бъдат деактивирани. + +Голямата част от настройките - например мерните единици, валутите, типовете продукти и други, след това се изискват при създаването на номенклатури и документи. + +За да стартирате работа с **Dreem ERP** по правилен начин, обърнете нужното внимание на следните: + +- [Типове продукти](https://www.unicontsoft.com/cms/node/9) +- [Каси](https://www.unicontsoft.com/cms/node/18) +- [Основания за плащане](https://www.unicontsoft.com/cms/node/20) +- [Контрагенти](https://www.unicontsoft.com/cms/node/12) (Възможен е и импорт чрез покупки/продажби.) +- [Импорт продукти](https://docs.unicontsoft.com/blog/20240603-product-import.html) +- [ЦЛ](https://www.unicontsoft.com/cms/node/14) +- [ТО%](https://www.unicontsoft.com/cms/node/15) +- [Потребителски дименсии](https://docs.unicontsoft.com/blog/20240318-cms-dimensions.html) + +```{Tip} +За първия си импорт съветваме да подходите постепенно, като импортирате само няколко контрагента и продукта. +``` + +За номенклатура *Продукти* може да започнете с ръчно въвеждане на няколко записа. Това ще Ви даде по-добър поглед над полетата, които ще се използват като имена на колони при импорта. + +## **Начални салда** + +Следващата логична стъпка е въвеждане на начални салда, с които системата да оперира. Без тяхното завеждане не би било възможно поддържането на коректни наличности и справки. + +В накои ситуации системата ще откаже валидацията на документи. +Например при складовите документи системата не допуска приключване на разходен документ при недостатъчна наличност. Затова стъпката с въвеждане на салда за всеки склад поотделно е абсолютно задължителна. +В [Как да въведем Начално салдо на склад](https://www.unicontsoft.com/cms/node/65) е посочен начинът как да стане това. + +> Ако работите с партиди и срок на годност, не пропускайте тази информация в начално салдо на склад. + +При разплащанията актуалните наличности на портфейли неизменно са важни. За тях също трябва да създадете документи от тип *Начално салдо* за всички настроени каси и банкови сметки. + +> Сумите със салдата трябва да отговарят на актуална наличност към датата на стартиране със системата. + +Полезни теми в случая ще са [Как да въведем Начално салдо на каса](https://www.unicontsoft.com/cms/node/46) и [Как да въведем Начално салдо на банка](https://www.unicontsoft.com/cms/node/178). + +> + +Чрез [Импорт продажби] и [Импорт покупки] ще можете най-бързо да прехвърлите актуалните вземания и задължения по контрагенти. Така системата ще получи необходимите данни, за да следи и обработва издадените до момента документи по конкретен номер. + +## **Администрация** + +Преди да започнете с издаването на документи от Dreem ERP, обърнете внимание на [Номератори](https://www.unicontsoft.com/cms/node/156). Това е особено важно, когато ще се издават документи от множество поделения, ще се продължава номерация на документи от външна система и други. Настройката ще откриете в **Администрация**. + +В **Администрация || Настройки** може да добавяте и променяте различни стойности и типове документи по подразбиране, печат и генерация на документи, счетоводни настройки и пр. +За всяка налична настройка има помощна информация, която се визуализира при маркиране на съответния ред. + +> Не забравяйте всеобщото правило, че за да бъде потвърдена дадена промяна в системата, тя трябва да бъде записана. + +## **Tърговска система** + +Когато успешно сте преминали през началните стъпки, идва ред на генерирането на нови документи - заявки, покупки, продажби, складови и платежни документи. +Въвеждайки началните салда, вече сте се запознали с някои принципи на работа в системата, които предстои да надградите. +... \ No newline at end of file diff --git a/_sources/blog/20240603-product-import.md b/_sources/blog/20240603-product-import.md new file mode 100644 index 00000000..027a32d8 --- /dev/null +++ b/_sources/blog/20240603-product-import.md @@ -0,0 +1,106 @@ +```{only} html +[Нагоре](000-index) +``` + +# Импорт на продукти + +Системата разполага със средство за добавяне на множество нови продукти наведнъж, което ще откриете в **Номенклатури || Продукти и материали**. + +![](20240603-product-import1.png){ class=align-center } + +Чрез **Импорт** става възможно едновременното създаване на продукти с малко усилия. Като могат да бъдат направени множество настройки в основни реквизти, вендор кодове, фасети на мерки, баркодове, прикачени файлове, дименсии, ценови листи. +За да използвате тези предимства, предварително трябва да форматирате данните в Excel файл. Колоните във файла трябва да имат заглавия. Именно по тях след това ще указвате на кой продуктов реквизит отговаря всяка една колона. +Използвайки помощника за импортиране, ще преминете през следните стъпки: + +- Избор на файл, съдържащ данните с нови продукти +- Преглед на съдържанието на файла и конфигурация на импорта +- Контрол на входните данни +- Импорт на редовете в номенклатурата + +![](20240603-product-import2.png){ class=align-center } + +Преминавайки напред, трябва да посочите източник на данни - изберете файла с данни за нови продукти. + +![](20240603-product-import3.png){ class=align-center } + +Системата ще покаже съдържанието на файла с продукти, което може да видите като списък вляво. Вашата задача е да конфигурирате импорта чрез списъка вдясно. +Целта е да приравните съдържанието на двата списъка. По този начин структурирате настройките, посочвайки на кой реквизит ще отговаря всяка колона от файла. + +![](20240603-product-import4.png){ class=align-center } + +Подобен вид би имала една завършена конфигурация, съдържаща примерни основни настройки за продукти. + +![](20240603-product-import5.png){ class=align-center } + +С преминаване напред системата прави нужните проверки. Ако изведе съобщение за грешка, трябва да отстраните нередностите и да направите повторен опит за импорт. +При успешно преминаване, системата извежда опис на записите, които е в готовност да създаде. Ако сте съгласни, поставете отметка при *Запис на импортирани данни* и потвърдете импорта. + +> Веднъж потвърдени и записани, новите настройки не могат да бъдат върнати стъпка назад или изцяло отменени. + +![](20240603-product-import6.png){ class=align-center } + +С приключване на процеса по импортиране системата затваря помощника. Новодобавените продукти са видими в списъка след неговото опресняване. + +![](20240603-product-import7.png){ class=align-center } + +|Пълен списък с реквизити на продукти, достъпни за настройка при импорт:| +|---| +|- Основни реквизити| + Име + Код + Основна мярка + Тип - код + Тип - име + Склад + Счет. отчитане по признаци - да/не + Счет. отчитане по количество - да/не + Забележка + Допълнително име + Валута по подразбиране + Допълнителна мярка + Нето тегло - число + Бруто тегло - число + Нето обем - число + Бруто обем - число + Прецизност в осн. мярка - число + Прецизност крайна цена с ДДС - число + Продукт трансформиране при фактуриране - код + Продукт трансформиране при фактуриране - име + Счетоводен продукт - код + Счетоводен продукт - име + Гаранционен срок - число + Мярка на гаранционния срок - число + Срок на годност - число + Мярка на срок на годност - число + Производител + Вносител + ДДС% - число + Разрешено включване ДДС в цената - да/не + Интрастат допълнителна мярка + Интрастат - код по КН + Партида по подразбиране + Клас по подразбиране + Експлоатационна информация + Данъчна група за касова бележка + Текст на етикет + Задължителна партида - да/не + Амбалаж - да/не + Публична информация + Описание + Сорт + Калибър + Произход + Опаковка + Вендор кодове +| | +|---| +|- Динамични реквизити| + *Фасети на мерки + *Баркодове + *Прикачени файлове + *Дименсии + *Цени без ДДС + *Цени с ДДС + +Съдържанието на динамичните реквизити се променя спрямо съществуващите в системата настройки. +Например, списъкът към **Цени без ДДС** ще включва единствено ценовите листи без настройката *Ритейл*. Докато ЦЛ, настроени като *Ритейл*, се визуализират в списъците на **Цени без ДДС** и в **Цени с ДДС**. \ No newline at end of file diff --git a/_sources/blog/20241112-lists-configuration.md b/_sources/blog/20241112-lists-configuration.md new file mode 100644 index 00000000..7ecec359 --- /dev/null +++ b/_sources/blog/20241112-lists-configuration.md @@ -0,0 +1,181 @@ +```{only} html +[Нагоре](000-index) +``` + +# Работа със списъци + +- [Структура и функционалности на контейнера](https://docs.unicontsoft.com/blog/20241112-lists-configuration.html#id2) +- [Използване на основни и бързи филтри](https://docs.unicontsoft.com/blog/20241112-lists-configuration.html#id7) +- [Работа с редактируеми списъци](https://docs.unicontsoft.com/blog/20241112-lists-configuration.html#id10) +- [Работа с нередактируеми списъци](https://docs.unicontsoft.com/blog/20241112-lists-configuration.html#id11) +- [Използване на Списък с данни в справките](https://docs.unicontsoft.com/blog/20241112-lists-configuration.html#id12) + +Списъците в системата представляват набор от записи (редове) в множество колони, които могат да бъдат конфигурирани различно според нуждите на потребителите. Системата дава възможност за добавяне, скриване, разместване, оразмеряване, сортиране и групиране на колони. + + Ще разгледаме особеностите на списъците, като ги разделим условно на два типа: +- редактируеми - позволяват обработка на данни, като изтриване, добавяне, коригиране на редове и други; +- нередактируеми - такива, които са резултативни и не допускат промяна на данни; + +Обединяваща характеристика е прилагането на филтри и при двата вида списъци. + +## Структура и функционалности на контейнера + +При стартиране на Dreem ERP, като част от структурата на системата, се отваря т.нар. *контейнер*. Той съдържа лента с основно меню, лента с инструменти, лента с бутони по групи функции, динамичен списък за визуализация на документи и статус лента. + +### Лента с бутони и Mеню на контейнера + +В лявата част на контейнера е разположена лента с бутони по групи, даващи достъп до функционалностите в системата. +С десен бутон на мишката върху тази лента ще отворите менюто на контейнера. По този начин имате достъп до активиране / деактивиране на различни функции, променящи облика на контейнера. + +Всяка от опциите за настройка е представена в статия [Описание и функционалности на контейнера](https://www.unicontsoft.com/cms/node/253). + +![](20241112-lists-configuration1.png){ class=align-center } + +```{tip} +Използвайте *Активиране в нов прозорец*, за да стартирате едновременно няколко функционалности в отделни прозорци. Удобна възможност е, когато трябва да работите в няколко справки или документи в системата. +``` + +Активираните функционалности са достъпни през навигационната лента. Това позволява бързо превключване между тях. + +![](20241112-lists-configuration2.png){ class=align-center } + +> Прозорците могат да бъдат пренареждани чрез пренасяне с влачене - drag&drop функцията. + +### Основно меню + +Лента *Основно меню* се използва за прилагане на различни функции на форми, списъци и документи. Намира се най-горе на контейнера и съдържа следните менюта: [*Файл*, *Редакция*, *Изглед*, *Средства*, *Функции*, *Прозорци* и *Помощ*](https://www.unicontsoft.com/cms/node/253). + + +![](20241112-lists-configuration3.png){ class=align-center } + +### Лента с инструменти + +Лентата с инструменти се намира непосредствено под *Основно меню*. +Съдържа бутони, даващи бърз достъп до някои инструменти за въвеждане на функции на форми, списъци и документи, изнесени от *Основно меню* . + +> В *Лента с инструменти* са активни различни бутони - тези, чиито функции системата може да приложи в текущия списък. + +![](20241112-lists-configuration4.png){ class=align-center } + +От тук, например, може да създадете нов запис (документ, номенклатура) и да редактирате запис. Достъпни са бутони с основни действия като запис, изрязване, копиране, поставяне и изтриване. + +За да посочите на системата за кой запис ще се отнасят действията, трябва преди това да се позиционирате на реда с номенклатура или да маркирате желания ред с документ. И, както казахме, активират се само бутони, за които системата може да приложи техните функции. + +### Контекстно меню + +В *Контекстно меню* се съчетават функции от *Основно меню* и от *Лента с инструменти*. Отваря се с десен бутон на мишката върху списъците с документи или номенклатури. + +![](20241112-lists-configuration5.png){ class=align-center } + +Това меню съдържа както общи, така и променливи опции, адаптирайки се към различните списъците с функционалности. + +Например, ако сравним контекстното меню за номенклатура *Продукти и материали* и *Документи за продажба*, се вижда, че при продуктите менюто дава бърз достъп до настройване на *Дименсии*, както и активиране на изглед *Миниатюри*. Тези опции не са възможни при продажбите. При продажбите, обаче, чрез контекстното меню е възможна промяна в статуса на документите. + +![](20241112-lists-configuration6.png){ class=align-center } + +> В подменю *Други средства* се съдържат различни за отделните функционалности опции за генерация на свързани документи, прилагане на корекции, свързване с банкови плащания, бързи справки и други. + +### Меню на списък + +За всеки списък е достъпно меню с функционалности на колоните като сортиране, групиране, скриване, извеждане на колони и други. +*Меню на списък* се отваря чрез десен бутон на мишката върху реда със заглавия на колони. +В статията [Работа с колони на списъци](https://www.unicontsoft.com/cms/node/254) подробно са описани всички възможности, които това меню дава при работа с колони. + +Напред в темата ще разгледаме как работят най-често прилаганите функции от това меню при работа с нередактируеми списъци. + +## Използване на основни и бързи филтри + +Съдържанието на всички списъци може да се променя чрез прилагане на филтри. + +> Правилното филтриране е първата и най-важна стъпка, за да се обзаведе списъкът с верните данни. Едва тогава е оправдано да се продължи с настройването на списъка. + +### Основен филтър + +Основен *Филтър* ще откриете в някои номенклатури, като *Контрагенти*, *Продукти и материали* и др., във всички списъци с документи и в справките. + +*Филтър* за текущо отворен списък е достъпен чрез: + +- меню 4. Средства +- жълтото поле в началото на списъка +- десен бутон върху списъка +- клавишна комбинация Ctrl + F + +![](20241112-lists-configuration7.png){ class=align-center } + +Спрямо заложените в основния филтър критерии, системата ще обзаведе списъка с данните, отговарящи на тях. Избраните критерии се визуализират в жълтото поле. + +> Системата запазва последно настроения филтър и го прилага автоматично при следващо отваряне на списъка. + +Филтър формата за основно търсене съдържа променливи реквизити, различни за отделните списъци . Така например, ще забележите и различен брой панели във филтрите на *Документи за продажба* и на справка *Продажби (реализация)* + +![](20241112-lists-configuration8.png){ class=align-center } + + +> Във форма *Филтър* има опция *Изчистване текущ филтър*, която автоматично почиства всички полета. +Това е полезно при ново търсене, защото гарантира, че настройвате филтъра "на чисто". + +![](20241112-lists-configuration9.png){ class=align-center } + +### Бърз филтър + +Ще откриете *Бърз филтър* над почти всеки списък в системата. Съдържанието му в различните форми и списъци варира. Може да съдържа полета за свободно търсене по текст (част от текст) и полета с падащи прозорци. От статията [Бърз филтър и настройки на начина на търсене](https://www.unicontsoft.com/cms/node/129) може да разберете как да използвате бързия филтър още по-ефективно. + +> Чрез *Бърз филтър* редуцирате единствено съществуващите данни в списъка. + +За голяма част от функционалностите в системата бързият филтър е достъпен от лентата с инструменти в контейнера. + +![](20241112-lists-configuration10.png){ class=align-center } + +Освен това, ще може да използвате бързи филтри също в панел *Списък данни* на справки, форма за редакция на документи, номенклатури и др. + +## Работа с редактируеми списъци + +Списъците, позволяващи добавяне и редактиране на данни, съдържат т.нар. *ред за добавяне на нов запис* и/или множество оцветени в жълт цвят полета (цели редове). + +На следващото изображение може да разгледате и двата от споменатите елементи. + +Редът за добавяне на нов запис е статичен и винаги остава като първи ред в списъка. Данните в голяма част от полетата се обзавеждат чрез падащи списъци. Когато всички желани полета от реда са попълнени, се потвърждават с клавиш **Enter**. Това добавя въведените данните като отделен ред в списъка, а редът за добавяне на нов запис автоматично се "изчиства" за следващо попълване. + +![](20241112-lists-configuration11.png){ class=align-center } + +Другата характерна особеност на редактируемите списъци - полетата/ редовете в жълто, са знак, че се допускат корекции на данните в списъка. В един списък е възможна и комбинация от "заключени" и "отключени" за редакция полета. + +> В жълтите полета системата винаги позволява промяна на данните. + +В тези списъци може да се прилагат филтри. При тях системата също поддържа [сортиране, групиране и пренареждане](https://www.unicontsoft.com/cms/node/254) на колоните. + +## Работа с нередактируеми списъци + +Характерното за нередактируемите списъци, както подсеща името им, е, че записите в тях са "заключени" за корекции. +Промяна на данните е възможна единствено, ако за записите е достъпна форма за редакция. + +Разбира се, с пълна сила се прилагат функциите на *Контекстно меню*, *Меню на списък*, бързи и основни филтри. + +![](20241112-lists-configuration12.png){ class=align-center } + +Управлявайте времето си за оперативни задачи ефективно, като прилагате добре подбрани филтри. +За да работят максимално бързо списъците с документи, избягвайте филтриране с ненужно дълги времеви интервали. + +> В поле *Готов филтър* на форма *Филтър* може да настройвате готови шаблони с различни комбинации от критерии. + +![](20241112-lists-configuration13.png){ class=align-center } + +Шаблон с филтър се добавя или изтрива съответно от бутоните **[+]** и **[x]** след полето вдясно. +Списъкът със записани готови филтри се отваря в падащо меню с бутони за контрол - закачане, редакция, изтриване. + +## Използване на Списък с данни в справките + +По подразбиране справките в системата се визуализират в *Графичен изглед* с вид на преглед при печат. Филтрираните данни се подреждат в системно заложен шаблон. За някои справки шаблонът може се променя, което става автоматично при промяна на избрани реквизити във филтъра. +Този изглед не позволява ръчна промяна в конфигурацията на справката. + +Съществува и алтернативен изглед - *Списък с данни*. При него данните са оформени в табличен вид и може да прилагате правилата за работа с нередактируеми списъци. +При този изглед конфигурацията на справката **може да се променя**. + +![](20241112-lists-configuration14.png){ class=align-center } + +Размествайте, скривайте и показвайте от наличните допълнителни колони, за да създадете собствен удобен дизайн. +Активирането на *Тотали* за избрана групировка може да добави нова и полезна иформация. + +> В тази си форма справките, или части от тях, могат да бъдат копирани във външен файл, където списъкът подлежи на пълна редакция и преформатиране. +> Пълните данни на текуща справка може да експортирате и в CSV или XLSB файлове. Функцията е достъпна от меню **Средства || Експорт на данни**. + diff --git a/_sources/blog/20241121-bank-statement-import.md b/_sources/blog/20241121-bank-statement-import.md new file mode 100644 index 00000000..016f9be3 --- /dev/null +++ b/_sources/blog/20241121-bank-statement-import.md @@ -0,0 +1,61 @@ +```{only} html +[Нагоре](000-index) +``` + +# Импорт на банкови извлечения + +Чрез импорта на информация от банкови извлечения се подобрява точността на финансовите данни. Системата разполага със средство за автоматизирано прехвърляне на трансакции от банкови сметки и упражнява прецизен контрол по данъчни документи, товарителници, ППП. + +Системата обработва файлове в различни формати за интеграция с непрекъснато разширяващ се списъка от банки: ОББ, Уникредит, Алианц, Интернешънъл Асет Банк, Банка ДСК, Пощенска банка и други. + +За да използвате функцията за импорт, е необходимо в **Администрация || Настройки || Импорт на банкови извлечения** да определите параметрите, при които системата ще оперира. Всички настройки са подробно описани в [тази тема](https://www.unicontsoft.com/cms/node/256). + +![](20241121-bank-statement-import1.png){ class=align-center } + +Ще откриете инструмента за импорт на БИ в **Търговска система || Банкови документи**, навигирайки се до меню **Средства**. + +![](20241121-bank-statement-import2.png){ class=align-center } + +Същинският импорт се извършва с избора на файл, получен от банката. +В отворената форма за импорт са видими предварително настроените реквизити с условията на импорт. + +![](20241121-bank-statement-import3.png){ class=align-center } + +Когато процесът е преминал успешно, на екран се извежда информативно съобщение за брой импортирани редове и документи. + +![](20241121-bank-statement-import4.png){ class=align-center } + +Също така, системата предпазва от дублиране на документи, за което ще видите предупредително съобщение. + +Всички импортирани банкови извлечения са в състояние *Редакция*, докато не бъдат валидирани в системата с *Приключен*. + +![](20241121-bank-statement-import5.png){ class=align-center } + +С прочитането на файла системата търси съвпадение по IBAN, така че да свърже всяка трансакция с точния контрагент в базата и неплатените му документи. Когато не е открито съвпадение, записите за тези суми ще останат в редове без свързани документи и контрагенти. + +> В банковия документ системата автоматично свързва данъчни документи по номера, отговарящи на тези, цитирани като основание за превод. +> Ако сумата на превода от контрагент надвишава неплатените остатъци по документи, системата добавя разликата като отделен ред в банковия документ. + +За улеснение, по подразбиране колона *Основание за плащане* се обзавежда с *Разходи за покупки* за операции тип *Разход* и с *Приходи от продажби* за тези от тип *Приход*. Основанията могат да бъдат редактирани. Спрямо тях системата ще приложи настройките от **Автоматичен осчетоводител**. + + +![](20241121-bank-statement-import6.png){ class=align-center } + +Системата предлага функция за въвеждане на допълнителни редове в банковия документ след импорта на данни. Това става с десен бутон на мишката върху ред от документа и опция *Нов ред в импортирано БИ*. Новият ред е копие на посочения с десен бутон ред, но с нулеви стойности в полетата със суми. + +> В импортирано БИ не трябва се добавят ръчно нови редове, т.к. за тях ще липсва връзка с импортирания файл. + +![](20241121-bank-statement-import7.png){ class=align-center } + +```{Tip} +За да имате видимост към изходните данни, извлечени от файла, може да изведете следните колони чрез Изглед на списък: + +- Контрагент от импортирано БИ; +- IBAN на контрагент от импортирано БИ; +- Сума на реда от импортирано БИ; +- Забележка от импортирано БИ (основание на превода); +- Банкова референция от импортирано БИ; +- Операция от импортирано БИ (приход/разход); +``` +По нататъшната обработка на документа може да продължи с редактиране и/или валидиране (*Приключен*). + diff --git a/_sources/index.md b/_sources/index.md new file mode 100644 index 00000000..13123448 --- /dev/null +++ b/_sources/index.md @@ -0,0 +1,17 @@ +# Документация + + - [Ръководство на потребителя](manual/000-index.md) + - [Блог](blog/000-index.md) + +## Индекси + +```{eval-rst} +* :ref:`genindex` +* :ref:`search` +``` + +```{toctree} +:hidden: +manual/000-index.md +blog/000-index.md +``` diff --git a/_sources/manual/000-index.md b/_sources/manual/000-index.md new file mode 100644 index 00000000..851c8005 --- /dev/null +++ b/_sources/manual/000-index.md @@ -0,0 +1,25 @@ +# Ръководство за потребителя + +Настоящото ръководство има за цел да запознае потребителите и да им помогне при работа с програмен продукт **Dreem ERP**. +Информацията е представена така, че да отговори на най-често задаваните въпроси, които възникват в процеса на работа със системата. +Информацията е структурирана в следните теми: + + - [Настройки](001-ref/000-index.md) + В *Настройки* е представена информация за същината на основните настройки в системата. + - [Документи и процеси](002-docs/000-index.md) +В раздел *Документи* се разглеждат основните процеси и документи при практическото приложение на системата в организацията. + - [Справки](003-rep/000-index.md) +Ролята на раздел *Справки* е да представи начина на работа с най–често използваните справки, за да се улесни работата на потребителите. + - [Потребителски настройки на профил](004-user/000-index.md) +Разделът дава информация за различни възможности при индивидуалнте настройки на потребителски профил. + +```{toctree} +:caption: Съдържание +:maxdepth: 3 +:includehidden: +:numbered: +001-ref/000-index.md +002-docs/000-index.md +003-rep/000-index.md +004-user/000-index.md +``` diff --git a/_sources/manual/001-ref/000-index.md b/_sources/manual/001-ref/000-index.md new file mode 100644 index 00000000..8aa3020a --- /dev/null +++ b/_sources/manual/001-ref/000-index.md @@ -0,0 +1,19 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Настройки + +В *Настройки* се включва най-важната информация за работа с номенклатури и основни настройки в системата, свързани с генерация на документи. + + - [Номенклатури](001-nomenclatures/000-index.md) + - [Счетоводство - Автоматичен осчетоводител](002-accounting/000-index.md) + - [Администрация](003-settings/000-index.md) + +```{toctree} +:maxdepth: 1 +:hidden: +001-nomenclatures/000-index.md +002-accounting/000-index.md +003-settings/000-index.md +``` diff --git a/_sources/manual/001-ref/001-nomenclatures/000-index.md b/_sources/manual/001-ref/001-nomenclatures/000-index.md new file mode 100644 index 00000000..3c0ae834 --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/000-index.md @@ -0,0 +1,18 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Номенклатури + +Функционалност **Номенклатури** дава достъп до настройките-номенклатури и тяхното управление. Те са задължителни елементи и основен ресурс за функциониране на системата. +Минимално необходимите, които се изискват за генерацията на документи, респ. справки, са **Контрагенти** и **Продукти и материали**. + +**Контрагенти** в системата включват всички клиенти, доставчици, държавни институции, банки, складове, консигнатори и др., с които имате отношения. В **Продукти и материали** трябва да въведете стоките и услугите, с които търгувате, както и материалите, участващи в производство. + +В **Номенклатури** се създават, актуализират и изтриват: Референтни номенклатури (валути, мерки, каси, основания за плащане и др.), Контрагенти, Продукти и материали, Дълготрайни активи, Ценови листи, Търговски отстъпки*, Валутни курсове, Програми за лоялност, Маршрути, Потребителски дименсии, Медия каталог, Центрове на себестойност, Финансова структура, Сметкоплан, Типове документи, Машини + + +```{toctree} +:glob: true +* +``` \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/001-ref-nomenclatures.md b/_sources/manual/001-ref/001-nomenclatures/001-ref-nomenclatures.md new file mode 100644 index 00000000..9654b2e8 --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/001-ref-nomenclatures.md @@ -0,0 +1,42 @@ +```{only} html +[Нагоре](000-index) +``` + +# Референтни номенклатури + +В системата под **Референтни номенклатури** се разбира всички базови настройки, които след това се прилагат при създаване на номенклатури и документи. + +> Голяма част от **Референтни номенклатури** са въведени системно предварително с необходимия минимум за работа. + +Референтните номенклатури са организирани в раздели според функционалността, към която се отнасят: + +- Търговска система +- Счетоводство +- Интрастат +- Дълготрайни активи +- ТРЗ +- Организация + +Въпреки наличието на системно конфигурирани номенклатури, някои настройки трябва да се адаптират спрямо дейността на организацията. +Част от тези номенклатури са: + +**Мерки** - Въвеждане на видове мерки, свързани с продуктите. +**Типове контрагенти** - Дефиниране на типове контрагенти, използвани при автоматични осчетоводявания и филтри на справки. +**Типове продукти** - Дефиниране на типове продукти, използвани при автоматични осчетоводявания и филтри на справки. +**Длъжности** - Въвеждане на длъжности на персони, свързани с контрагенти. +**Каси/Работни места** - Опция за въвеждане на множество каси. Въвеждат се физическите каси, с които се работи. +**Основания за плащания** - Видове основания за плащания, използвани при създаване на касови ордери, банкови извлечения и автоматични осчетоводявания. + +> Част от настройките се актуализират системно. Това се отнася основно за номенклатурите, свързани с промени в данъчното законодателство. + +___ +Свързани статии: + +[Как да въведем Валути?](https://www.unicontsoft.com/cms/node/16) +[Как да въведем Мерки?](https://www.unicontsoft.com/cms/node/19) +[Как да създадем Типове контрагенти?](https://www.unicontsoft.com/cms/node/6) +[Как да създадем Типове Продукти?](https://www.unicontsoft.com/cms/node/9) +[Как да въведем Длъжности?](https://www.unicontsoft.com/cms/node/17) +[Как да създадем Каси?](https://www.unicontsoft.com/cms/node/18) +[Как да въведем Основания за плащане?](https://www.unicontsoft.com/cms/node/20) +[още...](https://www.unicontsoft.com/cms/node/22) \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/002-contragents.md b/_sources/manual/001-ref/001-nomenclatures/002-contragents.md new file mode 100644 index 00000000..89c81dcb --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/002-contragents.md @@ -0,0 +1,68 @@ +```{only} html +[Нагоре](000-index) +``` + +# Контрагенти + +За системата **Контрагенти** са всички складове, с които потребителят на продукта работи, всички физически и юридически лица - доставчици, клиенти, консигнатори, куриери, банки, +държавни институции и служители. + +> Няма отделни номенклатури за доставчиците и клиентите. За да се разграничават, може да се използват категории в **Потребителски дименсии**. + +Нов контрагент се създава по следния начин: + + 1) От модул **Номенклатури || Контрагенти** с десен бутон на мишката върху списъка с контрагенти, + се избира **Нов контрагент**. Отваря се празна форма **Контрагент** за въвеждане на данни. + Всички задължителни реквизити са маркирани с червен символ. + + ![Форма контрагент](902-contragent-form1.png){ class=align-center } + + 2) **Импорт по ДДС номер** - регистрирани по ДДС контрагенти могат да бъдат въведени чрез импорт на данни от сайт на ЕК. + Попълва се **ДДС номер** и чрез бутона [...], непосредствено след полето, едновременно се прави проверка за коректността на ДДС номер и автоматично се обзавеждат задължителните полета. + + 3) **Въвеждане ръчно**: + + В раздел **Основни**: + - **Име** – наименованието на контрагента е задължително поле; + - **Адрес** – попълва се адресa на контрагента (задължително поле); + - **Тип** – тип на контрагента е задължително поле. Типовете контрагенти се въвеждат + предварително в системата от **Номенклатури || Референтни номенклатури || Търговска система: Типове + контрагенти**. + - **ДДС/ Ид. No** – записва се ДДС или идентификационния номер (булстат) номер на контрагента. Реквизитът е задължителен само в случаите, когато контрагентът е данъчно регистриран; + - **Дилър** – попълва се служител, отговарящ за отношенията с контрагента; + - **Група** - избира се към коя предварително въведена категория принадлежи контрагентът; + - **Персони** – попълват се имена на лицата със съответните длъжности и данни за контакт. Системата изисква поне един от тях да бъде материално отговорно лице; + + В раздел **Допълнителни**: + - **Ценова листа** - настройва се индивидуална ценова листа за контрагента, която системата прилага автоматично в продажби; + - **Схема ТО** - може да се избере схема с търговска отстъпка, която да се прилага винаги за този контрагент; + - **Кредитен лимит** - посочва се сума, над която системата прилага различни правила за нотификация или блокиране на нова продажба при надвишен лимит неплатени документи; + - **Отложено плащане: При продажба (дни)** - брой дни за отложено плащане, с които системата изчислява автоматично дата на падеж в документ за продажба; + - **Начин на плащане** - настройва се вид на плащането, което автоматично да се прилага в продажби за този контрагент; + + Тук са поместени още настройки, свързани с дименсии, други адреси, отложено плащане, центрове на себестойност и други реквизити при продажба, импорт на банкови извлечения. + + > При настройки на контрагент от тип *Склад*, в секция **Допълнителни** задължително се избира метод за изписване на стоки от склад. + + В раздел **Списъци**: + - **Адреси на доставка** - въвеждат се адреси на доставка, които след това може да се обвържат с поделения; + - **Банкови сметки** - настройват се банкови сметки, предоставени от контрагента; + - **Поделения** - всички поделения на контрагента, с които ще се работи; + - **Вендор кодове на продукти** - използва се, когато този контрагент изисква видимост на собствени кодове; + - В групи **Търговска система**, **Счетоводна система** и **Организация** са достъпни всички документи, генерирани в системата, с избрания контрагент. + + 3) **Запис и изход** + + ___ + Свързани статии: + +[Как да създадем Контрагент?](https://www.unicontsoft.com/cms/node/12) +[Как да свържем Ценова листа и Схема с ТО% с контрагент?](https://www.unicontsoft.com/cms/node/67) +[Как да въведем Падежи на плащания за контрагент?](https://www.unicontsoft.com/cms/node/68) +[Как да въведем Поделения на контрагент?](https://www.unicontsoft.com/cms/node/69) +[Как да въведем Кредитен лимит на контрагент?](https://www.unicontsoft.com/cms/node/70) +[Как да настроим начин на плащане на конрагент?](https://www.unicontsoft.com/cms/node/217) +[Как да въведем дилър на контрагент?](https://www.unicontsoft.com/cms/node/71) +[Как да създадем Склад?](https://www.unicontsoft.com/cms/node/96) +[Как да въведем минимални и максимални количества за склад?](https://www.unicontsoft.com/cms/node/98) +[Как да въведем банкови сметки на контрагент?](https://www.unicontsoft.com/cms/node/143) \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/003-items.md b/_sources/manual/001-ref/001-nomenclatures/003-items.md new file mode 100644 index 00000000..1fdc1e99 --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/003-items.md @@ -0,0 +1,67 @@ +```{only} html +[Нагоре](000-index) +``` + +# Продукти + +В номенклатура **Продукти** се включват всички стоки, продукти, материали, услуги и други артикули, с които работите. +За цялостното функциониране на **Продукти** е необходимо предварително да бъдат настроени свързаните с тях референтни номенклатури - като **Тип**, **Мярка**, **Фасети на мерки**, **Потребителски дименсии** и други. + +Нов продукт се създава по следния начин: + + 1) В меню **Номенклатури || Продукти и материали** с десен бутон на + мишката върху списъка с продукти се избира **Нов продукт**. + + 2) Отваря се форма *Продукт/материал*, където се въвеждат следните данни: + + ![Форма продукт](903-item-form1.png){ class=align-center } + + В раздел **Основни**: + - **Код** – попълва се код на продукта; + - **Име** – попълва се желаното наименование (задължителен реквизит); + - **Тип** – от предварително настроен списък се избира какъв е типът на продукта (задължителна настройка); + **Тип на продукта** е референтна номенклатура, свързана пряко с настройките на **Автоматичен осчетоводител**, според която системата генерира счетоводните записвания по продукт. + - **Мярка** – от списък се избира основната мярка на продукта (задължителна настройка); + В тази мерна единица системата ще обработва количествата на продукта в склада. Основната мерна единица не трябва да се променя, след като вече е приложена за продукта във валидирани складови документи. + - **Склад** – избира се склад, който системата третира като склад по подразбиране. + - **Група** - от предварително настроен списък с дименсии се избира група продукти; + - **Ценова листа** - от списъка с ценови листи могат да се коригират, изтриват и добавят данни с ценови условия; + Нови ценови листи, в които продуктът ще участва, се включват чрез реда за добавяне на нов запис. + - **Изображение** - визуализация на изображение от прикачен файл (раздел **Списъци**); + + В раздел **Допълнителни**: + - **Дименсии** – избират се всички дименсии (категории), към които принадлежи продуктът; + Реквизитите с дименсии са променливи, като зависят от индивидуалните настройки в базата. Достъпни за настройка са предварително настроените списъци с дименсии за продукти, създадени от **Номенклатури || Потребителски дименсии**. + - **Счетоводно отчитане по признаци** – при утвърдителна настройка *Да*, този продукт автоматично се прехвърля в списък с счетоводни признаци; + - **Счетоводно отчитане по количество** – при настройка *Да* счетоводното отчитане на продукта е по количество; + - **Забележка** – поле вдясно на формата за свободно въвеждане на коментар, допълнителни характеристики и пр.; + + В този раздел има възможност за множество други настройки, свързани с данъци и такси, интрастат, партиди и дата на годност, центрове на себестойност, трансформиране при фактуриране, отпечатване и други. + + В раздел **Списъци**: + - **Фасети на мерки** - настройват се съотношения между основната мерна единица на продукта и всички останали мерни единици, които ще се прилагат за него в системата; + - **Мин/Макс количества** - настройват се минимално и/или максимално допустими количества за продукта в един или няколко склада; + - **Съставни продукти** - ; + - **Амбалаж** - ; + - **Баркодове** - въвеждат се наличните баркодове отделно за всяка мерна единица; + - **Вендор кодове/имена** - настройка с код и/или име на продукта, с които продуктът се идентифицира при клиент/доставчик; + - **Прикачени файлове** - добавяне на файлове с различен формат, съдържащи например изображения, инструкции, гаранционни условияи други. + - **Производство и придобиване: Нова рецепта** - функция за създаване на една или множество рецепти за продукта; + - В групи **Контрол**, **Търговска система**, **Счетоводна система**, **Организация** и **Производство** са достъпни всички генерирани в системата документи, включващи избрания продукт; + + + 3) **Запис и изход** + +___ +Свързани статии: + +[Как да създадем Продукт?](https://www.unicontsoft.com/cms/node/13) +[Как да настроим Тип на продукт?](https://www.unicontsoft.com/cms/node/104) +[Как да настроим Склад по подразбиране?](https://www.unicontsoft.com/cms/node/103) +[Как да създадем продукт тип Услуга?](https://www.unicontsoft.com/cms/node/99) +[Как да въведем различни Мерки и отношения между тях?](https://www.unicontsoft.com/cms/node/101) +[Как да въведем Минимални и максимални количества за продукт по складове?](https://www.unicontsoft.com/cms/node/218) +[Как да въведем Баркодове?](https://www.unicontsoft.com/cms/node/102) +[Как да въведем Гаранционен срок?](https://www.unicontsoft.com/cms/node/113) +[Как да въведем настройка за Трансформация на продукт при фактуриране?](https://www.unicontsoft.com/cms/node/105) +[Как да въведем настройка за Амбалаж?](https://www.unicontsoft.com/cms/node/187) \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/004-assets.md b/_sources/manual/001-ref/001-nomenclatures/004-assets.md new file mode 100644 index 00000000..6da259b3 --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/004-assets.md @@ -0,0 +1,87 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на ДМА + +Системата поддържа функционалност, която позволява ефективното управление на ДА на фирмата. Чрез **Номенклатури || Дълготрайни активи** може да заведете всички ДА в системата и да генерирате данъчен и счетоводен амортизационен план за всеки от тях. +Амортизациите на ДА могат да бъдат осчетоводени автоматично чрез инструмент за генерация. + +За въвеждането на дълготрайни активи трябва предварително да са настроени групите ДА, с които ще работите, от **Номенклатури || Референтни номенклатури || Дълготрайни активи: Групи ДА**. + +Процесът по създаване на нов дълготраен актив е следният: + +1) В **Номенклатури || Дълготрайни активи** чрез десен бутон на мишката (Ctrl+N) и **Нов ДА** се отваря форма за въвеждане на актив. + +2) В раздел **Основни** се попълват следните полета: + - **Код** - по желание се попълва код на ДА; +- **Име** – поле с наименование на ДА (задължителна настройка); +- **Счет. група** - от падащия списък се избира съответната категория, която е предварително въведена. +- **Категория по чл. 55** - в полето се избира съответната категория от системно заложен в **Референтни номенклатури** списък; +- **Датата на придобиване** – попълва се с датата на придобиване на актива - обикновено с дата на фактурата за покупка; +- **Стойност на придобиване** – попълва се стойността на ДА (Амортизируема стойност); +- **Дата на въвеждане** - попълва се дата на въвеждане на ДА в експлоатация; + На база тази дата се определя от кой месец да започне начислението на счетоводните амортизации. + +![](904-assets1.png){ class=align-center } + +3) Раздел **Допълнителни**: + +- **Дата на счетоводно отписване** – полето се попълва с дата, на която активът е отписан поради продажба, бракуване или др. +- **Обстоятелства за счетоводно отписване** – в полето се попълват обстоятелства за счетоводно отпусване, които ще се отпечатат в амортизационен план. +История на актива се попълва, ако въвеждате активи, които са +закупени преди време и амортизацията им трябва да се продължи. +Например активите, които прехвърляте от предишни програми. +- **Начислена данъчна амортизация** - попълва се, когато има начислени данъчни амортизации преди активът да е въведен в системата. Използва се при изчисляване на амортизационен план. +- **Начислена счетоводна амортизация** – използва се при изчисляване на амортизационен план, когато активът има начислени счетоводни амортизации преди въвеждането му в системата. +- **Крайна дата на предишни амортизации** - попълва се крайната дата на начислените амортицазии и се използва при изчисляване на амортизационен план; +Ако полето остане празно или датата е по-малка от *Начало на начисление*, стойностите се интерпретират като начална амортизация. + +Полетата, свързани с *Местоположение* на ДА - **Поделение**, **Персона** и **Описание**, не са задължителни. Използват се за отбелязване она детайли относно местоположението на актива. + +![](904-assets2.png){ class=align-center } + +В секция **Данъчен амортизационен план** полетата са заключени за корекции. + +- **Начало на начисление** - показва от кой месец да започне начислението на данъчните амортизации. Използва се при изчисляване на данъчен амортизационен план. +- **Дата на данъчно амортизиране** - изчислява се от системата и служи за попълване на съответната информация в амортизационните планове. +- **Данъчна амортизируема стойност** - информацията се използва при изчисляване на данъчен амортизационен план. + +В секция **Счетоводен амортизационен план** се попълват полета: +- **Начало начисление** - определя от кой месец да започне начислението на счетоводните амортизации, т.е. първият ден от месеца, следващ месеца на въвеждане на актива. (задължителна настройка); +- **Дата на счетоводно амортизиране** - полето се изчислява от системата и е заключено за редакция; +- **Отчетна стойност** - в общия случай това е стойността на придобиване на ДА (задължителна настройка); +- **Остатъчна стойност (неамортизируема)** - изчислява се от системата и се използва в счетоводния амортизационен план. +Използва се при изчисляване на счетоводен амортизационен план. +4) В раздел **Списъци** се настройват: + +- **Данъчни амортизационни норми** и **Счетоводни амортизационни норми** - Задължително трябва да се обзаведат, за да се дефинира срок на амортизация и амортизационната норма на съответния актив. + + Това става чрез бутон *Генериране* от лентата с инструменти, който отваря форма с настройки,в която се попълват: + - **Метод на аморт.** – избира се метод, по който се амортизират активите; + - **Период на експл**. – попълва се предполагаемият срок за практическо използване на актива (в месеци); + - **Аморт. норма** – съотношение между амортизационната сума, приета за сто, и полезния срок за ползване на актива в брой години. + +![](904-assets3.png){ class=align-center } + +> Достатъчно е да се попълни само едно от двете - или период на експлоатация, или амортизационна норма. + +След потвърждаване на избора с [OK] системата генерира **Данъчен амортизационен план** и **Счетоводен амортизационен план**. + + +- **Консервации и Подобрения** + +Тези секции се използват, ако временно е преустановено използването на актива поради определени причини - **Консервиране**, или при направени някакви подобрения на актива - **Подобрения** . + +- **Данъчен амортизационен план** и **Счетоводен амортизационен план** + +В тези секции справките се генерират автоматично от системата, след като се настроят амортизационен период/норма и метод на амортизация. +При редактиране на настройките за метод и период/норма, системата актуализира амортизационните планове спрямо направените промени. + +5) **Запис и изход** + +_____ +Свързани статии: + +[Как да въведем Дълготраен актив?](https://www.unicontsoft.com/cms/node/100) +[Дълготрайни активи](https://docs.unicontsoft.com/blog/20240423-fixed-assets.html) \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/005-price-lists.md b/_sources/manual/001-ref/001-nomenclatures/005-price-lists.md new file mode 100644 index 00000000..342e3bde --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/005-price-lists.md @@ -0,0 +1,72 @@ +```{only} html +[Нагоре](000-index) +``` + +# Ценови листи + +Ценовите листи представляват шаблони с цени за избрани продукти, които се прилагат в документи за покупка и продажба. Системата автоматично въвежда цената и изчислява задължението по съответния документ. Такъв шаблон (Ценова листа) може да бъде настроен към всеки контрагент, така че при продажба системата автоматично да прилага цени. + +Системата позволява настройка и прилагане и на валутни ценови листи. Стъпките в процеса на създаване на такава ЦЛ са същите, като единствената особеност е различните валута и курс. + +Ценовите листи са разделени на: + +**Доставни ценови листи** се водят автоматично от системата - тя запазва последната доставна цена след всяка валидирана покупка по контрагент. + +**Клиентски ценови листи** трябва да бъдат настроени, за да може системата автоматично да предлага цени в продажбата при избор на контрагент. + +Процесът на създаване на ценова листа е следният: + + 1) За създаване на нова **Ценова листа** се избира група функции **Номенклатури || Ценови листи**. + Чрез десен бутон на мишката върху списъка с ценови листи и **Нова ценова листа** се отваря форма **Ценова листа** за въвеждане на данни. + + 2) В раздел **Основни** се настройват: + - **Име** – в свободен текст се изписва наименование (задължителен реквизит); + - **Продукт/Материал** - от реда за добавяне на нов запис може ръчно да се въведат продукти и материали. + - **Мярка** - избор на мерна единица; + В една ценова листа може да се добавят цени за един и същ продукт, но за различни мерни единици. + - **Цена**/**Цена с ДДС** - след въвеждане на една от двете цени системата автоматично ще изчисли другата. + + ![Форма за Ценови листи](905-price-list1.png){ class=align-center w=15cm } + +3) В раздел **Допълнителни** се настройват: + - **Ритейл** - указва кои цени - с или без ДДС, да са водещи при формиране на тотали в документите за продажба (задължителна настройка); + - **На база** – в полето се избира метод на ценообразуване и спрямо него в последствие се изисква настройка на различни реквизити; + - **След дата на авт. актуализация** - полето се настройва при база *Последни доставни цени*, като задава начална дата за филтър на покупки, от които се актуализира последна доставна цена. + - **Среднопретеглени от склад** - настройка при база *Среднопретеглени цени*, с която се указва склад, от който се взимат среднопретеглените цени. + - **Основна ценова листа** - полето се попълва при база *Основна ценова листа*, като се избира родителска ценова листа, от която се взимат базовите цени. + - **Автоматична генерация** - опция, която се активира, когато в списъка в раздел Основни няма записи; + Разрешава или забранява автоматичната генерация на цени при модификация на родителска ценовата листа, при приключване на складови документи или покупка. + - **Закръгляване** - поле за избор на начин на закръгляване на цени от Референтни номенклатури | Закръглявания на цени, което се използва при ръчно или автоматично ценообразуване. + - **Дименсия групи** - поле за избор на дименсия, по която да се настройва *Ценообразуване по групи* в раздел **Списъци**. + - **Превалутиране в лв.** - разрешава или забранява конвертиране на валутни цени (от покупки) в национална валута при ценообразуване. + + ![Ценообразуване](905-price-list2.png){ class=align-center w=15cm } + +4) В раздел **Списъци** се настройват: + - **Промоции** – Добавяне на готови ценови листи с намаления и ограничена валидност; + - **Ценообразуване по групи** - От списъка вдясно се избират групи с отстъпка, като се обзавеждат колони: + - *Група* - избира се дименсия, като отстъпката може да се настрои общо за всички или за отделни групи; + - *Марж %* - попълва се стойност на желания процент марж; + - *Надценка* - попълва се стойност на желаната надценка; + - *Добавка* - може да се настрои точна сума, която да се добави в цената; + - **Ценообразуване по продукти** - От списъка се посочват продукти, за които ще има различни надценка и/или добавка, като се обзавеждат колони: + - *Продукт/материал* - избира се дименсия, като отстъпката може да се настрои общо за всички или за отделни групи; + - *Мярка* - посочва се мерната единица, която се отнася за реда; + Когато се правят настройки за повече от една мерна единица, трябва всяка една да е на отделен ред. + - *Марж %* - поле с марж в проценти; + Може да се изчисли автоматично от системата след настройка на полето с надценка; + - *Надценка* - попълва се стойност на желаната надценка в проценти; + - *Добавка* - може да се настрои точна сума, която да се добави в цената; + + ![Ценообразуване](905-price-list3.png){ class=align-center w=15cm } + +> Ако за един продукт са дефинирани **Марж**, **Надценка** и/или **Добавка**, различни за него и групата, към която принадлежи, с по–голяма тежест винаги е настройката по продукт. + + 5) **Запис и Изход** — бутон в лентата с инструменти. Съхранява въведените настройки и излиза от формата. + +___ +Свързани статии: + +[Как да създадем Ценова листа?](https://www.unicontsoft.com/cms/node/14) +[Как да свържем Ценова листа с контрагент?](https://www.unicontsoft.com/cms/node/67) +[Ценови листи и схеми с търговски отстъпки](https://docs.unicontsoft.com/blog/20240522-price-lists-and-discount-schemes.html) \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/006-discount-schemes.md b/_sources/manual/001-ref/001-nomenclatures/006-discount-schemes.md new file mode 100644 index 00000000..d8eba9f0 --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/006-discount-schemes.md @@ -0,0 +1,46 @@ +```{only} html +[Нагоре](000-index) +``` + +# Търговски отстъпки + +Схемата с търговски отстъпки представлява шаблон с настроени намаления от цената, който може да се прилага в документи за заявки, покупка и продажба. +Отстъпките се настройват в проценти общо за цяла група/и, както и индивидуално за продукт. + +Може да създадете множество схеми с ТО в системата, които да прилагате ръчно, или да обвържете с настройките на избрани контрагенти. + +Процесът на създаване на схеми с търговски отстъпки е следният: + + 1) За създаване на нова схема с отстъпка се отваря група функции **Номенклатури || Търговски отстъпки**. Чрез десен бутон на мишката върху списъка вдясно се избира **Нова схема търговски отстъпки**. Отваря се форма за въвеждане на данни **Ценова листа**, в +която се попълват няколко реквизита: + +![](906-discount-schemes1.png){ class=align-center } + +2) В раздел **Основни** се настройват: + - **Код** — кодът може да се попълни ръчно или системата да даде пореден номер при запис на номенклатурата; + - **Име** – в свободен текст се изписва наименование на схемата с ТО (задължителна настройка); + - **Активен** - чрез поставяне/премахване на отметка схемата с ТО се активира/деактивира; + +3) В раздел **Допълнителни** се настройват: + - **Категории** - Използва при настройка за сигурност и ограничаване на достъпа до ценови листи; + - **Дименсия групи** - Избира се дименсията, по която в раздел **Списъци** ще се настройват *Отстъпки по групи*(задължителна настройка); + +![](906-discount-schemes2.png){ class=align-center } + +4) В раздел **Списъци** се настройват: + - **Отстъпки по групи** - От списъка вдясно се избират групи с отстъпка, като се обзавеждат колони: + - *Група* - избира се дименсия, като отстъпката може да се настрои общо за всички или за отделни групи; + - *Отстъпка %* - стойност на желаите проценти намаление; + - **Отстъпки по продукти** - От списъка се посочват продукти, за които ще има специфична отстъпка. Те се явяват изключения от настройките за групи. +Попълват се колони: + - *Продукт/материал* - избира се конкретен продукт, за който има индивидуална отстъпка, различна от тази по групи; + - *Отстъпка %* - стойност на желаите проценти намаление; + +![](906-discount-schemes3.png){ class=align-center } + +> При използване на схема с ТО в документ, системата прилага с приоритет настроените отстъпки по продукти. Ако не открие такива, прилага отстъпките по групи. +___ +Свързани статии: + +[Как да създадем схема с ТО%?](https://www.unicontsoft.com/cms/node/15) +[Как да свържем Схема с ТО% с контрагент?](https://www.unicontsoft.com/cms/node/67) \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/007-loyalty-programs.md b/_sources/manual/001-ref/001-nomenclatures/007-loyalty-programs.md new file mode 100644 index 00000000..387f1d8c --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/007-loyalty-programs.md @@ -0,0 +1,75 @@ +```{only} html +[Нагоре](000-index) +``` + +# Програми за лоялност + +Програмите за лоялност в системата представляват схеми, чрез които по зададени критерии клиентите натрупват бонус точки. Натрупаните по този начин точки носят търговска отстъпка или позволяват размяна срещу продукт по каталог. + +**Бонус точки за търговска отстъпка**: Участници в този вид програма за лоялност са всички клиенти, закупили стоки от определени категории продукти, носещи бонус точки. След достигане до някое от определените с Интервали нива, клиентът получава съответната отстъпка спрямо зададената схема. +**Бонус точки за продукти по каталог**: + + +Процесът по създаване на *Програма за лоялност* е следният: + + 1) За създаване на програма се отваря група функции **Номенклатури || Програми за лоялност**. Чрез десен бутон на мишката върху списъка вдясно се избира **Нова програма за лоялност**. Отваря се празна форма за въвеждане на данни, в която се попълват няколко реквизита: + +2) В раздел **Основни** се настройват: + - **Код** — кодът може да се попълни ръчно или системата да даде пореден номер при запис на номенклатурата; + - **Активна** - чрез поставяне/премахване на отметка програмата за лоялност се активира/деактивира; + - **Име** – в свободен текст се изписва наименование на програмата (задължителна настройка); + - **Тип** - от опционално меню се избира тип на програмата. + Възможностите за избор са: + - Бонус точки за търговска отстъпка + - Бонус точки за продукти по каталог + - Ваучери за търговска отстъпка + - Ваучери за промо продукт + - Допълнителна схема ТО спрямо съдържанието на текущ документ + + + ![](907-loyalty-programs1.png){ class=align-center } + +> Спрямо избрания за програмата **Тип** се активират различни реквизити за настройка в разделите **Допълнителни** и **Списъци**. + +3) В раздел **Допълнителни** се настройват: + - **Група документи** - в полето се посочва при приключването на коя група документи или тип документ да се натрупват бонус точки по програмата (задължителен реквизит); + - **Продукт за бонус точки** - избира се продукт, с който се усвояват натрупаните по програмата бонус точки в продажба (важи при настройка с тип *Бонус точки за продукти по каталог*); + - **Точки при усвояване** - поле с настройка за потвърждение/отказ дали при усвояване на натрупани точки по програмата, тази продажба да отчита бонус точки; + - **Дименсия групи** - избор на дименсия, по която в раздел Списъци ще се настройват *Коефициенти*; + - **Активна от** - избор на начална дата (включително), от която стартира програмата за лоялност; + Ако полето е празно, програмата се счита за вече стартирана. + - **Активна до** - избор на крайна дата (включително), на която приключва програмата за лоялност; + Ако полето е празно, програмата се счита за безсрочна - продължава без да приключва автоматично. + - **Усвояване преди** - избор на крайна дата (включително), преди която могат да се усвояват натрупани по програмата бонус точки; + Ако полето е празно, няма ограничение в периода на използване на натрупаните точки. + + ![](907-loyalty-programs2.png){ class=align-center } + +4) В раздел **Списъци** системата активира единствено реквизитите, които трябва да се настроят за избрания *Тип* на програмата ( в раздел **Основни**). + + Пълният списък с настройки включва: + - **Коефициенти**: + - **Дименсия** - поле за избор на категория продукти, на база която ще се натрупват бонус точки; + - **Коефициент** - поле за настройка на коефициент, определящ количеството бонус точки, които носи покупката на избраните категории продукти; + - **Интервали** - настройка, определяща условията за прилагане на отстъпка, т.е. каква схема с търговска отстъпка да се активира за отделните интервали с достигнати бонус точки. + - **От** - избор на минимален брой бонус точки за съответната схема с търговска отстъпка; + - **До** - избор на максимален брой бонус точки за съответната схема с ТО; + - **Схема ТО** - избор на предварително въведена схема с отстъпка; + + ![](907-loyalty-programs3.png){ class=align-center } + + - **Контрагенти**: + - **Контрагент** - избор на клиент, участващ в програмата за лоялност; + - **От дата** - поле за избор на начална дата за валидност на програмата за дадения контрагент; + - **До дата** - поле за избор на крайна дата за валидност на програмата за дадения контрагент; + - **Ваучери** - секция с настройки на предварително издадени ваучери на клиенти; + - **Ваучер** - в редовете на тази колона може да се въведе списък с идентификационни номера (кодове) на ваучери; + - **Контрагент** - в редовете на колоната се посочва име на контрагента, за когото е издаден съответният ваучер; + - **Многократен** - в тази колона се настройва начин на прилагане на съответния ваучер - еднократно или многократно; + +5) **Запис и изход** + +___ +Свързани статии: + +[Как да създадем Програма за лоялност?](https://www.unicontsoft.com/cms/node/138) \ No newline at end of file diff --git a/_sources/manual/001-ref/001-nomenclatures/008-custom-dimensions.md b/_sources/manual/001-ref/001-nomenclatures/008-custom-dimensions.md new file mode 100644 index 00000000..a56c9e47 --- /dev/null +++ b/_sources/manual/001-ref/001-nomenclatures/008-custom-dimensions.md @@ -0,0 +1,99 @@ +```{only} html +[Нагоре](000-index) +``` + +# Потребителски дименсии + +Настройките на *Потребителски дименсии* се изграждат в две стъпки - съставяне на описи в *Списъци* и създаване на *Дименсии*. +Списъците представляват каталог, съдържащ всички групи продукти, контрагенти, договори и пр. За всяка една от тези групировки трябва да укажете как системата да я третира. Това става чрез настройка на *Дименсии*. + +## Настройка на Списъци + +```{tip} +Препоръчително е в имената на списъците да се добави за коя номенклатура или тип документ се отнасят. Това ще помогне за по-лесно и бързо ориентиране в целия набор от списъци. +``` + +Нов списък се създава по следния начин: + +1) От модул **Номенклатури || Потребителски дименсии** с десен бутон на мишката върху група *Списъци* се избира *Нов списък*, при което системата отваря прозорец с празно поле. Въвежда се наименование в свободен текст и с бутон *Ok* се добавя като нова категория в *Списъци*. + +![](908-dimensions1.png){ class=align-center } + +2) В колона *Стойност* на списъка се попълват наименования за всяка подкатегория. + +![](908-dimensions2.png){ class=align-center } + +3) Промените се съхраняват с бутон *Запис* от лентата с инструменти, с което съдържанието на списъците е настроено. + +```{tip} +Във всеки един момент може да се редактират и добавят нови записи. +Изтриването е възможно единствено, когато настройките все още не са използвани в системата. +``` + +## Настройка на Дименсии + +Настройката е задължителна. Чрез нея всеки предварително въведен списък се обвързва или с конкретен вид номенклатура, или с типове документи. Това определя дали дименсията ще бъде достъпна във формата за редакция на *Продукти* или на *Контрагенти*, както и в съдържащите ги филтри, или ще касае тип документи. + +> Ако даден списък не се разпредели към Продукти и материали, Контрагенти и поделения или Тип документ в *Дименсии*, реквизитът няма да е видим в системата. + +Нова дименсия се конфигурира по следния начин: + +1) За да бъдат завършени настройките на категории, от група *Дименсии* се маркира *Контрагенти и поделения*, *Продукти и дълготрайни активи*, *Машини* или избран тип документ (*Договори*, *Документи за продажба* и т.н.). +В списъка вдясно, чрез реда за добавяне на нов запис, се попълва колони: + +- **Дименсия** — изписва се името на категорията. +С това наименование дименсията се визуализира във филтрите и в списъците с продукти. + +![](908-dimensions3.png){ class=align-center } + +- **Тип** — в тази колона се избира вида на дименсията от опционално меню. + +Системата дава възможност за избор от следните типове: + + - тип **Списък**: този тип ограничава категоризирането само към една от стойностите на списъка. + - тип **Текст**: дава възможност за категоризиране по свободно въведен текст, който може а се настрои в отделни шаблони. + - тип **Число**: дава възможност за категоризиране с числови стойности. + - тип **Дата**: дава възможност за категоризиране по дата. + - тип **Час**: дава възможност за категоризиране по час. + - тип **Да/Не**: възможност за категоризиране като отговарящи или неотговарящи на определен критерий. + - тип **Множество**: допуска категоризирането към повече от една стойност на списъка. + - тип **RTF**: дава възможност за категоризиране по свободно въведен текст - Rich Text rmat. + - тип **HTML**: дава възможност към продуктите да се настрои HTML код. + - тип **Медия**: възможност да се настрои връзка към уебсайт. + +- **Списък стойности** — той се настройва задължително единствено за дименсии от тип *Списък* и *Множество*. Тук ,от опционалното меню, трябва да изберем категория от предварително въведените в *Списъци*. +- **Задължителна** — чрез поставяне на отметка в тази колона, може да се настрои тя да бъде задължителна настройка. При това положение системата няма да позволява записване на нов или редакция на съществуващ продукт, без да се избере стойност за задължителната дименсия. +- **Прецизност** — настройката се използва единствено за числов тип дименсии, като указва до кой знак след десетичната запетая да се закръгли числото. +- **Описание** — в полето може да се даде кратко описание, което да служи като помощен текст или друго. + +# Използване на дименсиите в Продукти и материали + +При създаване на нов, или редактиране само на един продукт, дименсия се добавя по следния начин: + +1) Във форма за редакция се отваря панел **Допълнителни || Реквизити: Дименсии**, където са показани всички предварително създадени дименсии, отнасящи се до продукти. От падащо меню в колона **Стойност** се визуализира списък с подкатегории, от който се избира желаната. +Действието се повтаря за всички дименсии, в които даден продукт ще участва. + +![](908-dimensions4.png){ class=align-center } + +2) **Запис и изход** - едновременно съхранява промените и излиза от формата. + +При редактиране на съществуващи продукти ( един или множество) дименсия се добавя по следния начин: + +1) Отваря се списъка в **Номенклатури || Продукти и материали**. + +> При този начин за добавяне/редакция на дименсия системата позволява да се маркират множество продукти и едновременно да се изберат само общите за тях категории. + +2) От списък **Продукти и материали** се маркират един или няколко реда и с десен бутон на мишката от менюто се избира **Дименсии**. + +![](908-dimensions5.png){ class=align-center } + +3) В отворената форма за редакция *Дименсии* се съдържат всички съхранени в системата категории продукти. За всички дименсии, които ще се настройват за продуктите, се избират съответните стойности от падащите менюта. +За по-лесно намиране на желаната категория може да се използва бърз филтър по име или част от име. + +![](908-dimensions6.png){ class=align-center } + +4) Промените се записват с бутон [OK]. +От този момент продуктите ще участват във всички справки, филтрирани по новонастроените дименсии. + +> В системата, както за *Продукти и материали*, така и за *Контрагенти*, трябва да се настрои по една дименсия, която да изпълнява ролята на основна група. +Това става в **Администрация || Настройки**. Настроената за основна група на Продукти и материали не трябва да е тип *Множество*. \ No newline at end of file diff --git a/_sources/manual/001-ref/002-accounting/000-index.md b/_sources/manual/001-ref/002-accounting/000-index.md new file mode 100644 index 00000000..4f1a643c --- /dev/null +++ b/_sources/manual/001-ref/002-accounting/000-index.md @@ -0,0 +1,21 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Счетоводни настройки + +Системата изисква внимателна конфигурация на счетоводните настройки, за да се постигне автоматизация и точност на операциите. + +Данъчните настройки, като дефиниране на ДДС ставки и различни типове сделки, свързаните с интрастат настройки и др., се създават през **Номенклатури || Референтни номенклатури**. Тук са поместени и отнасящите се до дълготрайните активи и ТРЗ настройки. +Всички те са групирани в отделни секции: **Счетоводство**, **Интрастат**, **Дълготрайни активи** и **ТРЗ**. + +Във функционалност **Номенклатури** се настройва **Сметкоплан**, като се създават счетоводните сметки, съобразени със специфичните нужди на бизнеса. + +Чрез функционалност **Счетоводство || Автоматичен осчетоводител** се настройват кореспонденциите (контировките) на счетоводните сметки, които системата да генерира при определените условия. + +Детайлната и добре структурирана първоначална настройка на ключовите параметри осигурява съответствие с нормативните стандарти, безпроблемно управление на счетоводните процеси и избягване на грешки. + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/001-ref/002-accounting/001-chart-of-acc.md b/_sources/manual/001-ref/002-accounting/001-chart-of-acc.md new file mode 100644 index 00000000..6cbea575 --- /dev/null +++ b/_sources/manual/001-ref/002-accounting/001-chart-of-acc.md @@ -0,0 +1,47 @@ +```{only} html +[Нагоре](000-index) +``` + +# Сметкоплан + +Чрез функционалност **Сметкоплан** може да управлявате настройките на счетоводните сметки спрямо спецификата на дейността в организацията. Може да въвеждате, редактирате и деактивирате сметки. Изтриване се допуска единствено, когато дадена сметка не е била използвана никъде в системата. + +Процесът по добавяне на нова счетоводна сметка е следният: + +1) Избира се група функции **Номенклатури || Сметкоплан**. Чрез десен щрак с мишката върху списъка със сметки се избира **Нова сметка** (или **Нова подсметка**). Системата добавя нов ред и автоматично предлага първия незает шифър за групата сметки, която е избрана. + +![](901-chart-of-acc1.png){ class=align-center } + +2) Код — полето може да бъде редактирано, като се избере друг желан код или да се запази предложеният от системата шифър на сметка. + +3. Име — в полето се попълва наименование на сметката. + +4) Тип — в това поле се определя тип на счетоводната сметка: **Активна**, **Пасивна** или **Активно-пасивна**. + +5) Съдържание - в полето се настройва вид на сметката: **Стойностна**, **Количествена** или **Валутна**. + +6) Възможни са допълнителни настройки на сметката чрез поставяне/премахване на отметка в следните колони на списъка: + - **Признак задължителен**; + - **Аналитичност задължителна**; + - **Партида задължителна**; + - **Документ задължителен**; + - **Автоматично приключване**; + - **Задбалансова**; + - **Активна**; + +7) **Генериране тип продукт, основание за плащане** е инструмент за генерация на някои номенклатури и техните осчетоводявания, достъпен чрез десен бутон на мишката върху избрана сметка. + +![](901-chart-of-acc2.png){ class=align-center } + +От формата **Генериране тип продукт, основание за плащане**, според същността на маркираната счетоводна сметка, се избира коя номенклатура да създаде системата: + +- **Генериране на тип продукт** и настройка на автоматично осчетоводяване за него - системата създава нова референтна номенклатура в **Типове продукти** и добавя настройка в **Автоматичен осчетоводител** за автоматични контировки при продажби и/или покупки; +- **Генериране на основание за плащане** и съответното му осчетоводяване - системата създава нова референтна номенклатура с избраната сметка в **Основания за плащане**, както и настройки за касови и/или банкови документи в **Автоматичен осчетоводител**; +- **Генериране на продукт и признак** - системата създава нови номенклатури с името на сметката в списъци **Продукти и материали** и **Счетоводни признаци**. +- **Ок** - Бутон за потвърждаване на избраните опции. + +8) **Запис** - Бутон в лентата с инструменти, записващ промените в **Сметкоплан**. +___ +Свързани статии: + +[Как да настроим Сметкоплан](https://www.unicontsoft.com/cms/node/36) \ No newline at end of file diff --git a/_sources/manual/001-ref/002-accounting/002-acc-wizard.md b/_sources/manual/001-ref/002-accounting/002-acc-wizard.md new file mode 100644 index 00000000..b4ea4695 --- /dev/null +++ b/_sources/manual/001-ref/002-accounting/002-acc-wizard.md @@ -0,0 +1,65 @@ +```{only} html +[Нагоре](000-index) +``` + +# Автоматичен осчетоводител + +Системата разполага с функционалност **Автоматичен осчетоводител**, чрез която рутинните счетоводни операции могат да се извършват автоматично. Така, заедно с валидирането на документите в **Търговска система**, може да се генерира и счетоводен запис/и. + +Системата трябва да се конфигурира според счетоводната политика и индивидуалния сметкоплан на всяка фирма. Първият етап в настройките е правилното дефиниране на следните референтни номенклатури: +- **Типове контрагенти** +- **Типове продукти и материали** +- **Основания за плащане** + +На следващ етап се настройва **Автоматичен осчетоводител**, където посочвате как да се осчетоводява всеки един документ от **Търговска система**, на който ще правите счетоводен запис. Настройките на документи са обособени в отделни групи, както следва: +- **Документи за продажба** +- **Документи за покупка** +- **Складови документи** +- **Касови документи** +- **Банкови извлечения** +- **Амортизации** +- **ТРЗ** + +Процесът по настройка на автоматичните контировки е следният: + +1) Избира се група функции **Счетоводство || Автоматичен осчетоводител**. След като се маркира съответната група документи за осчетоводяване, вдясно се отваря списък с настройки. +За всяка една от тези групи документи задължително се правят настройки във **Водеща сметка** и в **Кореспонденции**. + + +![](902-acc-wizard1.png){ class=align-center } + +**Документи за продажба**: + +2) За **Водеща сметка** трябва да се настроят полета: + +- **Док. тип** - поле, в което се избира тип на документа от възможните за избраната група документи; +В случая на **Документи за продажба** това са всички настроени в системата данъчни документи при продажба: фактури, дебитни и кредитни известия, отчети за извършени продажби, митнически декларации за износ, квитанции и др. + +- **Тип Контрагент** - в това поле се посочва за кой от предварително въведените типове контрагенти се настройва текущият ред; + +- **Валута** - поле с възможност за избор на различна валута за всеки ред с настройки; + +- **Сметка** - в това поле се избира водещата сметка за избрания на реда тип документ; +Системата предлага под формата на падащ списък настроеният **Сметкоплан**. + +3) В **Кореспонденции** се настройват следните полета: + +- **Док. тип** - поле за избор на типа документ, за който ще се отнася текущият ред с настройки; + +- **Тип Продукт/Материал** - в полето от опционалното меню се избира тип на продукта, за който се настройва текущият ред; + +- **Поделение** - в полето може да се избере поделение на потребителя на продукта от списъка с текущо активните; + +- **Сметка** - в това поле се настройва кореспондираща сметка за избрания **Тип продукт/материал**; + +- **Прикл. сметка** - възможност да се избере приключителна сметка на всеки ред за група **Документи за продажба**; +Тази настройка работи при генериране на приключителна статия от самия счетоводен документ. + + +> Настройките за всички **Групи док. за осчетоводяване** са аналогични, като единствено колоните в списъците варират според избраната група. + +4) Запис - Бутон в лентата с инструменти, записващ промените в **Автоматичен осчетоводител**. +___ +Свързани статии: + +[Как да настроим Автоматичен осчетоводител за различни групи документи?](https://www.unicontsoft.com/cms/node/257) \ No newline at end of file diff --git a/_sources/manual/001-ref/002-accounting/003-acc-admin-settings.md b/_sources/manual/001-ref/002-accounting/003-acc-admin-settings.md new file mode 100644 index 00000000..03b06f10 --- /dev/null +++ b/_sources/manual/001-ref/002-accounting/003-acc-admin-settings.md @@ -0,0 +1,52 @@ +```{only} html +[Нагоре](000-index) +``` + +# Счетоводни настройки + +За системата са необходими глобални счетоводни настройки, на чиято база по подразбиране се прилагат счетоводни документи и сметки, извършват се различни проверки и генерации. + +Процесът по конфигуриране на счетоводните настройки е следният: + +1) Избира се група функции **Администрация || Настройки**, където в секция **Група: Счетоводни настройки** е списъкът с реквизитите, достъпни за настройка. +На всяка от посочените опции в колона **Име** съответства жълто поле за настройка в колона **Стойност**. + +![](903-acc-admin-settings1.png){ class=align-center } + +- **Неизвестна сметка** - настройката се прилага, когато липсва настроена счетоводна сметка за операцията в Автоматичен осчетоводител; +- **Сметка ДДС за покупки** - избраната сметка се прилага при осчетоводяването на фактура за покупка на реда с ДДС; +- **Сметка ДДС за покупки при режим касова отчетност** - избраната сметка се прилага на реда с ДДС в счетоводната статия при осчетоводяване на фактура за покупка (касова отчетност); +- **Сметка разсрочен ДДС за покупки** - настроената счетоводна сметка се прилага при осчетоводяване на фактура за покупка с разсрочен ДДС; +- **Сметка ДДС за продажби** - избраната счетоводна сметка се прилага при осчетоводяване на фактура за продажба на реда с ДДС в счетоводния документ; +- **Сметка ДДС за продажби при режим касова отчетност** - настроената сметка се прилага за ред с ДДС в счетоводната статия при осчетоводяване на фактура за продажба (касова отчетност); +- **Сметка плащания в брой по фактури** - поле за избор на счетоводна сметка, която да се прилага при генериране на плащане в брой по фактура за продажба в счетоводството; +- **Сметка плащания с наложен платеж по фактури** - поле за избор на счетоводна сметка, която да се прилага при генериране на плащане с наложен платеж по фактура за продажба в счетоводството; +- **Вид документ за плащания с наложен платеж по фактури** - поле за избор на вид документ, който се създава автоматично при генериране на плащане с наложен платеж по фактура за продажба в счетоводството; +- **Сметка плащания Online по фактури** - избира се счетоводна сметка,която се прилага при генериране на Online плащане по фактура за продажба в счетоводството; +- **Вид документ за Online плащания по фактури** - избира се вид документ, който се създава автоматично при генериране на Online плащане по фактура за продажба в счетоводството; +- **Сметка подотчетни лица при покупки** - избира се сметка, която се прилага при генериране на запис в счетоводството при покупки на подотчетни лица; +- **Вид документ за авансови отчети на подотчетни лица** - настройка за вид документ, който се създава автоматично при генериране на авансов отчет в счетоводството при покупки на подотчетни лица; +- **Група за плащания** - поле за избор на счетоводна група сметки, която да се прилага при изчисляване на сума на плащания по счетоводни документи в справки; +- **Сметка за положителна курсова разлика** - в полето се избира счетоводната сметка, по която се отразяват положителните курсови разлики при осчетоводяване на банкови и касови документи във валута; +- **Сметка за отрицателна курсова разлика** - в полето се избира счетоводната сметка, по която се отразяват отрицателните курсови разлики при осчетоводяване на банкови и касови документи във валута; +- **Нулеви Интрастат декларации за пристиганията** - поле с настройка, позволяваща/забраняваща при приключване на Интрастат декларации да се генерират нулеви документи; +- **Нулеви Интрастат декларации за изпращанията** - поле с настройка, позволяваща/забраняваща при приключване на Интрастат декларации да се генерират нулеви документи; +- **Задължителни счетоводни наличности при приключване на фактура** - поле с настройка, указваща дали системата да проверява счетоводните наличности към датата на документа при приключване на фактура; +- **Сметка стоки** - поле за избор на сметка, която се използва при проверка на наличността на счетоводния склад при приключване на фактура; +- **Синхронизиране цени складови документи търговска/счетоводна система** - поле с настройка за синхронизиране на цени от търговската към счетоводната система; +Ако опцията не е включена, цените на генерирания счетоводен складов документ се вземат от складовия документ в търговската система; +- **Списък сметки за преизчисляване на склада** - настройката се използва при преизчисляване на склада: системата прави проверка дали избраната сметка съществува в този списък; +Ако списъкът е празен, проверката се игнорира. +- **Равнение на счетоводен и данъчен амортизационен план** - поле с настройка, указваща дали да се поддържат еднакви стойности в счетоводен и данъчен амортизационен план, при което се поддържат еднакви дати и суми за равнозначност на плановете; +- **Закръгляване до годишната квота на счетоводен и данъчен амортизационен план** - поле с настройка за изравняване на сумата на месечните амортизации до сумата на годишната амортизация; Опцията се отнася за годините след 2019 година (включително). +- **Сметка разходи за бъдещи периоди** - поле за избор на счетоводна сметка, която системата прилага при генериране на счетоводни документи за отложени разходи; +- **Документ за разходи за бъдещи периоди** - избира се вид документ, който системата създава при генериране на счетоводни документи за отложени разходи; +- **Сметка разходи в минал период** - поле за избор на счетоводна сметка, която системата прилага при генериране на счетоводни документи за разходи в минал период; +- **Документ за разходи в минал период** - избира се вид документ, който системата създава автоматично при генериране на счетоводни документи за разходи в минал период; +- **Сметка приходи за бъдещи периоди** - избира се сметка, която системата да прилага при генериране на счетоводни документи за отложени приходи; +- **Документ за приходи за бъдещи периоди** - избира се вид документ, който системата създава при генериране на счетоводни документи за отложени приходи; +- **Сметка приходи в минал период** - поле за избор на счетоводна сметка, която системата прилага при генериране на счетоводни документи за приходи в минал период; +- **Документ за приходи в минал период** - избира се вид документ, който системата създава при генериране на счетоводни документи за приходи в минал период; + +2) **Запис** - Бутон в лентата с инструменти, записващ направените промени. + diff --git a/_sources/manual/001-ref/003-settings/000-index.md b/_sources/manual/001-ref/003-settings/000-index.md new file mode 100644 index 00000000..4129d691 --- /dev/null +++ b/_sources/manual/001-ref/003-settings/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Администрация + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/001-ref/003-settings/001-users.md b/_sources/manual/001-ref/003-settings/001-users.md new file mode 100644 index 00000000..57c8d0f0 --- /dev/null +++ b/_sources/manual/001-ref/003-settings/001-users.md @@ -0,0 +1,69 @@ +```{only} html +[Нагоре](000-index) +``` + +# Потребители и групи + +Достъпът до **Dreem ERP** се осъществява чрез потребители, които трябва да бъдат въведени предварително от меню **Администрация**. + +Според нуждите на дейността в организацията, могат да бъдат настроени права за достъп и работа с функционалности и данни. Правата се дефинират по групи, в които участват избрани потребители. + +1) Нови потребители се създават от **Администрация || Потребители и групи**. След маркиране на раздел **Потребители**, вдясно се отваря списък с въведени до момента потребители, който включва и системния потребител *Dreem*. + +![](901-users1.png){ class=align-center } + +2) С десен бутон върху списъка се избира **Нов потребител**, което отваря празна форма за въвеждане на данни. + +В секция **Основни** се попълват: + + - **Име** - в полето се изписва на латиница потребителско име; + - **Активен** - чрез поставяне на отметка потребителят се маркира като действащ, което му дава достъп до системата; + - **Без парола** - чрез поставяне на отметка, потребителят ще има достъп до системата без парола; + - **Парола / Пак парола** - попълвате паролата на потребителя. При първото му влизане системата ще има възможност да я смени. Тези полета са активни, когато поле **Без парола** не е маркирано. + +![](901-users2.png){ class=align-center } + + +> Данните, въведени в секция *По подразбиране*, ще бъдат прилагани автоматично от системата за документите, които генерира съответният потребител. + + - **Персона** - поле за избор на персона от предварително настроен списък със служители за контрагент **Потребител на продукта**; + Данните се използват при генерация на нов документ за автоматично обзавеждане на поле **Съставил**. + - **Каса** - поле за избор на каса по подразбиране, която системата ще предлага при генерация на касови документи; + - **Поделение** - поле за избор на поделение по подразбиране, за което избраният потребител работи; + Системата ще предлага данните при генерация на документи, като прилага настроения за поделението номератор. + - **Склад** - поле за избор на склад по подразбиране, който системата ще предлага при генерация на свързани със склад документи; + - **Участва в рупи** - списък с групи, към които е присъединен потребителят; + Участие в нова група се настройва от реда за добавяне на нов запис. + +В секция **Допълнителни** се настройват задължителните реквизити: + + - **Достъп само за четене** - поле с настройка за вид на достъпа - само за четене или за въвеждане на данни; +Настройката **Достъп само за четене: Да** може да се използва за одиторски профили. +- **Търговски обект** - поле за избор на търговски обект по подразбиране; +Системата прилага настройката за автоматично попълване на търговския обект при продажба. +- **Тип** - поле за избор на режим на достъп до мобилната платформа на системата; +При избран тип *0 - Стандартен* системата позволява пълен достъп. +За потребители от тип *1 - Интернет* е позволен достъп единствено до мобилната платформа. + +3) Нови групи с потребители се създават от **Администрация || Потребители и групи**. +След маркиране на раздел **Групи**, вдясно се отваря списък с въведени до момента групи потребители. В него са включени и системните настройки *Администратори*, *Всички* и *Потребител създаване*. + +![](901-users3.png){ class=align-center } + +4) С десен бутон върху списъка се избира **Нова група**, което отваря празна форма за въвеждане на данни. + +В секция **Основни** се попълват: + + - **Име** - в полето се попълва наименование на групата; + - **Активна** - чрез поставяне на отметка системата отчита настройките за групата и ги прилага за участниците в нея; + - **Потребител** - поле за избор на участници в текущата група; +Потребителите трябва да са предварително настроени. Може да се добавят от списък чрез бутона с трите точки или директно изписване на името в полето. + +![](901-users4.png){ class=align-center } + +Секция **Права** осигурява бърз достъп до настроените права за текущата група и тяхното управление. + +![](901-users5.png){ class=align-center } + +5) **Запис и изход** - бутон, който запазва модификациите и излиза от формата. + diff --git a/_sources/manual/001-ref/003-settings/002-permissions.md b/_sources/manual/001-ref/003-settings/002-permissions.md new file mode 100644 index 00000000..fe915504 --- /dev/null +++ b/_sources/manual/001-ref/003-settings/002-permissions.md @@ -0,0 +1,58 @@ +```{only} html +[Нагоре](000-index) +``` + +# Права на групи + +Правата в **Dreem ERP** се управляват чрез меню **Администрация || Права на групи**. Настройките се организират по групи от избрани потребители. Потребителите се включват в подходящите групи спрямо необходимостта от ограничителни или разрешителни права. + +> Всеки потребител автоматично попада и в група *Всички*, която е системно настроена. + +За да влязат в сила правата, от **Администрация || Настройки || Системни: Ниво за сигурност** трябва да се посочи при какви условия системата ще прилага ограниченията. +Възможните варианти са: + + - *0 - Няма*: при това ниво на сигурност системата не прилага никакви ограничения в правата на потребителите; + - *1 - Само Функции*: системата прилага настройки за права върху функционалностите и различните генерации на + документи; + - *2 - Само Данни*: при това ниво на сигурност системата ограничава достъпа до съдържащите се данни; + - *3 – Функции и данни*: най-високо ниво на сигурност, при което ограниченията се прилагат едновременно върху + достъпа до функции и съдържащите се данни; + +1) Реквизитите с настройки в **Администрация || Права на групи** са организирани в дървовидна структура с обекти на системата за сигурност и списъци с права за всеки от тях. + +2) Раздел **Функции** съдържа всички функционалности и модули на системата. Чрез него се управляват общите операции и достъпът до отделните функционалности. + +![](902-permissions1.png){ class=align-center } + +При избор на обект на системата за сигурност вдясно се визуализира списък с права за тази функционалност. + +- **Група** - поле за избор на група, за която се дефинират права за достъп; +Системата предлага в падащо меню списък с всички предварително въведени групи потребители. +- **Права** - поле за конфигуриране на разрешителни и/или забранителни права на група; +От бутон **[...]** се отваря форма *Редакция: Права на група*. След избор на изглед *Общи* или *Разширени* системата визуализира списък с различни опции за настройка. Чрез поставяне на отметка в *Разрешени* или *Забранени* се дефинира достъпът по видове операции. + +![](902-permissions2.png){ class=align-center } + +- **Наследява права от родителски обекти** - настройка, която позволява за текущата функция да се активира/деактивира наследяването на ефективни права от родителски функционалности. Списък с наследени ефективни права се визуализира, когато настройката е активирана. Той включва информация за **Група**, за която са дефинирани права за достъп, и кратко описание на ефективните разрешителни и забранителни права. + +> Достъп до всички данни, валиден за всички потребители, може да се настрои чрез маркиране на раздел **Функции**. От списъка вдясно се обзавежда поле **Група** с *Всички*. В поле **Права** се отваря формата *Редакция: Права на група*, от която се разрешава достъп до всичко. + +3) В раздел **Данни** могат да се дефинират специфични настройки за избрани детайли. +Списък с права на данни се визуализира вдясно, след като е избран обект на системата за сигурност. + +![](902-permissions3.png){ class=align-center } + +- **Група** - от падащия списък в полето се избира група, за която се дефинират права за достъп; +Групите трябва да бъдат предварително въведени. +- **Права** - поле за настройка на ефективни права върху данни; +В полето се отваря форма *Редакция: Права на група*. Чрез поставяне на отметки се разрешава или забранява достъп по видове операции. +- **Върху ...** - в това поле се дефинират допълнителни критерии, отнасящи се до ефективните права на данни. +Бутон **[...]** в края на полето отваря форма за избор на детайлни критерии за правата върху данните. +В колона *Стойност* се посочват желаните ограничения, като системата предлага за избор единствено от предварително въведени настройки. + +![](902-permissions4.png){ class=align-center } + +- **Наследява права от родителски обекти** - настройка, която позволява за текущата функция да се активира/деактивира наследяването на ефективни права от родителски функционалности. +Когато наследяването е изключено, системата сигнализира чрез промяна в шрифта на избраната функционалност от тип *Данни*. + +4) **Запис** - бутон в лентата с инструменти за запаметяване на промените. \ No newline at end of file diff --git a/_sources/manual/002-docs/000-index.md b/_sources/manual/002-docs/000-index.md new file mode 100644 index 00000000..9a01b148 --- /dev/null +++ b/_sources/manual/002-docs/000-index.md @@ -0,0 +1,20 @@ +```{only} html +[Нагоре](../000-index) +``` +# Документи и процеси + +В този раздел се разглеждат основните процеси и въпроси, възникващи при работата с документи в системата. + + - [Документи и връзки между тях](001-documents/000-index.md) + - [Плащания](002-payments/000-index.md) + - [Счетоводство](003-accounting/000-index.md) + - [ТРЗ](004-payroll-documents/000-index.md) + + ```{toctree} +:maxdepth: 1 +:hidden: +001-documents/000-index.md +002-payments/000-index.md +003-accounting/000-index.md +004-payroll-documents/000-index.md +``` diff --git a/_sources/manual/002-docs/001-documents/000-index.md b/_sources/manual/002-docs/001-documents/000-index.md new file mode 100644 index 00000000..76c687cf --- /dev/null +++ b/_sources/manual/002-docs/001-documents/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Документи и връзки между тях + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/002-docs/001-documents/001-row-crosses.md b/_sources/manual/002-docs/001-documents/001-row-crosses.md new file mode 100644 index 00000000..36c3a07d --- /dev/null +++ b/_sources/manual/002-docs/001-documents/001-row-crosses.md @@ -0,0 +1,53 @@ +```{only} html +[Нагоре](000-index) +``` + +# Кросовете между документи и как да ги използваме + +В системата за по – лесна и удобна работа е заложена функционалност за +генериране на свързани документи от първичен документ като данните в +тях се попълват автоматично. Например от документ за покупка можете да +генерирате – складов документ, фактура, документ за плащане и +гаранционна карта. Тази опция се появява автоматично, когато +приключвате документ. Но дори в случай че приключите документа и след +известно време решите да генерирате свързани документи чрез отваряне +на документа и натискана на бутон ![](903-image66.png) от +лентата с инструменти ви се отваря същата форма, от където можете +автоматично да създадете необходимите документи. + +![](904-image67.png){ class=align-center } + +Друг начин да свържете документи е в ръчно да ги свържете. + +Банкови и касови документи можете да свържете ръчно като отворите +документа и от поле Свързан документ и Данъчен документ изберете +съответните документи. + +![](905-image68.png){ class=align-center w=15cm } + +Всички в връзки на един документ с други можете да видите в секция +**Връзки с документи**. + +![](906-image69.png){ class=align-center w=15cm } + +Третият вариант за свързване на документи е от секция Връзки с +документи. В лявата секция са изредени всички възможни +документи, които могат да се свържат към избрания. Връщате +документа в състояние Редакция и маркирате типа документ, с който +искате да свържете текущия. В дясната част от колона Ред от свързан +документ трябва да изберете съответния документ. + +![](907-image70.png){ class=align-center w=15cm } + +Продуктите в документите се свързват един по един като всеки път в Ред +от текущ документ избирате продукт от текущия и в Ред от свързан +документ избирате съответстващия му продукт от свързания. +Количествата в колони **Усвоено количество** в текущ документ и +**Усвоено количество** в свързан документ трябва да съвпадат. В случай +че сте правили трансформация и искате да свържете много продукти от +текущия документ към един продукт от свързан документ, сборът на +коефициентите в Усвоено количество в свързан документ трябва да +дават единица. Това се прави в случаите например когато продаваме +няколко продукта, но ги фактурираме като обща номенклатура. + +![](908-image71.png){ class=align-center w=15cm } diff --git a/_sources/manual/002-docs/001-documents/002-invoice-multiple-sales.md b/_sources/manual/002-docs/001-documents/002-invoice-multiple-sales.md new file mode 100644 index 00000000..98680ab0 --- /dev/null +++ b/_sources/manual/002-docs/001-documents/002-invoice-multiple-sales.md @@ -0,0 +1,49 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на фактура от множество продажби + +Създаване на фактура от множество продажби се използва в случаите, +когато имате няколко нефактурирани продажби към един контрагент и +трябва да му издадете обща фактура. + +За да създадете фактура, свързана към няколко фактури трябва да спазвате +следната процедура: + +1. От **Търговска система \>\> Документи за продажба** с натискане на десен бутон на мишката върху списъка с документи, изберете **Нов документ**. Отваря се празна форма за въвеждане на данни **Документ за продажба**. + +1. От меню **Средства** избирате опция **Генериране** **фактура от продажби**. Отваря се форма за **Избор – Редове на документи за продажба**. От списъка трябва да маркирате желаните продажби и да натиснете след това бутон **Напред**. Ако документите, които търсите ги няма в списъка, трябва да направите корекция във филтъра. + +В следващия пример ще генерираме фактура с дата 15.5.2010 по три +продажби на Миреастрой ООД с номер 0000000003, 0000000004 и +0000000005. + +![](909-image72.png){ class=align-center w=15cm } + +1. След натискане на бутона, в същата форма системата показва всички редове от избраните документи за продажба. От тук трябва да посочите кои продукти да бъдат включени във фактурата. След като маркирате желаните редове, натиснете бутон **Избор**. + +![](910-image73.png){ class=align-center w=15cm } + +1. Като резултат от предходните действия, системата генерира Фактура на базата на посочените от вас критерии и попълва автоматично всички полета. При наличие на еднакви продукти в различните продажби, системата ги обединява в един с общо количество (само в случай, че цените съвпадат). + +![](911-image74.png){ class=align-center w=15cm } + +Забележете че имахме 50 броя Цимент бял 50 кг. Девня по продажба +0000000003 и 30 по продажба 0000000004 и цената им е еднаква и в двата +документа. Във фактурата обаче са обединени и има само един ред с тази +номенклатура с 80 бройки. + +1. След като попълните и данните в заглавната част на фактурата, натиснете бутон **Приключен** от лентата с инструменти, за да валидирате документа. Форма **Свързани документи** ви дава възможност да генериране и свързан счетоводен документ със следните опции: + + - **Генериране на счетоводен документ и приключване** – поставяте отметка тук, ако искате да направите счетоводен запис на фактурата. + + - **Касов бон** – ако изберете тази опция системата ще направи счетоводно записване на плащането на фактурата, ако то е по касов път. + + - **Изписване на стоки/МЗ** – тази опция ви дава възможност системата автоматично да изпише счетоводно на стоки и материали по фактурата. + +![](912-image75.png){ class=align-center } + +След като сте избрали необходимите опции, трябва да натиснете бутон +**ОК** за изпълнението им. Веднага можете да забележите, че в секция +Свързани документи са се появили свързаните продажби. diff --git a/_sources/manual/002-docs/001-documents/003-purchases-transport-expenses.md b/_sources/manual/002-docs/001-documents/003-purchases-transport-expenses.md new file mode 100644 index 00000000..d6e222e6 --- /dev/null +++ b/_sources/manual/002-docs/001-documents/003-purchases-transport-expenses.md @@ -0,0 +1,30 @@ +```{only} html +[Нагоре](000-index) +``` + +# Разпределяне на разходи по транспорт при покупка + +В случаите в които освен фактурата за покупка с доставката пристига и +фактура за транспорт – например платили сте на спедиторска фирма за +доставката и искате да разпределите този разход върху стойността на +материалите трябва: + +1. Създавате документ за покупка, с който вкарвате фактурата за материалите и го приключвате. + +1. Създавате нов документ, с който вкарвате в системата фактурата за транспорта. + +С пристигането на иглен дървен материал получаваме и фактура за +транспорт, тъй като сме ползвали услугите на спедиторска фирма. +Искаме да разпределим този разход върху закупените материали. + +![](913-image76.png){ class=align-center w=15cm } + +1. Отивате в секция **Връзки** с документи и маркирате връзка **Покупки, за които текущата покупка е разход.** От колона **Ред от свързан документ** избирате чрез натискане на бутона с трите точки покупката за стоки, която създадохте преди това. Чрез натискане на бутон **Напред** от формата за избор изберете всички продукти, върху които искате да разпределите разхода за транспорт. + +![](914-image77.png){ class=align-center w=15cm } + +1. В списъка влизат всички избрани редове от покупката, а срещу всеки един от тях стои номенклатурата на транспорта. Маркирате всички редове и от меню **Средства** от лентата с инструменти, избирате **Разпределение на разходи** (можете и да натиснете десен бутон на мишката и да изберете същата опция). В прозореца за избор, който се появява трябва да въведете сумата на разхода за транспорт без ДДС. Можете да изберете как да разпределите разхода върху стоките – на база количеството или стойността и натискате **ОК**. Можете да приключите документа. + +1. След преизчисляване на склада от **Контролен панел \>\> Преизчисляване на склада** стойността на стоките в склада ще се увеличат. + +![](915-image78.png){ class=align-center w=15cm } diff --git a/_sources/manual/002-docs/001-documents/004-advances.md b/_sources/manual/002-docs/001-documents/004-advances.md new file mode 100644 index 00000000..0177375c --- /dev/null +++ b/_sources/manual/002-docs/001-documents/004-advances.md @@ -0,0 +1,88 @@ +```{only} html +[Нагоре](000-index) +``` + +# Работа с аванси + +В програмата съществува продукт *Аванс*. Този продукт е със стойност +1.00 лв с ДДС. Продуктът има специфични настройки, затова не трябва да +се трие. + +Схемата при издаване на фактура за аванс е идентична с издаване на +обикновена фактура с разликата, че използвате този продукт. + +Процесът е следният: + +1. Когато получите аванс от даден клиент, пускате документ за продажба, в който попълвате: + + - **Контрагент -** попълвате името на клиента (ръчно или го избирате от списък чрез натискане на бутон ![](916-image79.png)). + + - **Дата** – датата, на която са ви платили аванса + + - В редовете на документа попълвате: + + - **Продукт/материал -** избирате продукт *Аванс*. + + - **Количество -** попълвате сумата на аванса с ДДС. + + - **Мярка** - оставяте *брой*. + + - **Цена** - оставяте я да е 0,8333. + + - **Партида** - желателно е авансите да се водят с партиди, в противен случай системата ги обединява + +Рамтек Трейдинг ЕООД са ни платили 900 лв с ДДС аванс за тухли, които ще +купуват, но не знаят все още какъв вид. Трябва да се издаде фактура от +аванса и по – късно той да бъде приспаднат от сумата, която ще дължат +по издадената фактура. + +![](917-image80.png){ class=align-center w=15cm } + +1. Приключвате документа като натискате бутон ![](918-image81.png). + +В следния прозорец избирате: + +![](919-image82.png){ class=align-center } + + - Не слагате отметка за **Генериране на складови документи,** ако освен аванса нямате да фактурирате и стоки и материали (но и да сложим, такъв няма да се генерира). + + - Слагаме отметка в **Документ за плащане**, ако плащането е по каса и посочвате сумата. + + - Поставяте отметка за **Генериране на Фактура**, **Счетоводно записване**, „**Плащане през каса за сума от** (ако плащането е през каса) и на **Приключване**. + + - Не поставяте отметка за **Генериране на гаранц. карта**. + + - Ако искате да разпечатаме или да прегледате генерираните документи поставяте съответно отметки на **Печат** и **Преглед**. + +При тази схема системата разбира, че това е аванс и няма продадена +стока. + +1. Неусвоените аванси, с които разполагате, можете да видите от справка **Аванси по контрагенти** (в модул **Справки**). + +![](920-image83.png){ class=align-center w=15cm } + +В колона **Продажба** показва сумата на аванса фигурираща в документа за +продажба, а във колона **Фактури** сумата на аванса, ако сте издали +фактура по него. + +От тази справка виждате, че фирма Ремтек Трейдинг ЕООД са ви платили +аванс за 750лв (900 лв с ДДС), който сте отбелязали в системата с +документ за продажба и фактура. + +1. При последвала Продажба на стока, в документ за продажба избирате същият контрагент и попълвате продуктите и материалите по поръчката. За да приспаднете аванса избирате бутон **Неусвоени аванси на контрагент** ![](921-image84.png) от лентата с инструменти най – отгоре на формата (или от меню Средства). Появява се следната форма: + +![](922-image85.png){ class=align-center } + +В секция **Неусвоени аванси** са всички аванси, които е платил +контрагента и са все още неусвоени като се разделят по +партида, а в **Хронология аванси** се пази информация за всички +аванси, които е плащал клиента. Избирате запис от неусвоените аванси и +натискате бутон **ОК**. + + - Ако сумата на авансът е по – голяма от сумата в документа, системата автоматично променя в сумата на аванса като тази на продажбата, като отделен ред със знак (-). По този начин стойността на документа става (0,00). + + - Можете да изберете няколко аванса по един и същи документ. + + - При избор на аванс в поле **Количество** можете да промените сумата на аванса, ако искате да приспаднете само част от него. Другата част от аванса ще остане по сметката на клиента и можем да я приспаднете от някоя друга продажба. + +![](923-image86.png){ class=align-center w=15cm } diff --git a/_sources/manual/002-docs/001-documents/005-currency-invoices.md b/_sources/manual/002-docs/001-documents/005-currency-invoices.md new file mode 100644 index 00000000..ef0ea2d3 --- /dev/null +++ b/_sources/manual/002-docs/001-documents/005-currency-invoices.md @@ -0,0 +1,35 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на валутни фактури за покупка и продажба + +При внос, износ или други сделки с чуждестранни лица, се налага да се +издават документи, които пораждат вземания или задължения във валута. +За да се посочи, че сделката е във валута, тя трябва да се укаже при +въвеждането на документа (покупка, продажба). Избора на валута в +която да бъде вземането или задължението става на в секция +**Допълнителни** на документа. Освен валутата се посочва и курса +на който възниква задължението. + +Валутите избрани в редовете нямат нищо общо с валутата, в която е +указано вземането или задължението. + +Например: Продавате продукти от група А и група B, съответно по техните +ценови листи в EUR и USD. Контрагентът ви е чуждестранно лице от +Швейцария и е уговорено валутата на сделката да е CHF. В този +случай, на втория панел на продажбата, за валута в която ще се +породи вземането избирате CHF и курс BGN/CHF. + +![](924-image87.png){ class=align-center w=15cm } + +При осчетоводяването на валутни документи, вземането или задължението ще +се отрази като валутна и левова стойност едновременно, по указания курс, +а закупените или продадени стоки и услуги, съдържащи се в документа, ще +се осчетоводят само със техните количествени и левови стойности. + +Ако искате да разпечатате документа, трябва да изберете подходящ шаблон +с изглед за валутна фактура от бутон **Печат \>\> Настройки \>\> +Бланка.** + +![](925-image88.png){ class=align-center } diff --git a/_sources/manual/002-docs/002-payments/000-index.md b/_sources/manual/002-docs/002-payments/000-index.md new file mode 100644 index 00000000..edac3a33 --- /dev/null +++ b/_sources/manual/002-docs/002-payments/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Плащания + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/002-docs/002-payments/001-offsets.md b/_sources/manual/002-docs/002-payments/001-offsets.md new file mode 100644 index 00000000..e60f9ca9 --- /dev/null +++ b/_sources/manual/002-docs/002-payments/001-offsets.md @@ -0,0 +1,60 @@ +```{only} html +[Нагоре](000-index) +``` + +# Прихващания + +Често в практиката се оказва, че някой контрагенти са ви едновременно +доставчици и клиенти. След което се появяват случаи, в които трябва +да прихванете плащания – имате задължения ви вземания от клиента +едновременно. В такива случаи се издава протокол за прихващане и +се доплаща остатъкът. + +В системата е разработен специален вид документ **ПротПрихв** (Протокол +за прихващания). В него трябва да изберете двата документа – Покупката +и Продажбата, за да прихванете дължимите суми по тях. + +Процесът е следния: + +1. Създавате документ за покупка, попълвате го и го приключвате по стандартния начин. + +1. Създавате документ за продажба към същия контрагент, попълвате и приключвате и него. + +По този начин в системата се завеждат вземанията и задълженията към +контрагента. За да ги приспаднете трябва да създадете документ за +прихващане. + +1. От **Търговска система \>\> Касови документи \>\>** с натискане на десен бутон на мишката върху списъка с документи, изберете **Нов документ**. + +В него трябва да попълните: + + - **Док. тип** – задължително трябва да изберете *ПротПрихв;* + + - **Док. дата** – датата на прихващането; + + - **Контрагент** – контрагента, на който ще издавате протокола; + + - **Свързан док** - изберете покупката и продажбата и данъчните им документи (чрез натискане на бутона с трите точки и навигиране с бутон **Напред**); + + - **Основание за плащане** – на покупката изберете *Разходи за покупки*, а на продажбата – *Приходи от продажби;* + +**Операция** – на покупката трябва да се е попълнило *Разход*, а на +продажбата – *Приход;* + +В примера сме закупили материали на стойност 1 876,80лв от Текса АД и +сме продали на същата фирма стоки на стойност 2 116,03лв. Искаме да +прихванем двата документа, така че да остане да се изплаща само +разликата в стойностите им. + +![](901-image89.png){ class=align-center w=15cm } + + - **Сума валута** – и на двата реда сумата трябва да е еднаква т.е. трябва да вземете по – малката от двете суми и да я въведете и в реда с по – голямата. Сумата на документа накрая винаги трябва да е равна на нула. + +В примера тъй като сумата по документа за покупка е по – малката, +коригираме и дали на продажбата със същата стойност. + +![](902-image90.png){ class=align-center w=15cm } + +1. Можете да приключите документа. От формата за генериране на свързани документи можете да изберете да генерирате счетоводен запис. Счетоводната операция ще се попълни автоматично, само ако сте настроили правилно предварително за това автоматичния осчетоводител. + +1. Проверете двата документа. Ако са били на различна стойност единият трябва да е напълно платен, а вторият частично. diff --git a/_sources/manual/002-docs/002-payments/002-exchange-differences.md b/_sources/manual/002-docs/002-payments/002-exchange-differences.md new file mode 100644 index 00000000..3e30dedd --- /dev/null +++ b/_sources/manual/002-docs/002-payments/002-exchange-differences.md @@ -0,0 +1,78 @@ +```{only} html +[Нагоре](000-index) +``` + +# Въвеждане на курсови разлики + +В системата има вграден алгоритъм, който изчислява автоматично курсовите +разлики при плащане. + +В следващият пример ще разгледаме всички възможни варианти: + +Имате банкова сметка в лева с наличност от 10’000 лв. + +Имате банкова сметка в EUR с наличност 200 EUR + +Имате задължение към Доставчик 1 по фактура номер 1 на стойност 800 EUR +възникнало по курс 1.95583. + +Имате задължение към „Доставчик 2” по фактура номер 2 на стойност 700 +USD възникнало по курс 1.35. + +Решавате от левовата сметка да прехвърлите пари в сметката в EUR, за да +платите задължението в евро, и пак от левовата сметка ще изплатите +задължението в USD. След като наредите плащанията, от банката +получавате банковите извлечения съдържащи информация за +направените плащания и трябва да ги отразите в системата. +Първата операция по прехвърляне на средства между левовата и +валутната ни сметка е отразена и в двете банкови извлечения – +това на валутната сметка и това на левовата. За да закупите 600 EUR , +банката ви е дръпнала от левовата сметка 1’176 лв. Извлечението в лева +го отразявате в системата с основание *Прехвърляне на средства банка - +банка*. Осчетоводяването, което ще се генерира от системата е следното: + +500 1’176 лв. (Транзитна сметка) + +503 1’176 лв. Банка лв. + +При въвеждане на извлечението от валутната банка ние ще въведем 2 реда. +Първият ще е с основание *Прехвърляне на средства банка - банка* и ще е +за 600 EUR по курс 1.95583, на стойност 1’173.50 лв. Вторият ред в +банковото извлечение ще бъде с основание *Отрицателна курсова +разлика* и ще бъде на стойност 2.50 лв. Осчетоводяването, което ще +се генерира от системата е следното: + +504 1’173.50 лв. (600 EUR) Валутна банка + +500 1’173.50 лв. (Транзитна сметка) + +500 2.50 лв. (Транзитна сметка) + +629 2.50 лв. Загуби от финансови операции + +След тези операции във валутната банка имате общо 800 EUR на курс +1.95583. При плащане на задължението във EUR няма да имате курсова +разлика, защото и то е възникнало на същия курс. Но при плащане на +задължението в USD ще възникне разлика, поради факта че то е възникнало +на курс 1.35 , а банка ви е дръпнала от сметката 966 лв. При въвеждане +на плащането в банката системата автоматично ще сметка курсовата +разлика от 21 лв. Осчетоводяването, което ще се генерира от +системата е следното: + +504 966 лв. (700 USD) Валутна банка + +401 945 лв. (700 USD) Доставчик 2 + +629 21 лв. Загуби от финансови операции + +Ако разбира се курса на USD е паднал и банка ви взема по малко пари +например 910 лв., то системата ще отчете положителна курсова +разлика и осчетоводяването ще има 2 статии: + +504 945 лв. (700 USD) Валутна банка + +401 945 лв. (700 USD) Доставчик 2 + +504 35 лв. Валутна банка + +729 35 лв. Приходи от валутни операции diff --git a/_sources/manual/002-docs/002-sales-purchases/000-index.md b/_sources/manual/002-docs/002-sales-purchases/000-index.md new file mode 100644 index 00000000..c6af4de5 --- /dev/null +++ b/_sources/manual/002-docs/002-sales-purchases/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Покупки и продажби + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/002-docs/002-sales-purchases/001-create-purchase-documents.md b/_sources/manual/002-docs/002-sales-purchases/001-create-purchase-documents.md new file mode 100644 index 00000000..b3de5842 --- /dev/null +++ b/_sources/manual/002-docs/002-sales-purchases/001-create-purchase-documents.md @@ -0,0 +1,92 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на документ за покупка + +Документ за покупка се създава при сключване на сделка и на практика +представлява вътрешно-фирмен документ, чрез който се дефинира +договорка между Купувача и Продавача (доставчика). Със +създаването на документа, системата приема следното: + +1. Извършена е покупка на описаната стока в документа. + +1. Възниква задължение към доставчика. + +1. Стоката не е приета в склада. + +1. Няма получена фактура. + +Това са четири операции, които могат да бъдат извършвани от различни +звена в дадена организация, но могат и едновременно. Затова +системата позволява при валидиране (приключване) на документа, +да бъдат генерирани останалите документи по сделката, а именно: + + - **РКО** — разходен касов ордер. Погасява възникналото задължение към доставчика. + + - **ПСД** — приходен складов документ. Приема стоката от доставчика и увеличава наличността в склада. + + - **ФПок** — фактура за покупка. Генерира се фактура за покупка на база документа за покупка. + +В системата при стартиране на повече от документите се отваря прозорец, +чийто първоначален изглед е във вида на справка. Целта е да се улесни +потребителя, тъй като много често той търси информация за определен +документ, преди да извърши нов запис. За да намерите информация за +стар документ трябва да се зададе период във филтъра. За по – голямо +бързодействие е наличен бърз филтър в лентата с инструменти, което +работи върху документите филтрирани от основния филтър. + +Процесът на създаване на покупка е следният: + +1. За да създадете документ за покупка от **Търговска система \>\> Документи за покупка \>\>** натискате на десен бутон на мишката върху списъка с документи и избирате **Нов документ**. Отваря се празна форма **Документ за покупка** за въвеждане на данни. В нея трябва да попълните: + + В секция **Общи**: + + - **Док. тип** – избирате *Покупка* (по подразбиране това е избрано); + + - **Док. дата –** попълвате датата на документа; + + - **Док. No** — в полето записвате номера на документа, с който пристига стоката; + + - **Основание за прилагане** – оставяте *С право на пълен ДК*, ако покупката е обложена с ДДС 20 %. От падащи списък можете да промените основанието, ако покупката е необлагаема или процента е различен. Основанията за прилагане трябва да въведете предварително от **Референтни номенклатури \>\> Счетоводство \>\> Основания на прилагане**. + + В секция **Купувач**: + + - **Плащане** – избирате: *в брой* – ако покупката е била платена в брой или *По банков път* – ако сте платили по банков път; + + - **Въвел** — от падащия прозорец избирате персона, която въвежда документа. + + В секция **Доставчик**: + + - **Контрагент** — избирате бутона с трите точки срещу поле **Контрагент** в секцията **Доставчик**. Отваря се Форма за избор - **Контрагенти**. Маркирате контрагент с мишката и след това натискате бутон **Избор**. Контрагентите трябва да бъдат предварително въведени. + + Останалите полета получават автоматично стойности в зависимост от +избрания контрагент. + + В редовете на документа задължително трябва да попълните: + + - **Продукт/Материал** — позиционирате мишката върху поле **Продукт/Материал** в реда за добавяне на нови записи. Натискате бутона с трите точки в края на полето. Отваря се Форма за избор - **Продукти и материали**. Маркирате продукт с мишката и бутон **Избор** го добавя в списъка. + + - **Количество** — в полето записвате полученото количество по документ. + + - **Цена** — в полето записвате единичната цена без ДДС по получения документ. + + ![](901-purchase-activate.png){ class=align-center w=15cm } + +1. След като попълните задължителната информация в документа, трябва да изберете бутон **Приключен** в лентата с инструменти. По този начини документа се валидира документа и извежда форма **Генериране - Свързани документи**. Чрез тази форма могат да бъдат генерирани автоматично останалите операции: **ПСД** - приходен складов документ, **РКО** - разходен касов ордер и **ФПок** - фактура за покупка. + + ![](902-purchase-gener.png){ class=align-center } + + - **Генериране на Складови документи** — поставяте отметка, ако стоката е пристигнала в склада и трябва да я заприходите. Чрез опция **Приключване** системата автоматично валидира документа. Можете и да промените датата на документа, ако е необходимо. + + - **Генериране на документ за плащане** — ако стоката ще бъде платена на място през каса, маркираме тази опцията и **Приключване**, за да може системата автоматично да валидира документа. + + - **Генериране на фактура No** — избирате тази опция, ако имате фактура към покупката и записвате номера и датата в съответните полета. За да генерирате счетоводно записване по тази фактура, маркирате опцията **Счетоводно записване** и ако сте създали касов ордер, маркирате и **Плащане през каса за сумата от** (Последната операция ще бъде изпълнена коректно, само ако автоматичния осчетоводител е настроен). Маркирате опцията **Приключване**, за да може системата автоматично да валидира документа. + + - **Генериране на гаранц. Карта N** – можете да маркирате тази опция, ако при съответната покупка са ви издали гаранционна карта и искате да пазите тази информация в системата. + + - **Следваща операция – Печат и Преглед** – слагате отметки, ако искате да разгледате и/или отпечатате документа за покупка. + +1. След като маркирате избраните опции, натискате бутон **Ок** за изпълнението им. Системата генерира свързаните документи и валидира (приключва) **Документа за покупка**. + +1. **Запис и Изход** — бутон в лентата с инструменти. Записва документа и излиза от формата. diff --git a/_sources/manual/002-docs/002-sales-purchases/002-create-sales-document.md b/_sources/manual/002-docs/002-sales-purchases/002-create-sales-document.md new file mode 100644 index 00000000..b53912d4 --- /dev/null +++ b/_sources/manual/002-docs/002-sales-purchases/002-create-sales-document.md @@ -0,0 +1,118 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на документ за продажба + +Документ за продажба се създава при сключване на сделка и на практика +представлява вътрешно-фирмен документ, чрез който се дефинира +договорка между **Продавача (в случая потребителя на продукта) и +Купувача (клиента)**. Със създаването на документа, системата приема +следното: + +1. Извършена е продажба на описаната стока в документа. + +1. Възниква вземане от клиента. + +1. Стоката не е изписана от склада. + +1. Няма издадена фактура. + +Това са четири операции, които могат да бъдат извършвани от различни +звена в дадена организация, но могат и едновременно. Затова +системата позволява при валидиране (приключване) на документа, +да бъдат генерирани всички останали документи по сделката, а именно: + + - **ПКО** — приходен касов ордер. Погасява възникналото вземане от клиента. + + - **РСД** — разходен складов документ. Издължава стоката на клиента и намалява наличността в склада. + + - **ФПрод** — фактура за продажба. Генерира се фактура за продажба на база документа за продажба. + +Процесът на създаване на продажба е следният: + +1. За да създадете документ за продажба от **Търговска система \>\> Документи за продажба** с натискане на десен бутон на мишката върху списъка с документи, изберете **Нов документ**. Отваря се празна форма за въвеждане на данни **Документ за продажба**. + + ![](903-image12.png){ class=align-center w=15cm } + +1. Попълвате следните данни: + + В секция **Общи**: + + - **Док. тип** – избирате продажба (по подразбиране това е избрано); + + - **Док. дата** – попълвате датата на документа + + - **Основание за прилагане** – оставяте „Облагаеми доставки със ставка 20%”, ако продажбата се облага с ДДС 20 %. От падащи списък можете да промените основанието, ако продажбата е необлагаема или процента е различен. Основанията за прилагане трябва да въведете предварително от **Референтни номенклатури \>\> Счетоводство \>\> Основания на прилагане**. + + В секция **Доставчик**: + + - **Място** – попълвате града, къде се намира фирмата ви. Попълва се по подразбиране с града, който е зададен в **Администрация \>\> Настройки \>\> Стойности по подразбиране \>\> Населено място**. + + - **Плащане** – избирате *В брой* – ако плащането ще е в брой или *По банков път* – ако клиентът ще плати чрез банка; + + Останалите полета можете да ги оставите със стойностите им по подразбиране. + + В секция **Купувач**: + + - **Контрагент** - избирате бутона с трите точки срещу полето **Контрагент**. Отваря се Форма за избор - **Контрагенти**. Маркираме контрагент с мишката и след това бутон **Избор**. Контрагентите трябва да бъдат предварително въведени. + + Останалите полета получават автоматично стойности в зависимост от избрания контрагент. + + В редовете на продажбата попълвате: + + - **Продукт/Материал** — позиционирате мишката върху поле **Продукт/Материал** в реда за добавяне на нови записи. Натискате бутона с трите точки в края на полето. Отваря се Форма за избор - **Продукти и материали**. + + В нея можете да видите наличностите във всеки склад като в поле +**Склад** от лентата с инструменти изберете съответния склад. По +този начин в поле **Разполагаемо количество** се виждат наличностите +само за съответния склад. + + Ако искате да вземете конкретна цена за съответните продукти от +определена ценова листа, в поле **Ц. листа** трябва да посочите +листата, по която искате да ценообразувате. + + В секция **Редове на документи за продажба** могат да се видят всички +документи издавани на този клиент за посочен период както и подробна +информация за продадените продукти, количествата, цени и т.н. Това е +удобно да се използва, ако искате да видите последните продажни цени +към този клиент. + + ![](904-image13.png){ class=align-center w=15cm } + + В секция **Признаци** можете да видите счетоводната наличност на склада. +За целта трябва да попълните филтъра по следния начин: + + ![](905-image14.png){ class=align-center } + + В справката, която се появява в колона **Салдо** се вижда разполагаемото +количество на материала в счетоводния склад. В колона **Разполагаемо** +се вижда разликата между наличното количество и фактурираното, но все +още не изписано количество. + + ![](906-image15.png){ class=align-center w=15cm } + + Маркирате продукт с мишката и бутон **Избор** го добавя в списъка. +Продуктите трябва да бъдат предварително въведени. + + - **Количество** — в полето записвате, количеството което ще продавате на клиента; + + - **Цена с ДДС** — в полето записвате единичната цена с ДДС на продаваната стока. + +1. След като сте попълнили всички необходими полета, натиснете бутон **Приключен** от лентата с инструменти. По този начин документа се валидира и се извежда форма **Генериране - Свързани документи**. Чрез тази форма могат да бъдат генерирани автоматично всички останали операции: **РСД** - разходен складов документ, **ПКО** - приходен касов ордер и **ФПрод** - фактура за продажба. + +1. В **Свързани документи** имате следните опции: + + - **Генериране на Складови документи** — ако стоката е изписана или трябва да се изпише от склада и съответно да се намали наличността и, маркирате опцията **Генериране на Складови документи** и опцията **Приключване**, за да може системата автоматично да валидира документа. В поле **Склад** избирате склада, от който ще изписвате стоките. + + - **Генериране на Документ за плащане** — ако стоката ще бъде платена на място през каса, маркирате опцията **Генериране на Документ за плащане** и опцията **Приключване**, за да може системата автоматично да валидира документа. + + - **Генериране на Фактура** — за да генерирате фактура по тази продажба, маркирате опцията **Генериране на Фактура** и опцията **Приключване**, за да може системата автоматично да валидира документа. Към тази фактура можете да генерирате счетоводно записване в **Счетоводната система** като маркирате опция **Счетоводно записване**. Ако сте избрали да генерирате **Касов ордер** по тази продажба, би трябвало да генерирате и счетоводно записване за плащане през каса към тази фактура. За целта маркирате опция **Плащане през каса за сумата от**. Отметка в **Изписване на стоки/МЗ** поставяте, за да изпишете стоките от счетоводния склад. + + ![](907-image16.png){ class=align-center } + +1. Можете да прегледате и отпечатате документа за продажба, както и всички свързаните с него документи като поставите отметки съответно в полетата **Печат** и **Преглед**. + +1. След като маркирате избраните опции, натискате бутона **Ок** за изпълнението им. Системата генерира свързаните документи и валидира (приключва) **Документа за продажба**. + +1. **Запис и Изход** — бутон в лентата с инструменти. Записва документа и излиза от формата. diff --git a/_sources/manual/002-docs/002-sales-purchases/003-credit-note.md b/_sources/manual/002-docs/002-sales-purchases/003-credit-note.md new file mode 100644 index 00000000..4b507c66 --- /dev/null +++ b/_sources/manual/002-docs/002-sales-purchases/003-credit-note.md @@ -0,0 +1,65 @@ +```{only} html +[Нагоре](000-index) +``` + +# Кредитен документ/Кредитно известие + +Кредитните документи аналогично на документите за покупки и продажби са +два – един вътрешно – фирмен (Кредитен документ), който се свързва към +Документ за покупка/продажба и един данъчен (Кредитно известие), който +се свързва към фактурата. Кредитен документ/Кредитно известие се издава +за връщане на стока или за намаляване на цена и поради тази причина +винаги изисква връзка с Продажба/ Фактура. Съществува и трети вид +Кредитен документ/ Кредитно известие – бонус оборот. То се издава като +бонус за създадения оборот и не изисква връзка с Продажба/Фактура. + +Процесът на създаване на кредитен документ е следният: + +1. За да създадете кредитен документ трябва да намирате покупката/продажбата, към която е кредитното и да я отворите. За целта от менюто с инструменти избирате **Средства \>\> Генериране на кредитен документ/известие**. Появява се прозорец **Редове за документи за покупка**, където е маркирана покупката. Избирате я (ако не е маркирана, трябва да я потърсите – вероятно проблема е във филтъра) и натискате бутон **Напред**. От списъка с продукти избирате тези, които са включени в кредитното и натискате бутон **Избор**. + + ![](908-image17.png){ class=align-center w=15cm } + + ![](909-image18.png){ class=align-center w=15cm } + + Създава се кредитен документ за покупка. В него попълвате: + + - **Док. тип** – КДПок (избран е по подразбиране); + + - **Док. номер** – номера на кредитното известие; + + - **Док. дата** – датата на документа; + + - **Основание на прилагане** – избирате същото основание като това във фактурата; + + - **Тип известие** - *корекция на количества* – ако известието е, за да се върнат продукти; *корекция на цена*- ако е за промяна на цената на закупени продукти. + + ![](910-image19.png){ class=align-center w=15cm } + + В редовете на документа променяте съответно количеството или цената. +След като сме посочили типа на известието, програмата автоматично +поставя минус в количеството или цената. + + Приключваме известието като избирате: + + ![](911-image20.png){ class=align-center } + + - **Приход в –** маркирате тази опция, ако типът на известието е *Корекция на количества*, за да върнете материалите в склада. Избирате склада, в който да влязат продуктите и посочвате датата, на която са физически върнати. + + - **Плащане от** – избирате прихващане, за да прихванете сумата на кредитното от сумата, дължима по покупката/продажбата и попълвате датата с датата на кредитното. + + - **Издаване Кредитно известие за покупка/ продажба** – попълвате номер и дата (ако сте ги попълнили в кредитния документ, системата ще ти вземе автоматично от вече попълнените). Слагате отметка на **Счетоводно записване** и **Прихващане**, за да осчетоводите автоматично документа и да се прихванат счетоводно двата документа и плащанията по тях. + + - И на трите места слагаме отметка на **Приключване**, ако няма да правите редакции по документите. + +1. След като маркирате избраните опции, натискате бутона **Ок** за изпълнението им. Системата генерира свързаните документи и валидира (приключва) Кредитния документ. Свързаните документи са два: кредитно известие и Протокол за прихващане (ПротПрихв). Чрез него прихващате сумата на кредитния документ от покупката. + +1. **Запис и Изход** — бутон в лентата с инструменти. Записва документа и излиза от формата. + +За да развържете или свържете двата документа (КДПок и Покупка или КИПок +и Фактурата – аналогично), трябва да върнете съответния документ в +състояние на редакция и в секция **Връзки с документи** да +изберете **Покупки/Фактури** за които се отнася известието. +Маркирате свързващите записи и ги изтривате. Приключвате отново +документа. Аналогични са операциите при продажба. + +![](912-image21.png){ class=align-center w=15cm } \ No newline at end of file diff --git a/_sources/manual/002-docs/002-sales-purchases/003-invoice-multiple-wd.md b/_sources/manual/002-docs/002-sales-purchases/003-invoice-multiple-wd.md new file mode 100644 index 00000000..9b4e0586 --- /dev/null +++ b/_sources/manual/002-docs/002-sales-purchases/003-invoice-multiple-wd.md @@ -0,0 +1,39 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на фактура с няколко разходни документа + +В случай че имате фактура за покупка или продажба, в която някои от +продуктите са за един склад, а други за друг, трябва да издадете +няколко разходни документи – по един за всеки склад, в който ще +влизат материалите. Това можете да осъществите като: + +1. Създадете документ за покупка/ продажба и го попълните. + + ![](913-image22.png){ class=align-center w=15cm } + +1. Приключите документа като поставяте отметка в поле **Генериране на Складови документи**. Попълвате датата, избирате склада и не маркирате поле **Приключване**. + + ![](914-image23.png){ class=align-center } + +1. Отваряте складовия документ и изтривате от него всички материали, които не трябва да влизат в този склад. Приключвате документа. + +1. Повтаряте точки 2 и 3 докато издадете документ за всеки склад, в който трябва да влязат материалите. Във всеки следващ разходен документ влизат само тези продукти, които не са заприходени в склад т.е. последния складов документ можете да не го пускате в редакция, а направо да го приключите. + +```{tip} +В случая на картинката сме закупили 40 бр - Цимент бял 25кг. Девня и 80 +бр. - Цимент бял 50 кг. Девня и получаваме фактура за тях. Искаме да +заприходим обаче 20 бр от Цимент бял 25кг. Девня и 50 бр от Цимент +бял 50 кг. Девня в склад Варна, а останалите в склад Бургас. От +формата за създаване на свързани документи избираме да генерираме +складов документ като не поставяме отметка да се приключи. Отваряме +документа, който е в редакция и променяме количеството съответно на +20 и 50 бройки и го приключваме. От същата форма за създаване на +документи генерираме втори разходен документ, но този път +избираме складът да е Бургас. Този път поставяме отметка да се +приключи документа. Във втория складов документ влизат останалите +незаприходени съответно 20 и 30 бройки цимент. +``` + +![](915-image24.png){ class=align-center w=15cm } \ No newline at end of file diff --git a/_sources/manual/002-docs/003-accounting/000-index.md b/_sources/manual/002-docs/003-accounting/000-index.md new file mode 100644 index 00000000..ce30c6e6 --- /dev/null +++ b/_sources/manual/002-docs/003-accounting/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Счетоводство + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/002-docs/003-accounting/001-acc-doc.md b/_sources/manual/002-docs/003-accounting/001-acc-doc.md new file mode 100644 index 00000000..6d7b0ab5 --- /dev/null +++ b/_sources/manual/002-docs/003-accounting/001-acc-doc.md @@ -0,0 +1,91 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на счетоводен документ + +Тъй като системата се състои условно от два главни модула – Търговска и +Счетоводна система, можете да създавате документи не само от +Търговската система и да им правите счетоводни записи, но и +да създавате счетоводни документи директно без те да имат връзка с +вътрешно-фирмени документи. В счетоводната система можете да +създавате и осчетоводявате документи от всякакъв тип като ръчно +(без помощта на автоматичния осчетоводител) избирате счетоводните +сметки. + +Счетоводният документ в системата се състои от три секции – Документ, +Счетоводна статия и Връзки с документи. В първата секция се въвеждат +основните реквизити на документа – тип, дата, номер, информация за +дневниците по ЗДДС и други. Втората представлява самата счетоводна +статия, в която се въвеждат счетоводните операции – посочват се +сметките, признаците, количествата, цени, дебит и кредит. С +терминът „Водеща сметка” в системата се обозначава сметката, която +се въвежда в горната част на секцията, а в редовете на статията се +въвеждат нейните една или повече кореспонденции. Водещата сметка +може да е както по кредита, така и по дебита. Тъй като понякога се +налага въвеждането на няколко счетоводни статии в един документ, в +системата е предвидена опция във всеки документ да могат да се +създават множество статии. Това може да направите като от лентата +с инструменти в документа натиснете бутон „Нова” толкова пъти колкото +статии искате да създадете. В третата секция на документи можете да +видите връзките с други счетоводни документи – с документа за плащане +например. +```{tip} +В следващия пример ще създадем счетоводна фактура за покупка на +материали от фирма Колорит ЕООД. Общата стойност на фактурата е +1151,94, 959,59 – данъчна основа и 191,99 – ДДС. Счетоводните записи, +които трябва да се генерират са 302/4011 и 4531/4011. +``` +![](901-image38.png){ class=align-center w=15cm } + +![](902-image39.png){ class=align-center w=15cm } + +- Можете да създадете нов счетоводен документ като от **Счетоводство \>\> +Счетоводни документи \>\>** с натискане на десен бутон на мишката и +изберете **Нов документ**. Трябва да попълните следната информация: + + В секция **Документ**: + + - **Док тип -** избирате типа на документа – обикновено ФПок (фактура за покупка), ФПрод (фактура за продажба) или МО (мемориален ордер). Типовете документи са предварително дефинирани в **Номенклатури \>\> Типове документи**. + + - **Док номер –** попълвате номера на документа + + - **Док дата –** датата на документа + + - **Основание за прилагане –** избира се съответното основание – дали ще се начислява ДДС и какъв процент + + - **Дн. покупки колона/ дн. продажби колона –** ако документът, който вкарвате е фактура, избирате съответния дневник. В противен случай ги оставяте празни + + - **Данъчна основа –** попълва се данъчната основа по документа, която трябва да влезе в дневниците + + - **Стойност ДДС –** попълва се ДДС-то от документа, което трябва да влезе в дневниците + + В секция **Счетоводна статия**: + + В заглавната част: + + - **Сметка** – попълвате водещата сметка + + - **Отч. дата –** попълва се отчетната дата на документа + + - **Признак –** избира се в зависимост от сметката (ако е 401 или 411 – контрагента, ако е 701 – продукцията). + + - **Количество** - 1 + + - **Мярка** – съответната мярка (обикновено – брой) + + - **Цена** – сумата от цялата статия (т.е сбора на количество\*цена от всички редове) + + В редовете на статията се избират материалите и стоките със съответните +им сметки, количества и цени. + + За улеснение на работата ви можете да ползвате готовата функционалност +на системата за автоматично начисляване на ДДС на статията от меню +**Средства** в лентата с инструменти в документа, трябва да изберете +**Начисляване на ДДС**. + + Ако генерирате няколко идентични статии в един документ, можете да ги +копирате като от меню **Средства** изберете **Копиране на статия.** + + Полетата **Дебит/Кредит** най – долу във формата включват дебита и +кредита сумирани от всички статии в документа. diff --git a/_sources/manual/002-docs/003-warehouse-documents/000-index.md b/_sources/manual/002-docs/003-warehouse-documents/000-index.md new file mode 100644 index 00000000..d284360a --- /dev/null +++ b/_sources/manual/002-docs/003-warehouse-documents/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Складови документи + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/002-docs/003-warehouse-documents/001-beg-saldo.md b/_sources/manual/002-docs/003-warehouse-documents/001-beg-saldo.md new file mode 100644 index 00000000..c313b440 --- /dev/null +++ b/_sources/manual/002-docs/003-warehouse-documents/001-beg-saldo.md @@ -0,0 +1,42 @@ +```{only} html +[Нагоре](000-index) +``` + +# Начално салдо на склад + +За да имате коректна информация за складовите наличности е необходимо да +се въведат начални салда на складовете, с актуални количества и +стойности. Стоките се заприхождават задължително по доставни +цени без ДДС. + +1. За да вкарате начално салдо в склад от **Търговска система \>\> Складови документи \>\>** с натискане на десен бутон на мишката изберете **Нов.** Отваря се форма за въвеждане и редакция на складови документи. + +1. В нея трябва да се попълни: + + В секция **Общи**: + + - **Док. тип** – трябва да изберете *НСС* – Начално салдо на склад; + + - **Док. дата** – датата на документа определя датата, към която ще се заприходят стоките; + + - **Док. No** – оставете го празно и системата ще генерира автоматично пореден номер на документ за този склад; + + В секция **Склад**: + + - **Склад** – посочете склада, за който се отнасят началните салда + + - **МОЛ** – трябва да посочите отговорника на този склад + + В секция **Титуляр**: + + - **Контрагент** – изберете вашата фирма (потребителят на продукта); + + - В редовете на документа: + + - **Продукт/материал** – избирате продуктите, които са налични в склада към тази дата. Продуктите трябва да са предварително въведени в системата. + + - **Количество** – въвеждате количеството на продуктите към датата на документа; + + ![](901-image25.png){ class=align-center w=15cm } + +1. След въвеждане на списъка със стоки, документът трябва да бъде приключен, за да стане валиден документ. Това става чрез натискане на бутон **Приключен**, намиращ се на лента с инструменти на формата. diff --git a/_sources/manual/002-docs/003-warehouse-documents/002-transfer.md b/_sources/manual/002-docs/003-warehouse-documents/002-transfer.md new file mode 100644 index 00000000..1ffe5cd4 --- /dev/null +++ b/_sources/manual/002-docs/003-warehouse-documents/002-transfer.md @@ -0,0 +1,50 @@ +```{only} html +[Нагоре](000-index) +``` + +# Трансфер на материали между складове + +Когато имате движение на материали, стоки и продукция от един обект в +друг, то трябва да бъде отразено и в системата, тъй като въпреки, че +не е продажба, оказва влияние на складовите наличности. За да направите +трансфер на материали от един склад в друг, трябва да създадете два +документа – предавателен и приемателен протокол. И двата документа +са вътрешно – фирмени. Процесът е следния: + +1. Създавате нов складов документ от **Търговска система \>\> Складови документи \>\>** десен бутон – избирате **Нов документ**. + +1. В документа попълвате: + + - **Док. тип** – трябва да изберете *Пред;* + + - **Док. дата** – избирате деня на трансфера; + + - **Склад** – склада, от който ще изписвате продукти т.е. от кой склад ще вземете материалите + + - **Контрагент** – избирате фирмата ви (потребителят на продукта); + + В редовете да документа попълвате: + + - **Продукт/материал** - продуктите, които искате да трансферирате + + - **Количество** – количества, които искате да преместите. Цената се взима автоматично – среднопретеглената цена за този склад. + + ![](902-image26.png){ class=align-center w=15cm } + +1. Приключвате документа като в прозорец **Генериране** имате следните опции: + + - **Генериране на Счетоводно записване** – ако имате отделни подсметки за всеки склад в сметкоплана си, можете маркирате тази опция, с която автоматично ще се генерира и счетоводната статия (трябва да е настроен предварително автоматичния счетоводител). + + - **Приемателен протокол –** трябва да поставите отметка пред това поле, за да се генерира автоматично и вторият документ, с който излезлите материали от първия склад, ще се заприходят във втория. Като дата трябва да посочите датата, на която продуктите ще пристигнат в приемащия склад. В поле **Склад** избирате склада, в който ще се трансферират материалите т.е. кой склад ще приеме материалите. + +1. Можете да прегледате или отпечатате документите като поставите отметки пред **Печат** и **Преглед**. Избирате приключване и натискате бутон **ОК**. + + ![](903-image27.png){ class=align-center } + +1. По този начин генерирате едновременно двата документа – предавателен и приемателен протокол, които са свързани (виж **Връзки с документи**). + +1. Можете да проверите наличността на складовете дали е правилна след операцията. + + ```{tip} + В случая на картинката правим трансфер на тухли от Централен склад в склад Варна като не правим счетоводен запис на операцията. Предаването и получаването на стоката е в един и същи ден. + ``` diff --git a/_sources/manual/002-docs/003-warehouse-documents/003-inventory.md b/_sources/manual/002-docs/003-warehouse-documents/003-inventory.md new file mode 100644 index 00000000..78e0ecb4 --- /dev/null +++ b/_sources/manual/002-docs/003-warehouse-documents/003-inventory.md @@ -0,0 +1,44 @@ +```{only} html +[Нагоре](000-index) +``` + +# Документи за ревизия + +Документ за ревизия в системата се издава, когато след инвентаризация на +склада, се установят липси или загуби. В системата при приключване на +този документ автоматично се генерират още два свързани документа – +**Липси** и **Излишъци**. Тези два документа са складовите документи, с +които изкарвате/вкарвате материали в склада в зависимост от складовата +наличност, която сте установили след проверката. Чрез ревизията +коригирате количествата само в търговския склад. За да създадете +такъв документ трябва: + +1. Отваряте от **Търговска система \>\> Документи за ревизия \>\>** с натискане на десен бутон на мишката и избирате **Нов документ**. В него попълвате: + + - **Док дата** – датата на инвентаризацията + + - **Склад** – склада, на който правите ревизия + + - **Контрагент** – избирате фирмата си (потребителят на системата); + + В редовете на документа попълвате: + + - **Количество** - натискате бутона с трите точки и избирате всички материали, в количеството на които сте открили несъответствие + + - **Намерено количество** - попълвате реално намереното количество в склада + + - **Липса** и **Излишък** се изчисляват от системата, след като въведете стойности в предходната колона + + - **Валута** – BGN + +1. Когато сте попълнили необходимата информация, приключвате документа, в следствие на което се генерират автоматично два свързани документа. Свързаните документи могат да се видят и отворят от **Връзки с документи.** + + ![](904-image28.png){ class=align-center w=15cm } + + ```{tip} + В примера сме открили със 100 бройки по - малко от единичните гръцки тухли, с два по – малко лака – бамбук и с една бройка по – малко Игл. дървен материал греди 8/8 4м. отколкото трябва да са според данните въведени в системата. Открити са и с 5 броя повече Блажна боя пастелно синя 0.800кг и с една бройка повече Игл. дървен материал летви 2.5/4см. от очакваното. + ``` + +1. Ако имате открити излишъци в склада (при инвентаризацията сте намерили повече бройки отколкото са заведени в програмата) трябва да пуснете преизчисляване на склада – **Контролен панел \>\> Преизчисляване на склада.** Във филтъра избирате преизчисляване на разхода на склада като задължително трябва поставите отметка пред **Излишъци по ср. цени.** По този начин намерените материали взимат среднопретеглената цена за съответния склад. + + ![](905-image29.png){ class=align-center } diff --git a/_sources/manual/002-docs/004-payments/000-index.md b/_sources/manual/002-docs/004-payments/000-index.md new file mode 100644 index 00000000..edac3a33 --- /dev/null +++ b/_sources/manual/002-docs/004-payments/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Плащания + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/002-docs/004-payments/001-bank.md b/_sources/manual/002-docs/004-payments/001-bank.md new file mode 100644 index 00000000..eba20eb3 --- /dev/null +++ b/_sources/manual/002-docs/004-payments/001-bank.md @@ -0,0 +1,39 @@ +```{only} html +[Нагоре](000-index) +``` + +# Банково плащане + +Банковите плащания в системата се отразяват чрез Банкови документи. +Можете да генерирате отделен банков документ за всяка банкова +операция, един документ за всички операции през деня или друг +начин, съобразен с начина ви на работа. Чрез банкови документи се +отразяват не само плащания, свързани с вземани и задължения по +фактури, но и при плащане на данъци, застраховки, заплати и +осигуровки, банкови трансфери. Ако искате наличността на банковата +сметка в системата да отговаря напълно на реалното банково състояние, +трябва да отразявате абсолютно всяка реална операция и в системата. +Не е необходимо при всеки документ да бъде свързан с друг документ. +Процесът на създаване на банков документ е следният: + +1. Избирате от **Търговска система \>\> Банкови документи** с десен бутон върху списъка **\>\> Нов документ** и се отваря форма Банково извлечение. + +1. В него трябва да попълните: + + ![](901-image30.png){ class=align-center w=15cm } + + - **Док. No** - Дефинирате номер на банковото извлечение от полето**;** + + - **Док. дата** - с датата на плащането; + + - **Банкова сметка** - от падащия прозорец избирате банкова сметка, по която има движение; + + - **Контрагент данъчен док.** - избирате името на контрагента от бутона с трите точки в полето; + + - **Данъчен док.** - след избор на **Фактурата за продажба** (счетоводния документ), системата ви навигира до Вътрешно-фирмения документ (Продажбата), който трябва да изберете. По този начин се покрива плащането както по вътрешно-фирмения (Продажбата/ Покупката), така и по счетоводния документ (Фактурата). + + - **Основание за плащане** – трябва да посочите коректно основание за плащане. Основанията за плащане са предварително дефинирани в **Номенклатури \>\> Референтни номенклатури \>\> Търговска система \>\> Основания за плащане.** От избора на това основание зависи счетоводната операция, която ще се генерира при приключване на документа (ако правите счетоводен запис и автоматичният осчетоводител е коректно настроен). + +1. Натискате бутон **Приключен** от лентата с инструменти. Системата ви дава възможност за генериране на счетоводно записване. + +1. Коректен счетоводен запис ще се генерира, ако автоматичният счетоводител е предварително настроен. diff --git a/_sources/manual/002-docs/004-payments/002-cashdesk.md b/_sources/manual/002-docs/004-payments/002-cashdesk.md new file mode 100644 index 00000000..77561b65 --- /dev/null +++ b/_sources/manual/002-docs/004-payments/002-cashdesk.md @@ -0,0 +1,35 @@ +```{only} html +[Нагоре](000-index) +``` + +# Касово плащане + +Касов документ в системата се създава, за да се отрази плащане по касов +път. За разлика от банковите документи, касовите могат да са свързани +само с един контрагент и само с един документ в търговската/ +счетоводната система. Всички парични средства излезли или +постъпили в касата, трябва да бъдат отразени, за да има +съответствие на касовата наличност в системата и реалната. +Процесът на създаване на документ за касово плащане е следният: + +1. Избирате от **Търговска система \>\> Касови документи \>\>** десен бутон върху списъка \>\> **Нов документ** и се отваря форма **Разходен касов ордер** за създаване на касов документ. + + ![](902-image31.png){ class=align-center w=15cm } + +1. Трябва да попълните: + + - **Док. дата** - датата, на която е извършено плащането; + + - **Каса** - от падащия прозорец трябва да изберете касата, от която е извършено плащането. Касите са предварително дефинирани в **Номенклатури \>\> Референтни номенклатури \>\> Търговска система \>\> Основания за плащане.** + + - **Контрагент -** избирате името на контрагента от бутона с трите точки в полето. + + - **Основание за плащане** – избирате основание от падащия списък. Основанията за плащане са предварително дефинирани в **Номенклатури \>\> Референтни номенклатури \>\> Търговска система \>\> Каси.** От избора на това основание зависи счетоводната операция, която ще се генерира при приключване на документа (ако правите счетоводен запис и автоматичният осчетоводител е коректно настроен). + + - **Данъчен док.** – след като от бутона с трите точки изберете **Фактурата за покупка/продажба** (счетоводния документ), системата ви навигира до Вътрешно-фирмения документ (Продажбата), който също избирате. По този начин се покрива плащането както по вътрешно-фирмения (Документ за покупка/продажба), така и по счетоводния документ (фактурата). + +1. Приключвате РКО като натискате бутон **Приключен** от лентата с инструменти. + +1. При приключване на разходния касов ордер, системата ви дава възможност за генериране на счетоводно записване. + + ![](903-image32.png){ class=align-center } diff --git a/_sources/manual/002-docs/004-payments/003-transfer-bank.md b/_sources/manual/002-docs/004-payments/003-transfer-bank.md new file mode 100644 index 00000000..a1c9b4cd --- /dev/null +++ b/_sources/manual/002-docs/004-payments/003-transfer-bank.md @@ -0,0 +1,51 @@ +```{only} html +[Нагоре](000-index) +``` + +# Трансфер между банка и каса + +Движението на фирмени парични средства между банка и каса също трябва да +се отразят в системата. Процесът е следният: + +1. Издавате **БИ** (от **Търговската система \>\> Банкови документи**). С този документ в търговската система намалявате паричните средства в банковата сметка, а в счетоводството правим трансфер от банката към транзитна сметка. + + В документа попълвате + + - **Сметка** - номера на банковото извлечение; + + - **Основание за плащане** – прехвърляне между банка и каса (или някакво друго, което сте създали предварително от **Референти номенклатури \>\> Търговска система \>\> Основания за плащане**; + + - **Контрагент данъчен док** – избирате фирмата си (потребителят на продукта); + + - **Сума валута** – сумата, която ще прехвърляте; + + - **Операция** - избирате *Разход*, ако прехвърляте пари от банковата сметка към касата за аналогично в обратния случай – *Приход*; + + Приключвате документа. Можете да направите счетоводно записване. За да +се генерират автоматично правилно операциите, трябва предварително да +сте настроили автоматичния осчетоводител. + + ![](904-image33.png){ class=align-center w=15cm } + + В случая правим трансфер на 4000 лв от банката към касата. В Сметка +посочвате съответната банкова сметка, от която теглим. Паричните +средства в банковата сметка намаляват, затова сме избрали операция – +Разход. + +1. С **ПКО** в търговската система вкарвате сумата, която изтеглили от банковата сметка в каса. + + ![](905-image34.png){ class=align-center w=15cm } + + Попълвате: + + - **Док. Тип** – ПКО + + - **Каса** – касата, в която искате да прехвърлите парите; + + - **Контрагент** – избирате фирмата си (потребителят на продукта); + + - **Основание за плащане** – прехвърляне между банка и каса (или друго основание, което предварително сте въвели); + + ```{tip} + В документ тип избираме ПКО, защото парите излезли от банковата сметка трябва да постъпят в касата. На Каса сме избрали Каса 1, което означава че наличността на тази каса ще нарасне с 4000 лв. + ``` \ No newline at end of file diff --git a/_sources/manual/002-docs/004-payments/004-transfer-cashdesk.md b/_sources/manual/002-docs/004-payments/004-transfer-cashdesk.md new file mode 100644 index 00000000..c36e5293 --- /dev/null +++ b/_sources/manual/002-docs/004-payments/004-transfer-cashdesk.md @@ -0,0 +1,39 @@ +```{only} html +[Нагоре](000-index) +``` + +# Трансфер между каси + +Всички движенията на парични средства от една каса в друга трябва да +бъдат отразени в системата. За целта се използват касови документи. +Процесът е следният: + +1. От **Търговска система \>\> Касови документи** създавате нов документ. + +1. В него трябва да се попълни: + + - **Док. тип** – РКО; + + - **Каса -** попълвате касата, от която ще прехвърляте парични средства; + + - **Контрагент** – избирате фирмата потребител на продукта; + + - **Основание за плащане** – избирате съответното основание от падащия списък. Предварително трябва да създадете основание за плащане – *трансфер между каси* и да настроите автоматичния осчетоводител да работи с това основание. + + - **Сума валута** - попълвате сумата, която ще прехвърляте; + + ![](906-image35.png){ class=align-center w=15cm } + +1. След като попълните задължителните полета приключваме документа. Появява се следната форма: + + ![](907-image36.png){ class=align-center } + +1. Трябва да изберете опция **Прехвърляне на средства между каси**. В **Каса** трябва да изберете от падащия списък касата, към която ще правите трансфера (в която ще влязат парите). + ```{tip} + В примера прехвърляме 2000 лв от Каса 1 в Каса 2. + ``` +1. Ако имате отделни подсметки в сметкоплана си за отделните каси, можете да генерирате счетоводно записване. За да се получи правилен счетоводен запис, трябва предварително да настроите автоматичния осчетоводител. + +1. Натискате **ОК** и автоматично се генерира още един документ – ПКО за касата, към която сте направили трансфера, който е вече приключен. + + ![](908-image37.png){ class=align-center w=15cm } diff --git a/_sources/manual/002-docs/004-payroll-documents/000-index.md b/_sources/manual/002-docs/004-payroll-documents/000-index.md new file mode 100644 index 00000000..ac0dc60b --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# ТРЗ + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/002-docs/004-payroll-documents/001-settings.md b/_sources/manual/002-docs/004-payroll-documents/001-settings.md new file mode 100644 index 00000000..231de547 --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/001-settings.md @@ -0,0 +1,32 @@ +```{only} html +[Нагоре](000-index) +``` + +# Настройки + +За да започнете работа с ТРЗ модула, трябва да се направят някои +предварителни настройки. Тези настройки се правят в +**Номенклатури \>\> Референтни номенклатури \>\> ТРЗ**. Тук +трябва задължително да се попълни: + + - **Национална класификация на икономическите дейности** – попълва се кода и наименованието на основната дейност, с която се занимава предприятието. Ако има самоосигуряващи се лица, ред „Самооосигуряващ се” се оставя. Попълва се задължително и **процент трудова злополука**, като за самоосигуряващи се трябва да е 0. + + - **Национална класификация на професиите и длъжностите** – попълват се всички длъжности и професии, на които са назначени служителите във фирмата като се попълва и класът и кодът на съответните длъжности. + + - **Категории труд –** категориите труд са предварително въведени и е добре да се оставят по този начин. За улеснение може да се смени категорията по подразбиране – в зависимост от коя категория са по – голямата част от служителите. + + - **Минимална работна заплата –** всяка година трябва да се попълва минималната работна заплата, за да имаме коректно въведени данни. + + - **Процент прослужено време** – посочва се какъв е процента, с който се увеличава заплатата в зависимост от годините трудов стаж на служителя + + - **Минимален осигурителен праг –** всяка година трябва да се въвежда минималния осигурителен праг за всяка една от длъжностите, заемани във фирмата, тъй като участват в някои от формулите при изчисляване на заплатите на служителите. Задължително попълвате и минимален осигурителен праг за самоосигуряващи се, ако има такива служители като за *номер на ред* задължително оставяме да е **9999 за тях**, тъй като това е системен номер. + + - **ДОД –** поставя се отметка в поле **Месечен**, за да начисляваме ДОД всеки месец и процента, който се начислява за съответната година. + + - **Кодове за вид плащане –** предварително са вкарани в системата. Ако е необходимо да се добави нов се попълва кода и наименованието му и се активира. + + - **Вид осигурен –** попълват се според указанията за попълване на Декларация 1 + + - **Осигуровки –** предварително са попълнени и не могат да се създават нови. Могат само да се променят старите, ако някои от кодовете е променен, но не е препоръчително да се променя нещо тук. + + - **Процент на осигуровки** – всяка година трябва да се попълват осигуровките като се посочва какъв процент от заплатата са за сметка на работодателя и какъв за сметка на работника и по кой параграф се начисляват. diff --git a/_sources/manual/002-docs/004-payroll-documents/002-employees.md b/_sources/manual/002-docs/004-payroll-documents/002-employees.md new file mode 100644 index 00000000..8768dcaa --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/002-employees.md @@ -0,0 +1,38 @@ +```{only} html +[Нагоре](000-index) +``` + +# Създаване на номенклатури на служители + +За да се начислят заплати, аванси и осигуровки, първо трябва да се +създадат номенклатури на служителите. Нов служител се създава от +**ТРЗ \>\> Служители \>\> десен бутон на мишката \>\> Нов служител**. +Задължително попълваме: + +В **Основни**: + + - **Име** – трите имена на служителя + + - **Адрес –** адрес по лична карта + +В **Реквизити**: + +Попълвате необходимите данни в групите: **Лична информация, дати, лична +карта, местоположение и телефони**. В **Трудов стаж** се попълва +трудовия стаж към момента, а в група **Възнаграждение** попълвате +задължително основната заплата и аванс, ако служителите получават +такива. В група **Други** задължително трябва да се посочи: +*категория труд, вид осигурен, тип на работно време, брой работни +часове, тип РПВ, ГВРС, дали е самоосигуряващ се, пенсионер, с намалена +работоспособност, чужденец и дали се начислява процент прослужено +време*. + +В **Списъци**: + + - **Удръжки/Надбавки** – трябва да се посочат, ако се начисляват на някои от служителите (например запор или при уволнение), за да се вземе предвид от системата при изчисляване на месечната заплата на служителя. За да изберете удръжка или надбавка трябва предварително да сте ги дефинирали в **Номенклатури \>\> Референтни номенклатури \>\> ТРЗ \>\> Удръжки/ Надбавки**. + + - **Минимален осигурителен доход** – избира се длъжността на съответния служител + + - **Платен отпуск** – попълват се оставащите дни отпуск за годината при създаването на новия служител. + + - **Вноски** – в тази група се избират всички ДОО, ДЗПО и ЗО, които се изплащат за съответното лице. diff --git a/_sources/manual/002-docs/004-payroll-documents/003-adv-payroll-documents.md b/_sources/manual/002-docs/004-payroll-documents/003-adv-payroll-documents.md new file mode 100644 index 00000000..45577fc5 --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/003-adv-payroll-documents.md @@ -0,0 +1,13 @@ +```{only} html +[Нагоре](000-index) +``` + +# Авансови разчетно-платежни ведомости + +Този вид документи се създават, ако във фирмата има практика да изплаща +аванси на служителите. В документа се попълва датата, избира се +**Период** (месеца, за който начисляваме аванси) и избираме +служителите, на които ще изплащаме аванси. Ако в номенклатурата +на служителя сте посочили размера на аванса, сумата ще се попълни +автоматично в документа. За да се начисли ДОД трябва да се постави +отметка в поле **Внася се ДОД** в заглавната част на документа. diff --git a/_sources/manual/002-docs/004-payroll-documents/004-medical-documents.md b/_sources/manual/002-docs/004-payroll-documents/004-medical-documents.md new file mode 100644 index 00000000..0c99d58c --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/004-medical-documents.md @@ -0,0 +1,30 @@ +```{only} html +[Нагоре](000-index) +``` + +# Болнични документи + +След представяне на болничен от служител на фирмата, в системата се +вкарва като се създава нов документ от **ТРЗ \>\> Болнични +документи \>\> десен бутон на мишката \>\> Нов документ**. В +документа се попълва: + + - **Док. тип** – оставяте типа да е *Болничен документ* + + - **Док. No.** – попълвате номера, който е на болничния лист, представен от служителя + + - **Док. дата** – попълвате датата, която е на болничния лист, представен от служителя + + - **Вид болничен документ** – избирате заболяването, посочено на болничния лист. Видовете болнични документи са предварително дефинирани в **Номенклатури \>\> Референтни номенклатури ТРЗ \>\> Видове болнични документи.** + + - **Служител** – избирате служителя, който е ползвал болнични + + - **В отпуск от** – попълвате първия ден на болничния + + - **Дата на явяване** – попълвате първия ден след болничните, когато служителя трябва да дойде на работа + + - **Продължение** – слагате отметка, ако болничния лист е продължение да вече представен първичен болничен лист + +Ако болничният е за майчински, трябва да се попълни и секция +**Майчинство**. Там трябва да се попълни датата на термина и +раждане. diff --git a/_sources/manual/002-docs/004-payroll-documents/005-leave-documents.md b/_sources/manual/002-docs/004-payroll-documents/005-leave-documents.md new file mode 100644 index 00000000..c19854d1 --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/005-leave-documents.md @@ -0,0 +1,24 @@ +```{only} html +[Нагоре](000-index) +``` + +# Документи за отпуск + +Документ за отпуск се създава, когато служител на фирмата ползва платен +или неплатен отпуск. В системата се вкарва като се създава нов документ +от **ТРЗ \>\> Болнични документи \>\> десен бутон на мишката \>\> Нов +документ**. В документа се попълва: + + - **Док. тип** – оставяте типа да е *Документ за отпуск* + + - **Док. No.** – можете ръчно да въведете номер или да го оставите празно и при приключване на документа системата автоматично генерира пореден номер. + + - **Док. дата** – попълвате датата на документа. Може да се различава от началната дата на отпуската, но обикновено се пише същата. + + - **Вид документ за отпуск** – избирате вида отпуск, който ще се ползва. Видовете документи за отпуск са предварително дефинирани в **Номенклатури \>\> Референтни номенклатури ТРЗ \>\> Видове документи за отпуск.** + + - **Служител** – избирате служителя, който е ще ползва отпуск + + - **Нач. дата** – попълвате първия ден на отпуската + + - **Крайна дата** – попълвате последния ден на отпуската diff --git a/_sources/manual/002-docs/004-payroll-documents/006-payroll-documents.md b/_sources/manual/002-docs/004-payroll-documents/006-payroll-documents.md new file mode 100644 index 00000000..0343752c --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/006-payroll-documents.md @@ -0,0 +1,39 @@ +```{only} html +[Нагоре](000-index) +``` + +# Разчетно–платежни ведомости + +Разчетно – платежна ведомост е документ, с който се начисляват заплатите +и осигуровките на служителите. Ако сте попълнили всичко правилно в +настройките на ТРЗ модула, номенклатурите на служителите и сте +вкарали в системата всички болнични, отпуски и аванси, ведомостта се +съставя лесно и бързо и всичко се смята автоматично. + +Нов документ се съставя от **ТРЗ \>\> Разчетно – платежни ведомости \>\> +десен бутон на мишката \>\> Нов документ**. В документа задължително се +попълва: + + - **Док. тип** – оставяте типа да е *РПВ* + + - **Док. No.** – можете да въведете ръчно номер или да го оставите празно и при приключване на документа системата автоматично генерира пореден номер + + - **Док. дата** – попълвате датата, на която се начисляват заплатите + + - **Наименование** – можете да дадете наименование на ведомостта, ако искате да има такова при печат + + - **Период** – избирате месеца, за който ще начислявате заплати + + - **Брой работни дни** – автоматично се попълва, в зависимост от периода, който сте избрали. Ако през съответния месец има официално неработни дни и празници, трябва да се посочат в **Номенклатури \>\> Референтни номенклатури ТРЗ \>\> Празници и почивни дни.** + + - **Авансова РПВ** – ако сте създали документ за аванси през същия месец, трябва да се избере, за да се удържи сумата на авансите от заплатите. + +В редовете на документа от бутона с трите точки в колона **Служител,** +трябва да се изберат всички служители, на които ще се начисляват +заплати. Ако всичко е попълнено правилно, след избора на служител, +останалите полета във ведомостта трябва да се попълнят автоматично. При +приключване на документа се смята и общата рекапитулация, откъдето може +да се види общата сума на осигуровките по параграфи, които трябва да се +платят. + +Могат да се разпечатат както ведомостта, така и Общата рекапитулация. diff --git a/_sources/manual/002-docs/004-payroll-documents/007-print-slips.md b/_sources/manual/002-docs/004-payroll-documents/007-print-slips.md new file mode 100644 index 00000000..853f5a19 --- /dev/null +++ b/_sources/manual/002-docs/004-payroll-documents/007-print-slips.md @@ -0,0 +1,13 @@ +```{only} html +[Нагоре](000-index) +``` + +# Печат на фишове + +След приключване на ведомостите, могат да се разпечатат фишовете на +служителите от **ТРЗ \>\> Печат на фишове**. Във филтъра на +справката имате възможност да посочите в поле **РПВ** коя +ведомост искате да разпечатате. Могат да се посочат и няколко или +да остави полето празно и да направим справка за всички. Аналогично в +поле **Служител** можете да посочите един или много служители или да +го оставите празно и да направите справка за всички. diff --git a/_sources/manual/003-rep/000-index.md b/_sources/manual/003-rep/000-index.md new file mode 100644 index 00000000..36a34ab4 --- /dev/null +++ b/_sources/manual/003-rep/000-index.md @@ -0,0 +1,30 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справки + +Ролята на раздел **Справки** е да представи начина на работа с най–често използваните справки. + + - [Справки в Търговска система](001-trade/000-index.md) + - [Справки в Счетоводство](002-accounting/000-index.md) + - [Други справки](003-other/000-index.md) + +## Коя справка в какъв случай използваме + + - Ако искате да проверите **наличното количество** от даден материал в даден склад и тяхната среднопретеглена цена към днешна дата, използвайте справка **Наличност на склад** в модул **Търговска система**. + + - Ако искате да проверите **доставните цени на продукт** или няколко продукта, използвайте **Доставни цени на продукти/ материали** в модул **Мениджмънт**. Използва се най – често, за да проверим на какви цени сме доставяли материали от различните контрагенти или каква е последната доставна цена на даден материал. + + - **За подробна информация за определен материал** – доставни цени от всички доставчици, закупени и продадени количества и складова наличност към даден момент, използвайте справка **Картон на продукт/материал.** + + - Ако искате да проверите **приходите и разходите, свързани с даден обект** и наличността на съответния му склад за определен период от време, използвайте справка **Себестойност на разходен център**. Чрез тази справка могат да се проверят вложените и оставащите в склада материали, както и свързаните с обекта приходи. + +```{toctree} +:maxdepth: 1 +:hidden: + +001-trade/000-index.md +002-accounting/000-index.md +003-other/000-index.md +``` diff --git a/_sources/manual/003-rep/001-trade/000-index.md b/_sources/manual/003-rep/001-trade/000-index.md new file mode 100644 index 00000000..953a1359 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справки в Търговска система + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/003-rep/001-trade/001-stock-on-hand.md b/_sources/manual/003-rep/001-trade/001-stock-on-hand.md new file mode 100644 index 00000000..39a628a4 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/001-stock-on-hand.md @@ -0,0 +1,24 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка "Наличност на склад" + +Справка **Наличност на склад** се използва за проверка на наличното +количество на стоки и материали в определен склад или за всички +общо и както и на тяхната среднопретеглена цена към днешна дата. + +Тази справка се намира в **Търговска система \>\> Наличност на +складове**. След отварянето на справката от менюто с инструменти +може да се избере определен склад, за който искате да проверите +наличността или да се изберат всички (избирате го от падащия +списък в поле **Склад**). В поле **Продукт** може да се напише името +на определен продукт, който търсите или само част от неговото име, ако +не сте сигурни как е наименуван в програмата, за да филтрирате само по +продукти, започващи по същия начин. + +![](901-image98.png){ class=align-center w=15cm } + +В самата справка от колона **Количество** виждате наличното количество +за съответния продукт в посочения склад, а в колона **Средна цена** – +среднопретеглената цена. diff --git a/_sources/manual/003-rep/001-trade/002-wallets-availability copy.md b/_sources/manual/003-rep/001-trade/002-wallets-availability copy.md new file mode 100644 index 00000000..46dffe90 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/002-wallets-availability copy.md @@ -0,0 +1,13 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка "Наличност на портфейли" + +Справката **Наличност на портфейли** се използва за проверка на +паричната наличност на касите и банковите сметки към текущия +ден. Може да се отвори от **Търговска система \>\> Наличност на +портфейли**. В колона **Портфейл** на справката са имената на +касите и банковите сметки, а в колона **Стойност** – текущата им +наличност. В поле **Портфейл** в бързия филтър можете да изберете +точно определена каса или банкова сметка и да филтрирате по нея. diff --git a/_sources/manual/003-rep/001-trade/003-turnover-sheet-warhouse.md b/_sources/manual/003-rep/001-trade/003-turnover-sheet-warhouse.md new file mode 100644 index 00000000..d17576f0 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/003-turnover-sheet-warhouse.md @@ -0,0 +1,33 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка "Оборотна ведомост на складове" + +Справката **Оборотна ведомост на складове** се използва, за да получите +подробна информация за наличността на някои или всички складове за +определен период от време. Справката е подобна на **Наличност на +склад**, но за разлика от нея тази не показва наличността към +текущата дата, а оборотите за посочения във филтъра интервал от +време и салдата преди и след това. + +Тази справка се намира в **Справки \>\> Оборотна ведомост на складове**. +Във филтъра на справката можете да посочите: + +![](902-image99.png){ class=align-center } + + - **От дата и До дата –** посочвате периода, за който искате да видите данни + + - **Склад –** можете да изберете един или няколко склада, в зависимост от информацията, която искате да получите. Ако го оставите празно, справката ще покаже данни за всички складове. + + - **Мярка –** оставяте го празно, освен ако не искате да видите продукти само с тази мярка + + - **Валута –** оставяте я на *BGN* + + - **Тип на справката –** ако посочите *Всички* ще покажат всички продукти, ако изберете *Само с обороти*, в справката ще присъстват само продукти, които имат обороти през периода, независимо дали имат крайно салдо и ако филтрирате по *Само с крайни салда*, данните в справката ще са само за продукти, които имат салдо към края на посочения период. + + - **Групиране –** задължително трябва да групирате информацията в справка по някоя от предварително дефинираните групи. + + - **Шаблон –** от шаблона, който ще приложите, зависи колко подробна информация ще получите. В *Основен* можете да видите салдата на продуктите в началото и в края на периода и приходите и разходите за периода. В *Детайлна* е добавена и информация за бракуваните и намерени количества за тези продукти. В *Ценова листа* показва само количествата в началото и края на периода, а в крайното салдо цени по основната ценова листа както и търговските отстъпки. В *Само с крайно салдо* се визуализира информация само за салдата в края на периода. В *Стойност по групи* и *Стойност по складове* се представя само общите стойности за всяка една от групите или съответно складовете. + + - **Продукт/материал/услуга –** в тази секция можете да изберете само един или няколко продукта, за които искате да получите информация или само за дадена категория или тип продукти. diff --git a/_sources/manual/003-rep/001-trade/004-movement-of-goods.md b/_sources/manual/003-rep/001-trade/004-movement-of-goods.md new file mode 100644 index 00000000..c0ba3fa3 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/004-movement-of-goods.md @@ -0,0 +1,30 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка "Движение на стоките в складове" + +Справката **Движение на стоките в складове** дава информация за +оборотите на продукти за определен период от време групирана по +складове. От тази справка най – лесно можете да получите информация за +наличностите на даден продукт във всеки един от складовете (ако +филтрираме само по продукта). + +Справката се намира в **Справки \>\> Движение на стоките в складове**. +Във филтъра и можете да изберете: + +![](903-image100.png){ class=align-center } + + - **От дата** и **До дата** – периода, за който желаете да получите информация + + - **Док. тип** – можете да филтрирате информацията само по някои тип от складовите документи – само по ПСД и РСД например или ако искате да видите само началните салда. + + - **Издаден от** - ако искате да филтрирате по документи издадени само от определен служител. За да проверите например каква част от оборота през периода се дължи на този потребител. + + - **Склад** – можете да изберете един или няколко склада, в зависимост от информацията, която искате да получите. Ако го оставите празно, справката ще покаже данни за всички складове. + + - **Визуализация** – ако изберете *Синтетична справката* показва информация за приходите и разходите за продуктите групирана по складове. Ако изберете *Аналитична* показва приходите и разходите по документи и дата. + + - **Продукт/материал/услуга –** в тази секция можете да изберете само един или няколко продукта, за които искате да получите информация или само за дадена категория или тип продукти. + + - **Контрагент** – в тази секция можете да филтрирате по контрагент, категория или тип контрагенти \ No newline at end of file diff --git a/_sources/manual/003-rep/001-trade/005-product-report.md b/_sources/manual/003-rep/001-trade/005-product-report.md new file mode 100644 index 00000000..66836f55 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/005-product-report.md @@ -0,0 +1,53 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка „Картон на продукт/материал” + +Справка **Картон на продукт/материал** се използва за проследяване на +движенията на даден продукт – ако искате да получите подробна +информация за доставените количества, документите, датите и +цените, на които е купуван и аналогично за продадените количества и +продажните цени. + +Тази справка се намира в **Справки \>\> Картон на продукт/материал**. +След отварянето на справката, се появява следния прозорец, в който +можете да филтрирате по: + +![](904-image101.png){ class=align-center } + +В него попълвате: + + - **От дата и До дата** – периода, в който искате да проследите движението на материала. + + - **Продукт** – от бутона с трите точки ![](905-image102.png) отваряте нова форма със списък на продуктите. В поле **Име** пишете името на продукта или част от него. Избирате го и натискате бутон **Избор**. Ако сте сигурни в наименованието на материала, можем и директно в поле **Продукт**. + +![](906-image103.png){ class=align-center w=15cm } + + - **Склад** – от падащия списък избирате склада, за който искате да направите справката. + + - **Визуализация** – ако ви интересува само количеството, избирате **Количествен**. За да получите информация за доставните и продажните цени, избирате **Стойностен**. + +Избираме **ОК** и стартираме справката. + +![](907-image104.png){ class=align-center w=15cm } + +В примера показва, че от този вид тухли сме имали към 1.1.2010 12 000 +броя в централен склад, които сме заприходили с документ за начално +салдо на склад. След това сме закупили 1 000 бройки от Теракол +България ООД и наличността е станала 13 000 бр. на 30.4.2010 сме +трансферирали 800 броя от този склад в друг и на 14.5.2010 след +инвентаризация вместо 12 200 броя, колкото е трябвало да има, +са открити със сто бройки повече. + + - **Тип док**. – ПСД (приходен складов документ) - документ, с който вкарвате материалите в склада при покупка и РСД (разходен складов документ) – документ, с който изкарвате материали от склада при продажба. + + - **Док. дата** – датата на документа, с който е заприходен/ изписан материала. + + - **Контрагент** – името на контрагента, от който е закупен/ продаден материала. + + - **Ед. цена** – доставната/ продажната цена + + - **Приход –** количество – колко броя сте вкарали в склада + + - **Разход –** количество – колко броя сте изкарали от склада \ No newline at end of file diff --git a/_sources/manual/003-rep/001-trade/006-cash-book.md b/_sources/manual/003-rep/001-trade/006-cash-book.md new file mode 100644 index 00000000..cf009f42 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/006-cash-book.md @@ -0,0 +1,16 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка „Касова книга” + +Тази справка показва всички операции свързани с плащания по каса и банка +за определен период от време. Справката се намира в модул **Справки \>\> +Касова книга**. + +Във филтъра трябва да изберете периода, за който се отнася справката. +Можете да посочите и точно определена каса или банкова сметка в поле +**Портфейл**. Ако го оставите празно, ще се визуализират данни за всички +сметки и каси. + +![](908-image105.png){ class=align-center w=15cm } \ No newline at end of file diff --git a/_sources/manual/003-rep/001-trade/007-turnover-sheet-of-wallet.md b/_sources/manual/003-rep/001-trade/007-turnover-sheet-of-wallet.md new file mode 100644 index 00000000..deacd948 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/007-turnover-sheet-of-wallet.md @@ -0,0 +1,18 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка „Оборотна ведомост на портфейли” + +Справката **Оборотна ведомост на портфейли** дава синтезирана информация +за паричния поток на фирмата за определен период от време. Справката се +намира в модул **Справки \>\> Оборотна ведомост на портфейли**. + +Във филтъра трябва да изберете периода, за който се отнася справката. +Можете да посочите и точно определена каса или банкова сметка в поле +**Портфейл**. Ако го оставите празно, ще се визуализират данни за всички +сметки и каси. + +Справката представя обща информация за паричната наличност в началото и +в края на периода, както и за приходите и разходите през периода за +всяка една банкова сметка и каса. diff --git a/_sources/manual/003-rep/001-trade/008-analytical-sheet-of-wallet.md b/_sources/manual/003-rep/001-trade/008-analytical-sheet-of-wallet.md new file mode 100644 index 00000000..c834a8d8 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/008-analytical-sheet-of-wallet.md @@ -0,0 +1,17 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка „Аналитична оборотна ведомост на портфейл” + +Тази справка показва всички операции свързани с плащания по каса и банка +за определен период от време групирани по основание за плащане. +Информацията, която дава е същата като тази от справка **Касова +книга** с разликата, че в тази групирането е не по портфейл, а по +основание за плащане. Също така във филтъра е добавено и поле +**Основание за плащане**, с което имате възможност да филтрирате +записите и по него. Справката се намира в модул **Справки \>\> +Аналитична оборотна ведомост на портфейл**. + +Тази справка е подходящо да се използва, ако искате да видите всички +плащания извършени на точно определено основание. \ No newline at end of file diff --git a/_sources/manual/003-rep/001-trade/009-sales-realization.md b/_sources/manual/003-rep/001-trade/009-sales-realization.md new file mode 100644 index 00000000..4b80c07a --- /dev/null +++ b/_sources/manual/003-rep/001-trade/009-sales-realization.md @@ -0,0 +1,50 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка „Реализация” + +Тази справка сравнява количествата и стойностите на продукти за +определен период от време по документи, свързани с една +продажба – складови документи, документ за продажба и фактура. +Чрез тази справка лесно може да се провери дали всичко от дадена +продажба е фактурирано и изписано от склада, дали има материали, +които са занесени на даден клиент, но не са фактурирани и т.н. + +Справка се намира в **Справки \>\> Реализация**. Можете да филтрирате +справката по стандартни реквизити като особеното е в *Тип на +справката* и *Категория на справката.* Ако изберете типа на +справката да е само за *усвоени* количества, в справката ще +присъстват само продуктите, които нямат остатъчна наличност +т.е. всичко продадено е изписано/фактурирано. Ако изберете – +*неусвоени*, съответно ще се визуализират само продуктите, +които имат остатъчни количества. За да проверите какво още имате да +изписвате/фактурирате от продадените материали за периода, трябва да +изберете – неусвоени. + +От избора на категория на справката зависи количествата по кои документи +ще се сравняват – Документ за продажба с Фактура, Фактура с Документ за +продажба или Документ за продажба със складов документ. В първите два +случая сравнявате продадените с фактурираните количества, а в третия – +продадените с изписаните от склада. + +В секции **Продукт/материал/услуга** и **Контрагент** можете да изберете +точно определен продукт или контрагент или няколко. + +Когато стартирате справката можете да видите: + + - **Прод. кол** – количеството от документа за продажба + + - **Прод. стойност с ДДС** – стойността на продукта в продажбата (по продажни цени) + + - **Усвоено кол. по фактури** – фактурираното количество (от фактурата) + + - **Издължено кол.** – изписано количество от склада + + - **Ст-ст на усвоеното кол. с ДДС** – стойността по фактурата (по продажни цени) + + - **Остатъчно кол.** – количеството, което не е изписано от склада (със складовия документ) или което не е фактурирано (със фактурата) + + - **Ст-ст на остатъка с ДДС** – стойността на остатъчното количество (по продажни цени) + + - **Стойност по складови цени** – стойността на продукта по среднопретеглена цена \ No newline at end of file diff --git a/_sources/manual/003-rep/001-trade/010-sales-payments.md b/_sources/manual/003-rep/001-trade/010-sales-payments.md new file mode 100644 index 00000000..db251fcb --- /dev/null +++ b/_sources/manual/003-rep/001-trade/010-sales-payments.md @@ -0,0 +1,21 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка „Продажби/Плащания” + +Справка **Продажби/Плащания** показва всички проформи фактури и фактури +и свързаните с тях документи за плащания през определен период от +време. Чрез тази справка най – лесно и бързо може да се провери +връзката между документите проформа – фактура – документ за плащане +и да се проверят кои документи са неплатени. + +Справката се намира в модул **Справки \>\> Продажби/Плащания**. + +Във филтъра на справката задължително трябва да изберете: + + - **От дата/ до дата** - периода, за който искате да проверите задълженията + + - **Тип на справката** – трябва да изберете за всички продажби ли искате да направите справката или само върху тези, които са вече платени или все още неплатени + + - **Визуализация** – изберете *По вътрешнофирмени док.,* ако искате справката да е само по документи от търговската система, и *По данъчни док*, ако искате да направите справка по фактурите. \ No newline at end of file diff --git a/_sources/manual/003-rep/001-trade/011-balances-turnovers-of-contragents.md b/_sources/manual/003-rep/001-trade/011-balances-turnovers-of-contragents.md new file mode 100644 index 00000000..b02151f8 --- /dev/null +++ b/_sources/manual/003-rep/001-trade/011-balances-turnovers-of-contragents.md @@ -0,0 +1,27 @@ +```{only} html +[Нагоре](000-index) +``` + +# Справка „Салда и обороти на контрагенти” + +Справка **Салда и обороти на контрагенти** показва оборотите по +документи за покупка, продажба и плащания, реализирани от +контрагентите за определен период от време. Можете да я отворите +от **Справки \>\> Салда и обороти на контрагенти**. + +Във филтъра на справката в секция **Основни** можете да посочите: + + - **Критерии на справката** – посочвате периода, за който искате да получите информация + + - **Визуализация** – избирате *Всички*, ако искате да направите справка за всички клиенти, *Без крайни салда* – за да се визуализират само тези клиенти, към които нямате задължения или взимания към края на периода и *Само с крайни салда* – за да филтрирате само тези, които имат неплатени фактури. + + - **Тип на справката** – избирате *По вътрешнофирмени док.,* ако искате справката да е само по документи от търговската система, и *По данъчни док*, ако искате да направите справка по фактурите. + + - **Групировка** – от избора на групировка зависи колко подробна ще е справката. Ако изберете *По контрагенти* колоните в справката можете да видите **Взиманията и задълженията по контрагенти** в началото и в края на периода, общата стойност на всички документи за покупка и продажба и плащанията, извършени през периода. В *По контрагенти (подробна)* е представена малко по – подробна информация за плащанията през периода – каква сума е по покупки, каква е по продажби и каква част от плащанията не са свързани към други документи. В *По дилър* е добавена колона **Събираемост в %,** а в **Общо по дилър** показва общата сума на всички контрагенти. + +В секция **Контрагент** можете да изберете само един, няколко или някоя +категория контрагенти. + +Ако искате да получите информация точно от кои документи има обороти +определен контрагент, можем да изберете изглед *Списък с данни* на +справката и да кликнем два пъти върху избрания контрагент. \ No newline at end of file diff --git a/_sources/manual/003-rep/002-accounting/000-index.md b/_sources/manual/003-rep/002-accounting/000-index.md new file mode 100644 index 00000000..e7baea1b --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справки в Счетоводство + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/003-rep/002-accounting/001-synthetical-and-analytical-turnover-sheet.md b/_sources/manual/003-rep/002-accounting/001-synthetical-and-analytical-turnover-sheet.md new file mode 100644 index 00000000..1ef1da6a --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/001-synthetical-and-analytical-turnover-sheet.md @@ -0,0 +1,18 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справки „Синтетична оборотна ведомост” и „Аналитична оборотна ведомост” + +Тези две справки показват оборотите по сметките за определен период от +време (началната и крайната дата трябва да са в една и съща година). +Разликата между двете справки е, че в аналитичната са показани и +оборотите на отделните подсметки. Справката има следните колони: + + - **Салдо в началото на годината** – началното салдо на сметката за избраната година + + - **Оборот до началото на периода** – оборота по сметката от първи януари до началната дата на справката + + - **Оборот през периода** – оборота по сметката за избрания период + + - **Салдо в края на периода** – салдото в края на периода (от 1.1 до крайната дата) \ No newline at end of file diff --git a/_sources/manual/003-rep/002-accounting/002-balances-and-turnovers-of-contragents.md b/_sources/manual/003-rep/002-accounting/002-balances-and-turnovers-of-contragents.md new file mode 100644 index 00000000..ac9775e5 --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/002-balances-and-turnovers-of-contragents.md @@ -0,0 +1,20 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Салда и обороти на контрагенти” + +Справката **Салда и обороти на контрагенти** в счетоводната система +показва оборотите на всеки контрагент по сметките за доставчици и +клиенти (401 и 411). Целта и е да получите счетоводна информация за +вземанията и задълженият по контрагенти за определен период. + +Справката се намира в **Счетоводство \>\> Салда и обороти на +контрагенти**. Задължително във филтъра и трябва освен +периода да се посочи и сметка. Избирате 401, ако искате да +направите справка за задълженията ви към доставчиците и 411, ако +искате да проверите колко ви дължи всеки от клиентите ви. Можете в поле +**Признак** да изберете точно определен контрагент, за който искате да +направите справка и да сложите отметка в **Само с крайни салда**, за +да останат в справката само тези контрагенти, които в края на периода +все още имат неплатени фактури. \ No newline at end of file diff --git a/_sources/manual/003-rep/002-accounting/003-general-ledger.md b/_sources/manual/003-rep/002-accounting/003-general-ledger.md new file mode 100644 index 00000000..e1e4d4ec --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/003-general-ledger.md @@ -0,0 +1,21 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Главна книга” + +Главната книга показва оборотите по сметки с кореспондиращите им сметки +за определен период от време. Чрез тази справка лесно можете да +проверите освен оборота на сметката и с кои сметки си е +кореспондирала, какви счетоводни операции сме имали и какви са +били движенията по сметките. + +Тази справка се намира в **Счетоводство** **\>\> Главна книга**. Във +филтъра и можете да изберете точно определена сметка, само за която +искаме да направим справка. Във визуализация също имате избор между +**синтетичния** и **аналитичния** вид на справката. Разликата е, че в +аналитичния се визуализират и подсметките. + +В самата справка във водеща сметка е основната сметка, а в +кореспондираща са сметките, с които сте имали свързани +операции през периода. diff --git a/_sources/manual/003-rep/002-accounting/004-account-ledger.md b/_sources/manual/003-rep/002-accounting/004-account-ledger.md new file mode 100644 index 00000000..d4935be2 --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/004-account-ledger.md @@ -0,0 +1,21 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Дневник на сметка” + +Справка **Дневник на сметка** се използва, за да получим подробна +информация за операциите, свързани с определена сметка, които са +извършвани през определен период от време. Освен кореспондиращите +сметки, тази справка показва и с какви счетоводни документи се е +извършила операцията, със съответните им стойности, отчетни дати, +номера, количества и цени. Целта и е лесно и бързо да получите +пълна информация за документооборота, свързан с избрана от нас +сметка. + +Справката се намира в **Счетоводство \>\> Дневник на сметка**. Във +филтъра задължително трябва да посочите периода, за който е +справката и водещата или кореспондиращата сметка. В секции +**Водеща сметка** и **Кореспондираща сметка** можете да изберете +само определен вид документи, или точно определен документ или +контрагент. diff --git a/_sources/manual/003-rep/002-accounting/005-purchase-ledger.md b/_sources/manual/003-rep/002-accounting/005-purchase-ledger.md new file mode 100644 index 00000000..083538fe --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/005-purchase-ledger.md @@ -0,0 +1,17 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Дневник на покупките” + +Справка **Дневник на покупките** е стандартна счетоводна справка, която +дава информация за всички фактури за покупки, направени за избрания +период – за номера и датата на документа, контрагента, данъчната +основа и данъка. Предварително е настроено в системата при +осчетоводяването на фактура за покупка, автоматично да се +създава съответния запис в **Дневника на покупките**. Тази справка +главно се използва, за да получите бързо синтезирана информация за +направените покупки през месеца, за общата им стойност и дължимия +данък. + +Справката се намира в **Счетоводство \>\> Дневник на покупки**. \ No newline at end of file diff --git a/_sources/manual/003-rep/002-accounting/006-sales-ledger.md b/_sources/manual/003-rep/002-accounting/006-sales-ledger.md new file mode 100644 index 00000000..cd990e76 --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/006-sales-ledger.md @@ -0,0 +1,16 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Дневник на продажбите” + +Тази справка е аналогична и дава същата информация като **Дневник на +покупките**, но за продажбите. Също като нея системата е настроена +при осчетоводяване на фактури за продажба, автоматично да влиза в +дневника. + +Справката се намира в **Счетоводство \>\> Дневник на продажби.** + +\*Двете справки „Дневник на покупките” и „Дневник на продажбите” са +разработени с цел да се изпращат всеки месец в НАП, според +изискванията на агенцията. diff --git a/_sources/manual/003-rep/002-accounting/007-goods-assets-report.md b/_sources/manual/003-rep/002-accounting/007-goods-assets-report.md new file mode 100644 index 00000000..006fd727 --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/007-goods-assets-report.md @@ -0,0 +1,17 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Картон на стока/МЗ” + +Справка **Картон на стока/МЗ** се използва за проследяване на движенията +на даден продукт в счетоводството. Можете да получите подробна +информация за доставените количества, датите и цените, на +които е заприходен и аналогично за продадените количества и цените +на които е изписан. + +Тази справка се намира в **Счетоводство \>\> Картон на стока/МЗ**. Във +филтъра на справката трябва задължително да се посочите сметка. +Избирате 302, ако продуктът е материал и 304, ако продуктът е +стока. В признак задължително трябва да изберете и продукта, за +който искате да направите справката. \ No newline at end of file diff --git a/_sources/manual/003-rep/002-accounting/008-asset-depreciation-plan-printing.md b/_sources/manual/003-rep/002-accounting/008-asset-depreciation-plan-printing.md new file mode 100644 index 00000000..c01582cb --- /dev/null +++ b/_sources/manual/003-rep/002-accounting/008-asset-depreciation-plan-printing.md @@ -0,0 +1,11 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Печат на амортизационен план” (САП и ДАП) + +Генерацията на справки **САП** и **ДАП** става от модул **Счетоводство +\>\> Печат на амортизационен план.** Във филтъра посочвате дали +амортизационния план да бъде *Счетоводен* или *Данъчен*. + +Съдържанието на самата справка е според българските стандарти. \ No newline at end of file diff --git a/_sources/manual/003-rep/003-other/000-index.md b/_sources/manual/003-rep/003-other/000-index.md new file mode 100644 index 00000000..593b6371 --- /dev/null +++ b/_sources/manual/003-rep/003-other/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Други справки + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/003-rep/003-other/001-delivery-prices-by-product.md b/_sources/manual/003-rep/003-other/001-delivery-prices-by-product.md new file mode 100644 index 00000000..a60a84d2 --- /dev/null +++ b/_sources/manual/003-rep/003-other/001-delivery-prices-by-product.md @@ -0,0 +1,71 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Доставни цени по продукти и материали” + +Целта на тази справка е да показва цените, на които сте закупили стоки и +материали по съответния документ за определен период от време. Можете да +филтрирате по продукти и контрагенти. Използва се най – често, за да +проверите на какви цени сте доставяли материали от различните +контрагенти или каква е последната доставна цена на даден +материал. + +Тази справка се намира в **Мениджмънт \>\> Доставни цени по продукти/ +материали**. След отварянето на справката, се появява следния +прозорец, в който можем да филтрираме данните по: + +![](901-image106.png){ class=align-center } + +В него попълвате: + +В секция **Общи**: + + - **От дата и До дата** – периода, за който искате да направите справката. + + - **Визуализация** – избирате *по продукти* или *по контрагенти*, в зависимост от начина, по който искате да ви се представят данните. Ако искате данните да се обединяват по продукти избирате първата опция, и обратното – ако ни интересува различните контрагенти на какви цени са доставяли продукти, избирате *по контрагенти*. + +В секция **Продукт/материал/услуга –** попълват се полетата, ако искате +да проверим за точно определен/и продукт/и, категория или тип. + +![](902-image107.png){ class=align-center } + + - **Продукт** – от бутона с трите точки ![](905-image102.png) отваряте нова форма със списък на продуктите. В поле **Име** пишете името на продукта или част от него. Избирате го и натискате бутон **Избор**. Ако сте сигурни в наименованието на материала, можете и директно в поле **Продукт**. + + - **Категория** – по аналогичен начин на продукта чрез бутон ![](905-image102.png) избирате категория. + + - **Тип** – избира се от падащия списък. + +Не е необходимо и трите полета да са попълнени. Ако искате да видите +информация за точно определен артикул, избирате само него и не +попълвате категория и тип. Аналогично и ако търсите данни само за +определена категория или тип. + +В секция **Контрагент** – полетата в тази секция се попълват, ако искате +да получите информация за точно определен контрагент. + +![](903-image108.png){ class=align-center } + + - **Контрагент** – от бутона с трите точки ![](905-image102.png) отваряте нова форма със списък на контрагентите. В поле **Име** пишете името на контрагента или част от него. Избираме го и натискате бутон **Избор**. Ако сме сигурни в наименованието на контрагента, можем и директно в поле **Контрагент**. + + - **Категория** – по аналогичен начин на контрагента чрез бутон ![](905-image102.png) избирате категория. + + - **Тип** – избира се от падащия списък. + +Избираме **ОК** и стартираме справката. + +![](904-image109.png){ class=align-center w=15cm } + +От справката може да се види: + + - **Продукт/материал –** наименованието на продукта + + - **Контрагент** – от кой контрагент е закупен + + - **Дост. цена** – доставната цена на продукта от съответния контрагент и документ + + - **Ед. цена** - различава се от доставна цена, ако имате допълнителни разходи + + - **Последен документ –** типа, номера и датата на последният документ, с който сте доставили този продукт от този контрагент + + - От **Съдържание**, в лявата вертикална лента, може лесно да се навигира между продуктите и контрагентите. Когато кликнете с мишката върху даден продукт или контрагент, ще се покажат данните за него. \ No newline at end of file diff --git a/_sources/manual/003-rep/003-other/002-cost-center-reports.md b/_sources/manual/003-rep/003-other/002-cost-center-reports.md new file mode 100644 index 00000000..4b93ba47 --- /dev/null +++ b/_sources/manual/003-rep/003-other/002-cost-center-reports.md @@ -0,0 +1,40 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Себестойност на разходен център” + +Справка **Себестойност на разходен център** показва приходите и +разходите, свързани с даден обект и наличността на съответния +му склад за определен период от време. Чрез тази справка могат да се +проверят вложените и оставащите в склада материали, както и свързаните +с обекта приходи. + +За да използвате справката, трябва предварително да сте посочили +**Разходен център** в документите за покупка, продажба и +складовите документи. Разходен център се посочва за всеки +отделен продукт и услуга. + +Тази справка се намира в **Мениджмънт \>\> Себестойност на разходен +център**. След отварянето на справката, се появява следния +прозорец: + +![](905-image110.png){ class=align-center } + +В него попълвате: + + - **От дата** и **До дата** – периода, в който искате да проследите движенията в разходния център. + + - **Разходен център -** от бутона с трите точки ![](905-image102.png) отваряте нова форма със списък на разходните центрове. В поле **Име** пишете съответно името или част от него. Избирате го и натискате бутон **Избор**. Ако сте сигурни в наименованието на разходния, можете директно да го напишете в полето. + + - **Визуализация** – избира се *по документи*, ако искате да получите информация за точните документи за доставка, *по продукти –* ако ви интересува от кой продукт, колко и на каква стойност имате и *по група* – за да получите обща информация за определена група материали. Най – добре е да се посочи по продукти. + +Избираме **ОК** и стартирате справката. + +От справката може да се види: + + - **Материали** и **Услуги –** материалите, които са вложени вече в обекта с техните количества и цени и външни услуги, които са извършвани за този обект. + + - **Приходи** – приходите, реализирани от обекта (обикновено аванси). + + - **Остатъчна наличност в склада** – материалите, които са закупени за този обект, но все още не са вложени и стоят налични в склада. \ No newline at end of file diff --git a/_sources/manual/003-rep/003-other/003-margin-and-profitability-of-sales-and-invoices.md b/_sources/manual/003-rep/003-other/003-margin-and-profitability-of-sales-and-invoices.md new file mode 100644 index 00000000..a35b5341 --- /dev/null +++ b/_sources/manual/003-rep/003-other/003-margin-and-profitability-of-sales-and-invoices.md @@ -0,0 +1,47 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „Марж и рентабилност на приходите от продажби” + +В тази справка се сравняват покупните и продажните цени на продадените +продукти през посочения период. Справката работи с вътрешно – фирмени +документи. Целта и е да се направи анализ печалбата от направените +продажби като се следят определени показатели (Марж сума, Марж % и +КРПП). Най – често тази справка се използва, за да се провери след като +приключване на продажба дали продуктите не са продадени на цена, по – +ниска от покупната или с много малка печалба. + +Тази справка се намира в **Мениджмънт \>\> Марж и рентабилност на +приходите от продажби**. Във филтъра на справката задължително +трябва да се посочи: + + - **От дата и До дата** – периода, за който ще генерирате справка + + - **Тип на справката** – избирате обикновено *Само със загуба*, за да проверите дали не сте продали продукти на цена по – ниска от доставната. + + - **Неиздължени количества** – продадени, но неизписани количества + + - **Визуализация (Групировка)** – избирате признака, по който искате да групирате записите в справката – документи, продукти или контрагенти + +Справката съдържа следните полета: + + - **Документ, Контрагент, Продукт/материал** – зависи каква групировка сте избрали за справката; показва документа за продажба, съответната номенклатура и клиента, на който сте я продали + + - **Прод. кол.** – количеството от този продукт, което сте продали с този документ + + - **Неизд. кол.** – показва дали има останало количество, което не сте изписали със складов документ, свързан с тази продажба + + - **Цена на придобиване** – средна доставна цена на продукта към датата на продажбата + + - **Продажна цена с ДИ/КИ** – цената, на която сте продали продукта в тази продажба (ако има ДИ или КИ към тази продажба се взима последната цена) + + - **Ст–ст по цена на придобиване** – подаденото количество умножено по цената на придобиване + + - **Продажна ст– ст без ДДС** – продаденото количество умножено по продажната цена + + - **Марж сума –** разликата между продажната ст-ст и цената на придобиване + + - **Марж % -** отношението между Марж сума и ст-ст по цена на придобиване + + - **\*КРПП %** - Коефициент на рентабилност на приходите от продажба (Марж на печалбата) - отношението между Марж сума и продажна ст-ст без ДДС \ No newline at end of file diff --git a/_sources/manual/003-rep/003-other/004-vat-per-year.md b/_sources/manual/003-rep/003-other/004-vat-per-year.md new file mode 100644 index 00000000..e721c2e9 --- /dev/null +++ b/_sources/manual/003-rep/003-other/004-vat-per-year.md @@ -0,0 +1,22 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Справка „ДДС за година” + +Справка **ДДС за година** показва начисленото ДДС по фактури за покупки +и продажби като общи суми за всеки месец и ДДС резултатът (колко е +трябвало да се възстанови или внесе, дали е прихващано, плащано и +имали и колко е остатъка). Целта на тази справка е в края на всеки +месец бързо да получавате информация дали трябва да внесете ДДС и +ако да - каква сума. + +Справката се намира в **Мениджмънт \>\> ДДС за година**. Във филтъра и +задължително трябва да посочите годината, за която искате да направите +справка. В секция **Счетоводни сметки** посочвате сметките от +сметкоплана, които са за внасяне и възстановяване на ДДС – +обикновено това са 4539 и 4538 и групата парични средства – 50та. Ако +не изберете правилните сметки, справката няма да показва коректни данни. + +![](906-image111.png){ class=align-center } + diff --git a/_sources/manual/004-user/000-index.md b/_sources/manual/004-user/000-index.md new file mode 100644 index 00000000..e3f3f15b --- /dev/null +++ b/_sources/manual/004-user/000-index.md @@ -0,0 +1,10 @@ +```{only} html +[Нагоре](../000-index) +``` + +# Потребителски настройки на профил + +```{toctree} +:glob: true +* +``` diff --git a/_sources/manual/004-user/002-settings.md b/_sources/manual/004-user/002-settings.md new file mode 100644 index 00000000..51de0d7c --- /dev/null +++ b/_sources/manual/004-user/002-settings.md @@ -0,0 +1,51 @@ +```{only} html +[Нагоре](000-index) +``` + +# Настройки + +Общите настройки в Дрийм може да промените от лентата с инструменти +**Средства \>\> Настройки** или чрез клавишна комбинация Alt + P. + +В секция **Контейнер** можете да поставите отметка, за да активирате: + +![](905-image50.png){ class=align-center } + + - **Активиране на функции в нов прозорец** – ако искате, когато отваряте някоя от функциите на Дрийм, например *Документи за покупка, Продукти, Картон на контрагент* и т.н, да не се отваря в текущия прозорец и да не можете да видите двата заедно, а в нов. Ако не е поставена отметка, например ако сте отворили *Документи за покупка* и после отворите *Складови документи*, няма да можете да ги виждате едновременно. Препоръчително е да поставите отметка в това поле. + + - **Показване на първоначален екран при стартиране** – махнете тази отметка, ако не искате да виждате при стартиране на програмата началния екран. + + - **Запомняне на последен профил и потребител** – изберете тази опция, ако искате при следващото влизане в системата, тя да предлага последно влезлия потребител във форма **Установяване на самоличност**. + + - **Текстов изглед на справки** – ако се постави отметка в това поле във всички справки ще се появи още един тип на справката – Текстов изглед. По подразбиране са два - *Графичен изглед* и *Списък с данни*. + + - **Запомняне на последен начин на плащане** – избирате тази опция, ако искате системата да запомни последния начин на плащане, който сте избрали *по банков път* или *в брой*. По този начин следващия път, когато създадете документ, в полето Начин на плащане, ще се появи автоматично това, което сме избрали предния път. + +В секция **Списъци** можете да поставите отметка, за да активирате: + +![](907-image51.png){ class=align-center } + + - **Изглед –** има три типа на изглед: стандартен, аквамарин и пустинен. Изберете едно от тях и ще се промени изгледа в цялата програма. В прозорчето отстрани можете да видите предварително как ще изглежда програмата. + + - **Скриване на колона при групиране по нея –** сложете отметка тук, ако искате когато групирате някакъв изглед по дадена колона, тя автоматично да се скрива и изгледа не се претрупва излишно. + +В секция **Списъци** можете да поставите отметка, за да активирате: + +![](908-image52.png){ class=align-center } + + - **По Име търси съвпадение навсякъде –** ако няма отметка в поле **Име** в различните форми, когато търсите продукт, склад и т.н и напишете първите няколко букви, системата търси съвпадение само на думи, започващи с тази буква, сричка или дума. Ако има отметка, търси навсякъде в думата. + +Например ако няма отметка и напишем „ви”, ще се покажат винт, винетка и +други, започващи със тази сричка. Ако има отметка обаче ще се появят и +клавиатура, консумативи. + + - **По Име търси в Код** – ако има отметка тук, когато попълвате даден документ за покупка например, в поле **Продукт** можем да въведем името или кода на продукта и системата автоматично ще го подмени с името му т.е. ако ви е по – лесно да работите с кодовете, а не с продуктите, поставяте отметка тук. + + - **Търсене по пълно име на категория –** ако сте сложили отметка тук и в поле категория напишете ръчно само първите няколко букви от името на категорията, няма да се покаже нищо. Препоръчително е да няма отметка тук. + + - **Винаги показва форма за избор –** ако сте поставили отметка тук, в полетата, където имаме да попълваме име на продукт, склад, контрагент и т.н, дори и да напишете правилно ръчно цялото име, пак ще ни се появи формата за избор. + + - **Показва форма за избор ако няма съвпадение –** става активно, ако не сте поставили отметка в предходната опция. Ако напишете ръчно име и има съвпадение на съществуващо такова в базата, не се показва форма за избор. Показва се само, ако нямате съвпадение. + +В секция **Регионални настройки**, в поле **Кратка дата** можете да +промените начина, по който се визуализира датата. diff --git a/_sources/manual/004-user/003-send-mail-texts.md b/_sources/manual/004-user/003-send-mail-texts.md new file mode 100644 index 00000000..eebf8ac1 --- /dev/null +++ b/_sources/manual/004-user/003-send-mail-texts.md @@ -0,0 +1,78 @@ +```{only} html +[Нагоре](000-index) +``` + +# Автоматичен текст при изпращане на e-mail + +Настройки на шаблона се намират във файл **EmailTemplate.txt** в папката +на **Dreem.exe** (C:\\Program Files\\Dreem Enterprise 1.5)**.** + +Шаблонът работи със следните променливи: + + - RECIP\_NAME + + - RECIP\_EMAIL + + - RECIP\_CC\_NAME + + - RECIP\_CC\_EMAIL + + - RECIP\_BCC\_NAME + + - RECIP\_BCC\_EMAIL + + - MAIL\_SUBJECT + + - MAIL\_BODY + + - CGOWNER\_NAME + + - PERSON\_NAME + + - ATTACHMENT\_NAME + + - ATTACHMENT\_SUFFIX (.PDF по подразбиране) + + - ATTACHMENT\_TYPE (1 по подразбиране) + + - TEMP\_FILE + +Съдържание на примерен **EmailTemplate.txt**: + + MAIL_SUBJECT: Прикрепен {ATTACHMENT_NAME} от {CGOWNER_NAME} + + body line 1 + + body line 2 + + ... + +Всяка от променливите може да се употреби в текста във вид +{име-на-променлива} и/или инициализира с нова стойност в +**EmailTemplate.txt** като на отделен ред се сложи + + име-на-променлива: <стойност> + +. . . където самата \<стойност\> може да съдържа променливи. Всички останали +редове на шаблона са основен текст (email body). + +Валидни стойности за ATTACHMENT\_TYPE: + + - 1 - PDF (по подразбиране) + - 2 - XLS + - 3 - MHT + - 4 - HTML + - 5 - RTF + +Желателно е ATTACHMENT\_SUFFIX да се държи в синхрон с ATTACHMENT\_TYPE, +например + + MAIL_SUBJECT: Електронна фактура {ATTACHMENT_NAME}\! + + ATTACHMENT_TYPE: 2 + + ATTACHMENT_SUFFIX: .XLS + + body + + ... diff --git a/_sources/manual/004-user/004-invoice-printing.md b/_sources/manual/004-user/004-invoice-printing.md new file mode 100644 index 00000000..772df16c --- /dev/null +++ b/_sources/manual/004-user/004-invoice-printing.md @@ -0,0 +1,19 @@ +```{only} html +[Нагоре](000-index) +``` + +# Настройки при печат на фактури + +След като приключите дадена фактура и искате да я разпечатате, натискате +бутона за печат. Появява се следния прозорец, който ви предоставя +следните опции: + +![](909-image53.png){ class=align-center } + +В **Изходни справки** можете да се избере **тип** на справката – +графичен или текстови и **настройки принтер** – тук посочвате на +кой принтер ще извършите печата. + +В **Типове документи** избираме типа на **Бланката.** Ако искате да +отпечатате фактура на английски, избирате тип на бланката – SG10 – +Графичен док. валута фактура. diff --git a/_sources/manual/004-user/005-logo.md b/_sources/manual/004-user/005-logo.md new file mode 100644 index 00000000..d8b6b457 --- /dev/null +++ b/_sources/manual/004-user/005-logo.md @@ -0,0 +1,16 @@ +```{only} html +[Нагоре](000-index) +``` + +# Фирмено лого + +Лого за фирмата за фактура се поставя от меню **Администрация \>\> +Настройки** и от група други на **Лого при отпечатване на +документ** зададете стойност логото на фирмата. Чрез бутон +можете да изберете изображението или ръчно да напишете пътя. +Размерът на логото можете да променяте като промените стойността +на поле **Резолюция на лого** (DPI). + +![](910-image54.png){ class=align-center w=15cm } + +При печат на фактура, се появява и логото. diff --git a/_static/__init__.py b/_static/__init__.py new file mode 100644 index 00000000..86fb9a8c --- /dev/null +++ b/_static/__init__.py @@ -0,0 +1,34 @@ +# This file is part of rinohtype, the Python document preparation system. +# +# Copyright (c) Brecht Machiels. +# +# Use of this source code is subject to the terms of the GNU Affero General +# Public License v3. See the LICENSE file or http://www.gnu.org/licenses/. + + +from .cls import Language + +from .en import EN +from .fr import FR +from .it import IT +from .nl import NL +from .de import DE +from .pl import PL +from .cs import CS +from .bg import BG + +__all__ = ['Language', 'EN', 'FR', 'IT', 'NL', 'DE', 'PL', 'CS', 'BG'] + + +# generate docstrings for the Language instances + +for code, language_ref in Language.languages.items(): + language = language_ref() + lines = ['Localized strings for {}'.format(language.name)] + for string_collection in language.strings.values(): + lines.append("\n.. rubric:: {}\n" + .format(type(string_collection).__name__)) + for string in string_collection._strings: + lines.append(":{}: {}".format(string.name, + string_collection[string.name])) + language.__doc__ = '\n'.join(lines) diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..b97662dd --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/bg.py b/_static/bg.py new file mode 100644 index 00000000..b65437f1 --- /dev/null +++ b/_static/bg.py @@ -0,0 +1,35 @@ +# This file is part of rinohtype, the Python document preparation system. +# +# Copyright (c) Brecht Machiels. +# +# Use of this source code is subject to the terms of the GNU Affero General +# Public License v3. See the LICENSE file or http://www.gnu.org/licenses/. + + +from .cls import Language +from ..structure import SectionTitles, AdmonitionTitles + + +BG = Language('bg', 'Български') + +SectionTitles( + contents='Съдържание', + list_of_figures='Списък фигури', + list_of_tables='Списък таблици', + chapter='Глава', + index='Индекс', +) in BG + +AdmonitionTitles( + attention='Внимание!', + caution='Внимание!', + danger='!ОПАСНОСТ!', + error='Грешка', + hint='Подсказка', + important='Важно', + note='Бележка', + tip='Съвет', + warning='Предупреждение', + seealso='Виж също', +) in BG + diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..fbbff28f --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'bg', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: true, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/images/logo_binder.svg b/_static/images/logo_binder.svg new file mode 100644 index 00000000..45fecf75 --- /dev/null +++ b/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/_static/images/logo_colab.png b/_static/images/logo_colab.png new file mode 100644 index 00000000..b7560ec2 Binary files /dev/null and b/_static/images/logo_colab.png differ diff --git a/_static/images/logo_deepnote.svg b/_static/images/logo_deepnote.svg new file mode 100644 index 00000000..fa77ebfc --- /dev/null +++ b/_static/images/logo_deepnote.svg @@ -0,0 +1 @@ + diff --git a/_static/images/logo_jupyterhub.svg b/_static/images/logo_jupyterhub.svg new file mode 100644 index 00000000..60cfe9f2 --- /dev/null +++ b/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/locales/ar/LC_MESSAGES/booktheme.mo b/_static/locales/ar/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..15541a6a Binary files /dev/null and b/_static/locales/ar/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ar/LC_MESSAGES/booktheme.po b/_static/locales/ar/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..2e8d6820 --- /dev/null +++ b/_static/locales/ar/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "أقترح تحرير" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "By the" +msgstr "بواسطة" + +msgid "next page" +msgstr "الصفحة التالية" + +msgid "repository" +msgstr "مخزن" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "Contents" +msgstr "محتويات" + +msgid "By" +msgstr "بواسطة" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Theme by the" +msgstr "موضوع بواسطة" diff --git a/_static/locales/bg/LC_MESSAGES/booktheme.mo b/_static/locales/bg/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..da951200 Binary files /dev/null and b/_static/locales/bg/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/bg/LC_MESSAGES/booktheme.po b/_static/locales/bg/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..56ef0ebd --- /dev/null +++ b/_static/locales/bg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "предложи редактиране" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "open issue" +msgstr "отворен брой" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Следваща страница" + +msgid "repository" +msgstr "хранилище" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "Contents" +msgstr "Съдържание" + +msgid "By" +msgstr "От" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "previous page" +msgstr "предишна страница" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Theme by the" +msgstr "Тема от" diff --git a/_static/locales/bn/LC_MESSAGES/booktheme.mo b/_static/locales/bn/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..6b96639b Binary files /dev/null and b/_static/locales/bn/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/bn/LC_MESSAGES/booktheme.po b/_static/locales/bn/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..243ca31f --- /dev/null +++ b/_static/locales/bn/LC_MESSAGES/booktheme.po @@ -0,0 +1,63 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Last updated on" +msgstr "সর্বশেষ আপডেট" + +msgid "Edit this page" +msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" + +msgid "Launch" +msgstr "শুরু করা" + +msgid "Print to PDF" +msgstr "পিডিএফ প্রিন্ট করুন" + +msgid "open issue" +msgstr "খোলা সমস্যা" + +msgid "Download notebook file" +msgstr "নোটবুক ফাইল ডাউনলোড করুন" + +msgid "Toggle navigation" +msgstr "নেভিগেশন টগল করুন" + +msgid "Source repository" +msgstr "উত্স সংগ্রহস্থল" + +msgid "By the" +msgstr "দ্বারা" + +msgid "next page" +msgstr "পরবর্তী পৃষ্ঠা" + +msgid "Sphinx Book Theme" +msgstr "স্পিনিক্স বুক থিম" + +msgid "Download source file" +msgstr "উত্স ফাইল ডাউনলোড করুন" + +msgid "By" +msgstr "দ্বারা" + +msgid "Copyright" +msgstr "কপিরাইট" + +msgid "Open an issue" +msgstr "একটি সমস্যা খুলুন" + +msgid "previous page" +msgstr "আগের পৃষ্ঠা" + +msgid "Download this page" +msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" + +msgid "Theme by the" +msgstr "থিম দ্বারা" diff --git a/_static/locales/ca/LC_MESSAGES/booktheme.mo b/_static/locales/ca/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..a4dd30e9 Binary files /dev/null and b/_static/locales/ca/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ca/LC_MESSAGES/booktheme.po b/_static/locales/ca/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..b27a13db --- /dev/null +++ b/_static/locales/ca/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "suggerir edició" + +msgid "Last updated on" +msgstr "Darrera actualització el" + +msgid "Edit this page" +msgstr "Editeu aquesta pàgina" + +msgid "Launch" +msgstr "Llançament" + +msgid "Print to PDF" +msgstr "Imprimeix a PDF" + +msgid "open issue" +msgstr "número obert" + +msgid "Download notebook file" +msgstr "Descarregar fitxer de quadern" + +msgid "Toggle navigation" +msgstr "Commuta la navegació" + +msgid "Source repository" +msgstr "Dipòsit de fonts" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "pàgina següent" + +msgid "Sphinx Book Theme" +msgstr "Tema del llibre Esfinx" + +msgid "Download source file" +msgstr "Baixeu el fitxer font" + +msgid "By" +msgstr "Per" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Open an issue" +msgstr "Obriu un número" + +msgid "previous page" +msgstr "Pàgina anterior" + +msgid "Download this page" +msgstr "Descarregueu aquesta pàgina" + +msgid "Theme by the" +msgstr "Tema del" diff --git a/_static/locales/cs/LC_MESSAGES/booktheme.mo b/_static/locales/cs/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..c39e01a6 Binary files /dev/null and b/_static/locales/cs/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/cs/LC_MESSAGES/booktheme.po b/_static/locales/cs/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..3818df97 --- /dev/null +++ b/_static/locales/cs/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "navrhnout úpravy" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "By the" +msgstr "Podle" + +msgid "next page" +msgstr "další strana" + +msgid "repository" +msgstr "úložiště" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "Contents" +msgstr "Obsah" + +msgid "By" +msgstr "Podle" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Theme by the" +msgstr "Téma od" diff --git a/_static/locales/da/LC_MESSAGES/booktheme.mo b/_static/locales/da/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..f43157d7 Binary files /dev/null and b/_static/locales/da/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/da/LC_MESSAGES/booktheme.po b/_static/locales/da/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..7f20a3bd --- /dev/null +++ b/_static/locales/da/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Last updated on" +msgstr "Sidst opdateret den" + +msgid "Edit this page" +msgstr "Rediger denne side" + +msgid "Launch" +msgstr "Start" + +msgid "Print to PDF" +msgstr "Udskriv til PDF" + +msgid "open issue" +msgstr "åbent nummer" + +msgid "Download notebook file" +msgstr "Download notesbog-fil" + +msgid "Toggle navigation" +msgstr "Skift navigation" + +msgid "Source repository" +msgstr "Kildelager" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "Næste side" + +msgid "repository" +msgstr "lager" + +msgid "Sphinx Book Theme" +msgstr "Sphinx bogtema" + +msgid "Download source file" +msgstr "Download kildefil" + +msgid "Contents" +msgstr "Indhold" + +msgid "By" +msgstr "Ved" + +msgid "Copyright" +msgstr "ophavsret" + +msgid "Fullscreen mode" +msgstr "Fuldskærmstilstand" + +msgid "Open an issue" +msgstr "Åbn et problem" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download this page" +msgstr "Download denne side" + +msgid "Theme by the" +msgstr "Tema af" diff --git a/_static/locales/de/LC_MESSAGES/booktheme.mo b/_static/locales/de/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..648b565c Binary files /dev/null and b/_static/locales/de/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/de/LC_MESSAGES/booktheme.po b/_static/locales/de/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..c0027d3a --- /dev/null +++ b/_static/locales/de/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "Launch" +msgstr "Starten" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "By the" +msgstr "Bis zum" + +msgid "next page" +msgstr "Nächste Seite" + +msgid "repository" +msgstr "Repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "Contents" +msgstr "Inhalt" + +msgid "By" +msgstr "Durch" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Theme by the" +msgstr "Thema von der" diff --git a/_static/locales/el/LC_MESSAGES/booktheme.mo b/_static/locales/el/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..fca6e935 Binary files /dev/null and b/_static/locales/el/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/el/LC_MESSAGES/booktheme.po b/_static/locales/el/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..bdeb3270 --- /dev/null +++ b/_static/locales/el/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "προτείνω επεξεργασία" + +msgid "Last updated on" +msgstr "Τελευταία ενημέρωση στις" + +msgid "Edit this page" +msgstr "Επεξεργαστείτε αυτήν τη σελίδα" + +msgid "Launch" +msgstr "Εκτόξευση" + +msgid "Print to PDF" +msgstr "Εκτύπωση σε PDF" + +msgid "open issue" +msgstr "ανοιχτό ζήτημα" + +msgid "Download notebook file" +msgstr "Λήψη αρχείου σημειωματάριου" + +msgid "Toggle navigation" +msgstr "Εναλλαγή πλοήγησης" + +msgid "Source repository" +msgstr "Αποθήκη πηγής" + +msgid "By the" +msgstr "Από το" + +msgid "next page" +msgstr "επόμενη σελίδα" + +msgid "repository" +msgstr "αποθήκη" + +msgid "Sphinx Book Theme" +msgstr "Θέμα βιβλίου Sphinx" + +msgid "Download source file" +msgstr "Λήψη αρχείου προέλευσης" + +msgid "Contents" +msgstr "Περιεχόμενα" + +msgid "By" +msgstr "Με" + +msgid "Copyright" +msgstr "Πνευματική ιδιοκτησία" + +msgid "Fullscreen mode" +msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" + +msgid "Open an issue" +msgstr "Ανοίξτε ένα ζήτημα" + +msgid "previous page" +msgstr "προηγούμενη σελίδα" + +msgid "Download this page" +msgstr "Λήψη αυτής της σελίδας" + +msgid "Theme by the" +msgstr "Θέμα από το" diff --git a/_static/locales/eo/LC_MESSAGES/booktheme.mo b/_static/locales/eo/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..d1072bbe Binary files /dev/null and b/_static/locales/eo/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/eo/LC_MESSAGES/booktheme.po b/_static/locales/eo/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..6749f3a3 --- /dev/null +++ b/_static/locales/eo/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugesti redaktadon" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "open issue" +msgstr "malferma numero" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "sekva paĝo" + +msgid "repository" +msgstr "deponejo" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "Contents" +msgstr "Enhavo" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Theme by the" +msgstr "Temo de la" diff --git a/_static/locales/es/LC_MESSAGES/booktheme.mo b/_static/locales/es/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..ba2ee4dc Binary files /dev/null and b/_static/locales/es/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/es/LC_MESSAGES/booktheme.po b/_static/locales/es/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..71dde37f --- /dev/null +++ b/_static/locales/es/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugerir editar" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "By the" +msgstr "Por el" + +msgid "next page" +msgstr "siguiente página" + +msgid "repository" +msgstr "repositorio" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "Contents" +msgstr "Contenido" + +msgid "By" +msgstr "Por" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Theme by the" +msgstr "Tema por el" diff --git a/_static/locales/et/LC_MESSAGES/booktheme.mo b/_static/locales/et/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..983b8239 Binary files /dev/null and b/_static/locales/et/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/et/LC_MESSAGES/booktheme.po b/_static/locales/et/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..cdcd07c7 --- /dev/null +++ b/_static/locales/et/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "soovita muuta" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "By the" +msgstr "Autor" + +msgid "next page" +msgstr "järgmine leht" + +msgid "repository" +msgstr "hoidla" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "Contents" +msgstr "Sisu" + +msgid "By" +msgstr "Kõrval" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Theme by the" +msgstr "Teema" diff --git a/_static/locales/fi/LC_MESSAGES/booktheme.mo b/_static/locales/fi/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..d8ac0545 Binary files /dev/null and b/_static/locales/fi/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/fi/LC_MESSAGES/booktheme.po b/_static/locales/fi/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..3c3dd089 --- /dev/null +++ b/_static/locales/fi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "ehdottaa muokkausta" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "By the" +msgstr "Mukaan" + +msgid "next page" +msgstr "seuraava sivu" + +msgid "repository" +msgstr "arkisto" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "Contents" +msgstr "Sisällys" + +msgid "By" +msgstr "Tekijä" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Theme by the" +msgstr "Teeman tekijä" diff --git a/_static/locales/fr/LC_MESSAGES/booktheme.mo b/_static/locales/fr/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..f663d39f Binary files /dev/null and b/_static/locales/fr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/fr/LC_MESSAGES/booktheme.po b/_static/locales/fr/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..b57d2fe7 --- /dev/null +++ b/_static/locales/fr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "suggestion de modification" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "Launch" +msgstr "lancement" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "By the" +msgstr "Par le" + +msgid "next page" +msgstr "page suivante" + +msgid "repository" +msgstr "dépôt" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "Contents" +msgstr "Contenu" + +msgid "By" +msgstr "Par" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "previous page" +msgstr "page précédente" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Theme by the" +msgstr "Thème par le" diff --git a/_static/locales/hr/LC_MESSAGES/booktheme.mo b/_static/locales/hr/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..eca4a1a2 Binary files /dev/null and b/_static/locales/hr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/hr/LC_MESSAGES/booktheme.po b/_static/locales/hr/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..4c425e89 --- /dev/null +++ b/_static/locales/hr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "predloži uređivanje" + +msgid "Last updated on" +msgstr "Posljednje ažuriranje:" + +msgid "Edit this page" +msgstr "Uredite ovu stranicu" + +msgid "Launch" +msgstr "Pokrenite" + +msgid "Print to PDF" +msgstr "Ispis u PDF" + +msgid "open issue" +msgstr "otvoreno izdanje" + +msgid "Download notebook file" +msgstr "Preuzmi datoteku bilježnice" + +msgid "Toggle navigation" +msgstr "Uključi / isključi navigaciju" + +msgid "Source repository" +msgstr "Izvorno spremište" + +msgid "By the" +msgstr "Od strane" + +msgid "next page" +msgstr "sljedeća stranica" + +msgid "repository" +msgstr "spremište" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Download source file" +msgstr "Preuzmi izvornu datoteku" + +msgid "Contents" +msgstr "Sadržaj" + +msgid "By" +msgstr "Po" + +msgid "Copyright" +msgstr "Autorska prava" + +msgid "Fullscreen mode" +msgstr "Način preko cijelog zaslona" + +msgid "Open an issue" +msgstr "Otvorite izdanje" + +msgid "previous page" +msgstr "Prethodna stranica" + +msgid "Download this page" +msgstr "Preuzmite ovu stranicu" + +msgid "Theme by the" +msgstr "Tema autora" diff --git a/_static/locales/id/LC_MESSAGES/booktheme.mo b/_static/locales/id/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..d07a06a9 Binary files /dev/null and b/_static/locales/id/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/id/LC_MESSAGES/booktheme.po b/_static/locales/id/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..5db2ae14 --- /dev/null +++ b/_static/locales/id/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "menyarankan edit" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "halaman selanjutnya" + +msgid "repository" +msgstr "gudang" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "Contents" +msgstr "Isi" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Theme by the" +msgstr "Tema oleh" diff --git a/_static/locales/it/LC_MESSAGES/booktheme.mo b/_static/locales/it/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..53ba476e Binary files /dev/null and b/_static/locales/it/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/it/LC_MESSAGES/booktheme.po b/_static/locales/it/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..7d54fdef --- /dev/null +++ b/_static/locales/it/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "suggerisci modifica" + +msgid "Last updated on" +msgstr "Ultimo aggiornamento il" + +msgid "Edit this page" +msgstr "Modifica questa pagina" + +msgid "Launch" +msgstr "Lanciare" + +msgid "Print to PDF" +msgstr "Stampa in PDF" + +msgid "open issue" +msgstr "questione aperta" + +msgid "Download notebook file" +msgstr "Scarica il file del taccuino" + +msgid "Toggle navigation" +msgstr "Attiva / disattiva la navigazione" + +msgid "Source repository" +msgstr "Repository di origine" + +msgid "By the" +msgstr "Dal" + +msgid "next page" +msgstr "pagina successiva" + +msgid "repository" +msgstr "repository" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro della Sfinge" + +msgid "Download source file" +msgstr "Scarica il file sorgente" + +msgid "Contents" +msgstr "Contenuti" + +msgid "By" +msgstr "Di" + +msgid "Copyright" +msgstr "Diritto d'autore" + +msgid "Fullscreen mode" +msgstr "Modalità schermo intero" + +msgid "Open an issue" +msgstr "Apri un problema" + +msgid "previous page" +msgstr "pagina precedente" + +msgid "Download this page" +msgstr "Scarica questa pagina" + +msgid "Theme by the" +msgstr "Tema di" diff --git a/_static/locales/iw/LC_MESSAGES/booktheme.mo b/_static/locales/iw/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..a45c6575 Binary files /dev/null and b/_static/locales/iw/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/iw/LC_MESSAGES/booktheme.po b/_static/locales/iw/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..32b017cf --- /dev/null +++ b/_static/locales/iw/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: iw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "מציע לערוך" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "By the" +msgstr "דרך" + +msgid "next page" +msgstr "עמוד הבא" + +msgid "repository" +msgstr "מאגר" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "Contents" +msgstr "תוכן" + +msgid "By" +msgstr "על ידי" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Theme by the" +msgstr "נושא מאת" diff --git a/_static/locales/ja/LC_MESSAGES/booktheme.mo b/_static/locales/ja/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..1cefd29c Binary files /dev/null and b/_static/locales/ja/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ja/LC_MESSAGES/booktheme.po b/_static/locales/ja/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..16924e19 --- /dev/null +++ b/_static/locales/ja/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "編集を提案する" + +msgid "Last updated on" +msgstr "最終更新日" + +msgid "Edit this page" +msgstr "このページを編集" + +msgid "Launch" +msgstr "起動" + +msgid "Print to PDF" +msgstr "PDFに印刷" + +msgid "open issue" +msgstr "未解決の問題" + +msgid "Download notebook file" +msgstr "ノートブックファイルをダウンロード" + +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替え" + +msgid "Source repository" +msgstr "ソースリポジトリ" + +msgid "By the" +msgstr "によって" + +msgid "next page" +msgstr "次のページ" + +msgid "repository" +msgstr "リポジトリ" + +msgid "Sphinx Book Theme" +msgstr "スフィンクスの本のテーマ" + +msgid "Download source file" +msgstr "ソースファイルをダウンロード" + +msgid "Contents" +msgstr "目次" + +msgid "By" +msgstr "著者" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Fullscreen mode" +msgstr "全画面モード" + +msgid "Open an issue" +msgstr "問題を報告" + +msgid "previous page" +msgstr "前のページ" + +msgid "Download this page" +msgstr "このページをダウンロード" + +msgid "Theme by the" +msgstr "のテーマ" diff --git a/_static/locales/ko/LC_MESSAGES/booktheme.mo b/_static/locales/ko/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..06c7ec93 Binary files /dev/null and b/_static/locales/ko/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ko/LC_MESSAGES/booktheme.po b/_static/locales/ko/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..69dd18f7 --- /dev/null +++ b/_static/locales/ko/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "편집 제안" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "Launch" +msgstr "시작하다" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "open issue" +msgstr "열린 문제" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "By the" +msgstr "에 의해" + +msgid "next page" +msgstr "다음 페이지" + +msgid "repository" +msgstr "저장소" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "Contents" +msgstr "내용" + +msgid "By" +msgstr "으로" + +msgid "Copyright" +msgstr "저작권" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Theme by the" +msgstr "테마별" diff --git a/_static/locales/lt/LC_MESSAGES/booktheme.mo b/_static/locales/lt/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..4468ba04 Binary files /dev/null and b/_static/locales/lt/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/lt/LC_MESSAGES/booktheme.po b/_static/locales/lt/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..9f037752 --- /dev/null +++ b/_static/locales/lt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "By the" +msgstr "Prie" + +msgid "next page" +msgstr "Kitas puslapis" + +msgid "repository" +msgstr "saugykla" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "Contents" +msgstr "Turinys" + +msgid "By" +msgstr "Iki" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Theme by the" +msgstr "Tema" diff --git a/_static/locales/lv/LC_MESSAGES/booktheme.mo b/_static/locales/lv/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..74aa4d89 Binary files /dev/null and b/_static/locales/lv/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/lv/LC_MESSAGES/booktheme.po b/_static/locales/lv/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..c9633b54 --- /dev/null +++ b/_static/locales/lv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "ieteikt rediģēt" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "By the" +msgstr "Ar" + +msgid "next page" +msgstr "nākamā lapaspuse" + +msgid "repository" +msgstr "krātuve" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "Contents" +msgstr "Saturs" + +msgid "By" +msgstr "Autors" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Theme by the" +msgstr "Autora tēma" diff --git a/_static/locales/ml/LC_MESSAGES/booktheme.mo b/_static/locales/ml/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..2736e8fc Binary files /dev/null and b/_static/locales/ml/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ml/LC_MESSAGES/booktheme.po b/_static/locales/ml/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..9a6a41e8 --- /dev/null +++ b/_static/locales/ml/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "By the" +msgstr "എഴുതിയത്" + +msgid "next page" +msgstr "അടുത്ത പേജ്" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Theme by the" +msgstr "പ്രമേയം" diff --git a/_static/locales/mr/LC_MESSAGES/booktheme.mo b/_static/locales/mr/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..fe530100 Binary files /dev/null and b/_static/locales/mr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/mr/LC_MESSAGES/booktheme.po b/_static/locales/mr/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..ef72d8c6 --- /dev/null +++ b/_static/locales/mr/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "संपादन सुचवा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "By the" +msgstr "द्वारा" + +msgid "next page" +msgstr "पुढील पृष्ठ" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "By" +msgstr "द्वारा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Theme by the" +msgstr "द्वारा थीम" diff --git a/_static/locales/ms/LC_MESSAGES/booktheme.mo b/_static/locales/ms/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..f02603fa Binary files /dev/null and b/_static/locales/ms/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ms/LC_MESSAGES/booktheme.po b/_static/locales/ms/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..e29cbe2e --- /dev/null +++ b/_static/locales/ms/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "cadangkan edit" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "muka surat seterusnya" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Theme by the" +msgstr "Tema oleh" diff --git a/_static/locales/nl/LC_MESSAGES/booktheme.mo b/_static/locales/nl/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..e59e7ecb Binary files /dev/null and b/_static/locales/nl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/nl/LC_MESSAGES/booktheme.po b/_static/locales/nl/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..e4844d7c --- /dev/null +++ b/_static/locales/nl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "suggereren bewerken" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "Launch" +msgstr "Lancering" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "open issue" +msgstr "open probleem" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "By the" +msgstr "Door de" + +msgid "next page" +msgstr "volgende bladzijde" + +msgid "repository" +msgstr "repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "Contents" +msgstr "Inhoud" + +msgid "By" +msgstr "Door" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Theme by the" +msgstr "Thema door de" diff --git a/_static/locales/no/LC_MESSAGES/booktheme.mo b/_static/locales/no/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..6cd15c88 Binary files /dev/null and b/_static/locales/no/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/no/LC_MESSAGES/booktheme.po b/_static/locales/no/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..d079dd9b --- /dev/null +++ b/_static/locales/no/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Last updated on" +msgstr "Sist oppdatert den" + +msgid "Edit this page" +msgstr "Rediger denne siden" + +msgid "Launch" +msgstr "Start" + +msgid "Print to PDF" +msgstr "Skriv ut til PDF" + +msgid "open issue" +msgstr "åpent nummer" + +msgid "Download notebook file" +msgstr "Last ned notatbokfilen" + +msgid "Toggle navigation" +msgstr "Bytt navigasjon" + +msgid "Source repository" +msgstr "Kildedepot" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "neste side" + +msgid "repository" +msgstr "oppbevaringssted" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "Download source file" +msgstr "Last ned kildefilen" + +msgid "Contents" +msgstr "Innhold" + +msgid "By" +msgstr "Av" + +msgid "Copyright" +msgstr "opphavsrett" + +msgid "Fullscreen mode" +msgstr "Fullskjerm-modus" + +msgid "Open an issue" +msgstr "Åpne et problem" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download this page" +msgstr "Last ned denne siden" + +msgid "Theme by the" +msgstr "Tema av" diff --git a/_static/locales/pl/LC_MESSAGES/booktheme.mo b/_static/locales/pl/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..9ebb584f Binary files /dev/null and b/_static/locales/pl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/pl/LC_MESSAGES/booktheme.po b/_static/locales/pl/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..fcac51d3 --- /dev/null +++ b/_static/locales/pl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "zaproponuj edycję" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "By the" +msgstr "Przez" + +msgid "next page" +msgstr "Następna strona" + +msgid "repository" +msgstr "magazyn" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "Contents" +msgstr "Zawartość" + +msgid "By" +msgstr "Przez" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Theme by the" +msgstr "Motyw autorstwa" diff --git a/_static/locales/pt/LC_MESSAGES/booktheme.mo b/_static/locales/pt/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..d0ddb872 Binary files /dev/null and b/_static/locales/pt/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/pt/LC_MESSAGES/booktheme.po b/_static/locales/pt/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..1761db08 --- /dev/null +++ b/_static/locales/pt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugerir edição" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "open issue" +msgstr "questão aberta" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "By the" +msgstr "Pelo" + +msgid "next page" +msgstr "próxima página" + +msgid "repository" +msgstr "repositório" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "previous page" +msgstr "página anterior" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Theme by the" +msgstr "Tema por" diff --git a/_static/locales/ro/LC_MESSAGES/booktheme.mo b/_static/locales/ro/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..3c36ab1d Binary files /dev/null and b/_static/locales/ro/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ro/LC_MESSAGES/booktheme.po b/_static/locales/ro/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..db865c8f --- /dev/null +++ b/_static/locales/ro/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugerează editare" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "Launch" +msgstr "Lansa" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "By the" +msgstr "Langa" + +msgid "next page" +msgstr "pagina următoare" + +msgid "repository" +msgstr "repertoriu" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "Contents" +msgstr "Cuprins" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Theme by the" +msgstr "Tema de" diff --git a/_static/locales/ru/LC_MESSAGES/booktheme.mo b/_static/locales/ru/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..6b8ca41f Binary files /dev/null and b/_static/locales/ru/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ru/LC_MESSAGES/booktheme.po b/_static/locales/ru/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..84ab6eb5 --- /dev/null +++ b/_static/locales/ru/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "предложить редактировать" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "Launch" +msgstr "Запуск" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "By the" +msgstr "Посредством" + +msgid "next page" +msgstr "Следующая страница" + +msgid "repository" +msgstr "хранилище" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "Contents" +msgstr "Содержание" + +msgid "By" +msgstr "По" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Theme by the" +msgstr "Тема от" diff --git a/_static/locales/sk/LC_MESSAGES/booktheme.mo b/_static/locales/sk/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..59bd0ddf Binary files /dev/null and b/_static/locales/sk/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sk/LC_MESSAGES/booktheme.po b/_static/locales/sk/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..e44878b5 --- /dev/null +++ b/_static/locales/sk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "navrhnúť úpravu" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "By the" +msgstr "Podľa" + +msgid "next page" +msgstr "ďalšia strana" + +msgid "repository" +msgstr "Úložisko" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "Contents" +msgstr "Obsah" + +msgid "By" +msgstr "Autor:" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Theme by the" +msgstr "Téma od" diff --git a/_static/locales/sl/LC_MESSAGES/booktheme.mo b/_static/locales/sl/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..87bf26de Binary files /dev/null and b/_static/locales/sl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sl/LC_MESSAGES/booktheme.po b/_static/locales/sl/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..228939bc --- /dev/null +++ b/_static/locales/sl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "predlagajte urejanje" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "By the" +msgstr "Avtor" + +msgid "next page" +msgstr "Naslednja stran" + +msgid "repository" +msgstr "odlagališče" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "Contents" +msgstr "Vsebina" + +msgid "By" +msgstr "Avtor" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Theme by the" +msgstr "Tema avtorja" diff --git a/_static/locales/sr/LC_MESSAGES/booktheme.mo b/_static/locales/sr/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..ec740f48 Binary files /dev/null and b/_static/locales/sr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sr/LC_MESSAGES/booktheme.po b/_static/locales/sr/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..1a712a18 --- /dev/null +++ b/_static/locales/sr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "предложи уређивање" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "open issue" +msgstr "отворено издање" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "By the" +msgstr "Од" + +msgid "next page" +msgstr "Следећа страна" + +msgid "repository" +msgstr "спремиште" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "Contents" +msgstr "Садржај" + +msgid "By" +msgstr "Од стране" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Theme by the" +msgstr "Тхеме би" diff --git a/_static/locales/sv/LC_MESSAGES/booktheme.mo b/_static/locales/sv/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..be951bec Binary files /dev/null and b/_static/locales/sv/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sv/LC_MESSAGES/booktheme.po b/_static/locales/sv/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..7d2b56d9 --- /dev/null +++ b/_static/locales/sv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "föreslå redigering" + +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Edit this page" +msgstr "Redigera den här sidan" + +msgid "Launch" +msgstr "Lansera" + +msgid "Print to PDF" +msgstr "Skriv ut till PDF" + +msgid "open issue" +msgstr "öppet problem" + +msgid "Download notebook file" +msgstr "Ladda ner anteckningsbokfilen" + +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "Source repository" +msgstr "Källförvar" + +msgid "By the" +msgstr "Vid" + +msgid "next page" +msgstr "nästa sida" + +msgid "repository" +msgstr "förvar" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "Contents" +msgstr "Innehåll" + +msgid "By" +msgstr "Förbi" + +msgid "Copyright" +msgstr "upphovsrätt" + +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" + +msgid "Open an issue" +msgstr "Öppna ett problem" + +msgid "previous page" +msgstr "föregående sida" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" + +msgid "Theme by the" +msgstr "Tema av" diff --git a/_static/locales/ta/LC_MESSAGES/booktheme.mo b/_static/locales/ta/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..29f52e1f Binary files /dev/null and b/_static/locales/ta/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ta/LC_MESSAGES/booktheme.po b/_static/locales/ta/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..c75ffe19 --- /dev/null +++ b/_static/locales/ta/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "By the" +msgstr "மூலம்" + +msgid "next page" +msgstr "அடுத்த பக்கம்" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Theme by the" +msgstr "வழங்கிய தீம்" diff --git a/_static/locales/te/LC_MESSAGES/booktheme.mo b/_static/locales/te/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..0a5f4b46 Binary files /dev/null and b/_static/locales/te/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/te/LC_MESSAGES/booktheme.po b/_static/locales/te/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..2595c035 --- /dev/null +++ b/_static/locales/te/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "By the" +msgstr "ద్వారా" + +msgid "next page" +msgstr "తరువాతి పేజీ" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "By" +msgstr "ద్వారా" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Theme by the" +msgstr "ద్వారా థీమ్" diff --git a/_static/locales/tg/LC_MESSAGES/booktheme.mo b/_static/locales/tg/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..b21c6c63 Binary files /dev/null and b/_static/locales/tg/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tg/LC_MESSAGES/booktheme.po b/_static/locales/tg/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..73cd30ea --- /dev/null +++ b/_static/locales/tg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "пешниҳод вироиш" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "By the" +msgstr "Бо" + +msgid "next page" +msgstr "саҳифаи оянда" + +msgid "repository" +msgstr "анбор" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "By" +msgstr "Бо" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Theme by the" +msgstr "Мавзӯъи аз" diff --git a/_static/locales/th/LC_MESSAGES/booktheme.mo b/_static/locales/th/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..abede98a Binary files /dev/null and b/_static/locales/th/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/th/LC_MESSAGES/booktheme.po b/_static/locales/th/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..0392b4ad --- /dev/null +++ b/_static/locales/th/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "แนะนำแก้ไข" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "Launch" +msgstr "เปิด" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "By the" +msgstr "โดย" + +msgid "next page" +msgstr "หน้าต่อไป" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "By" +msgstr "โดย" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Theme by the" +msgstr "ธีมโดย" diff --git a/_static/locales/tl/LC_MESSAGES/booktheme.mo b/_static/locales/tl/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..8df1b733 Binary files /dev/null and b/_static/locales/tl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tl/LC_MESSAGES/booktheme.po b/_static/locales/tl/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..c8375b54 --- /dev/null +++ b/_static/locales/tl/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "iminumungkahi i-edit" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "By the" +msgstr "Sa pamamagitan ng" + +msgid "next page" +msgstr "Susunod na pahina" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "By" +msgstr "Ni" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Theme by the" +msgstr "Tema ng" diff --git a/_static/locales/tr/LC_MESSAGES/booktheme.mo b/_static/locales/tr/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..029ae18a Binary files /dev/null and b/_static/locales/tr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tr/LC_MESSAGES/booktheme.po b/_static/locales/tr/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..47d7bdf7 --- /dev/null +++ b/_static/locales/tr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "düzenleme öner" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "open issue" +msgstr "Açık konu" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "By the" +msgstr "Tarafından" + +msgid "next page" +msgstr "sonraki Sayfa" + +msgid "repository" +msgstr "depo" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "By" +msgstr "Tarafından" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Theme by the" +msgstr "Tarafından tema" diff --git a/_static/locales/uk/LC_MESSAGES/booktheme.mo b/_static/locales/uk/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..16ab7890 Binary files /dev/null and b/_static/locales/uk/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/uk/LC_MESSAGES/booktheme.po b/_static/locales/uk/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..e85f6f16 --- /dev/null +++ b/_static/locales/uk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "запропонувати редагувати" + +msgid "Last updated on" +msgstr "Останнє оновлення:" + +msgid "Edit this page" +msgstr "Редагувати цю сторінку" + +msgid "Launch" +msgstr "Запуск" + +msgid "Print to PDF" +msgstr "Друк у форматі PDF" + +msgid "open issue" +msgstr "відкритий випуск" + +msgid "Download notebook file" +msgstr "Завантажте файл блокнота" + +msgid "Toggle navigation" +msgstr "Переключити навігацію" + +msgid "Source repository" +msgstr "Джерело сховища" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Наступна сторінка" + +msgid "repository" +msgstr "сховище" + +msgid "Sphinx Book Theme" +msgstr "Тема книги \"Сфінкс\"" + +msgid "Download source file" +msgstr "Завантажити вихідний файл" + +msgid "Contents" +msgstr "Зміст" + +msgid "By" +msgstr "Автор" + +msgid "Copyright" +msgstr "Авторське право" + +msgid "Fullscreen mode" +msgstr "Повноекранний режим" + +msgid "Open an issue" +msgstr "Відкрийте випуск" + +msgid "previous page" +msgstr "Попередня сторінка" + +msgid "Download this page" +msgstr "Завантажте цю сторінку" + +msgid "Theme by the" +msgstr "Тема від" diff --git a/_static/locales/ur/LC_MESSAGES/booktheme.mo b/_static/locales/ur/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..de8c84b9 Binary files /dev/null and b/_static/locales/ur/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ur/LC_MESSAGES/booktheme.po b/_static/locales/ur/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..0f90726c --- /dev/null +++ b/_static/locales/ur/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "By the" +msgstr "کی طرف" + +msgid "next page" +msgstr "اگلا صفحہ" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "By" +msgstr "بذریعہ" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" diff --git a/_static/locales/vi/LC_MESSAGES/booktheme.mo b/_static/locales/vi/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..2bb32555 Binary files /dev/null and b/_static/locales/vi/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/vi/LC_MESSAGES/booktheme.po b/_static/locales/vi/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..2cb5cf3b --- /dev/null +++ b/_static/locales/vi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "đề nghị chỉnh sửa" + +msgid "Last updated on" +msgstr "Cập nhật lần cuối vào" + +msgid "Edit this page" +msgstr "chỉnh sửa trang này" + +msgid "Launch" +msgstr "Phóng" + +msgid "Print to PDF" +msgstr "In sang PDF" + +msgid "open issue" +msgstr "vấn đề mở" + +msgid "Download notebook file" +msgstr "Tải xuống tệp sổ tay" + +msgid "Toggle navigation" +msgstr "Chuyển đổi điều hướng thành" + +msgid "Source repository" +msgstr "Kho nguồn" + +msgid "By the" +msgstr "Bằng" + +msgid "next page" +msgstr "Trang tiếp theo" + +msgid "repository" +msgstr "kho" + +msgid "Sphinx Book Theme" +msgstr "Chủ đề sách nhân sư" + +msgid "Download source file" +msgstr "Tải xuống tệp nguồn" + +msgid "Contents" +msgstr "Nội dung" + +msgid "By" +msgstr "Bởi" + +msgid "Copyright" +msgstr "Bản quyền" + +msgid "Fullscreen mode" +msgstr "Chế độ toàn màn hình" + +msgid "Open an issue" +msgstr "Mở một vấn đề" + +msgid "previous page" +msgstr "trang trước" + +msgid "Download this page" +msgstr "Tải xuống trang này" + +msgid "Theme by the" +msgstr "Chủ đề của" diff --git a/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo b/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..0e3235d0 Binary files /dev/null and b/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/zh_CN/LC_MESSAGES/booktheme.po b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..f91f3ba0 --- /dev/null +++ b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "提出修改建议" + +msgid "Last updated on" +msgstr "上次更新时间:" + +msgid "Edit this page" +msgstr "编辑此页面" + +msgid "Launch" +msgstr "启动" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "open issue" +msgstr "创建议题" + +msgid "Download notebook file" +msgstr "下载笔记本文件" + +msgid "Toggle navigation" +msgstr "显示或隐藏导航栏" + +msgid "Source repository" +msgstr "源码库" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一页" + +msgid "repository" +msgstr "仓库" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 主题" + +msgid "Download source file" +msgstr "下载源文件" + +msgid "Contents" +msgstr "目录" + +msgid "By" +msgstr "作者:" + +msgid "Copyright" +msgstr "版权" + +msgid "Fullscreen mode" +msgstr "全屏模式" + +msgid "Open an issue" +msgstr "创建议题" + +msgid "previous page" +msgstr "上一页" + +msgid "Download this page" +msgstr "下载此页面" + +msgid "Theme by the" +msgstr "主题作者:" diff --git a/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo b/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo new file mode 100644 index 00000000..9116fa95 Binary files /dev/null and b/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po new file mode 100644 index 00000000..7833d904 --- /dev/null +++ b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "提出修改建議" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "Launch" +msgstr "啟動" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "open issue" +msgstr "公開的問題" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一頁" + +msgid "repository" +msgstr "儲存庫" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "Contents" +msgstr "目錄" + +msgid "By" +msgstr "作者:" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "previous page" +msgstr "上一頁" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Theme by the" +msgstr "佈景主題作者:" diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..997797f2 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #7971292e } +html[data-theme="light"] .highlight { background: #fefefe; color: #545454 } +html[data-theme="light"] .highlight .c { color: #797129 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #d91e18 } /* Error */ +html[data-theme="light"] .highlight .k { color: #7928a1 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #797129 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #545454 } /* Name */ +html[data-theme="light"] .highlight .o { color: #008000 } /* Operator */ +html[data-theme="light"] .highlight .p { color: #545454 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #797129 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #797129 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #797129 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #797129 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #797129 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #797129 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #007faa } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #007faa } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #007faa } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #7928a1 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #7928a1 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #7928a1 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #7928a1 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #7928a1 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #797129 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #797129 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #797129 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #008000 } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #797129 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #797129 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #007faa } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #007faa } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #797129 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #008000 } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #7928a1 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #007faa } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #797129 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #545454 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #545454 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #007faa } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #007faa } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #d91e18 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #7928a1 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #545454 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #545454 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #797129 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #797129 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #797129 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #797129 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #797129 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #008000 } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #008000 } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #008000 } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #008000 } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #008000 } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #008000 } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #008000 } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #008000 } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #008000 } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #008000 } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #d91e18 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #008000 } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #007faa } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #797129 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #007faa } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #d91e18 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #d91e18 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #d91e18 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #797129 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #797129 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } +html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ +html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/sbt-webpack-macros.html b/_static/sbt-webpack-macros.html new file mode 100644 index 00000000..6cbf559f --- /dev/null +++ b/_static/sbt-webpack-macros.html @@ -0,0 +1,11 @@ + +{% macro head_pre_bootstrap() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} diff --git a/_static/scripts/bootstrap.js b/_static/scripts/bootstrap.js new file mode 100644 index 00000000..bda8a602 --- /dev/null +++ b/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>w,afterRead:()=>b,afterWrite:()=>T,applyStyles:()=>D,arrow:()=>G,auto:()=>r,basePlacements:()=>a,beforeMain:()=>v,beforeRead:()=>g,beforeWrite:()=>E,bottom:()=>n,clippingParents:()=>h,computeStyles:()=>et,createPopper:()=>St,createPopperBase:()=>Lt,createPopperLite:()=>Dt,detectOverflow:()=>gt,end:()=>c,eventListeners:()=>nt,flip:()=>_t,hide:()=>yt,left:()=>o,main:()=>y,modifierPhases:()=>C,offset:()=>wt,placements:()=>m,popper:()=>u,popperGenerator:()=>kt,popperOffsets:()=>Et,preventOverflow:()=>At,read:()=>_,reference:()=>f,right:()=>s,start:()=>l,top:()=>i,variationPlacements:()=>p,viewport:()=>d,write:()=>A});var i="top",n="bottom",s="right",o="left",r="auto",a=[i,n,s,o],l="start",c="end",h="clippingParents",d="viewport",u="popper",f="reference",p=a.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+c])}),[]),m=[].concat(a,[r]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+c])}),[]),g="beforeRead",_="read",b="afterRead",v="beforeMain",y="main",w="afterMain",E="beforeWrite",A="write",T="afterWrite",C=[g,_,b,v,y,w,E,A,T];function O(t){return t?(t.nodeName||"").toLowerCase():null}function x(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function k(t){return t instanceof x(t).Element||t instanceof Element}function L(t){return t instanceof x(t).HTMLElement||t instanceof HTMLElement}function S(t){return"undefined"!=typeof ShadowRoot&&(t instanceof x(t).ShadowRoot||t instanceof ShadowRoot)}const D={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];L(s)&&O(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});L(n)&&O(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function $(t){return t.split("-")[0]}var I=Math.max,N=Math.min,P=Math.round;function M(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function j(){return!/^((?!chrome|android).)*safari/i.test(M())}function F(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&L(t)&&(s=t.offsetWidth>0&&P(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&P(n.height)/t.offsetHeight||1);var r=(k(t)?x(t):window).visualViewport,a=!j()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function H(t){var e=F(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function B(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&S(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function W(t){return x(t).getComputedStyle(t)}function z(t){return["table","td","th"].indexOf(O(t))>=0}function R(t){return((k(t)?t.ownerDocument:t.document)||window.document).documentElement}function q(t){return"html"===O(t)?t:t.assignedSlot||t.parentNode||(S(t)?t.host:null)||R(t)}function V(t){return L(t)&&"fixed"!==W(t).position?t.offsetParent:null}function Y(t){for(var e=x(t),i=V(t);i&&z(i)&&"static"===W(i).position;)i=V(i);return i&&("html"===O(i)||"body"===O(i)&&"static"===W(i).position)?e:i||function(t){var e=/firefox/i.test(M());if(/Trident/i.test(M())&&L(t)&&"fixed"===W(t).position)return null;var i=q(t);for(S(i)&&(i=i.host);L(i)&&["html","body"].indexOf(O(i))<0;){var n=W(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function K(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Q(t,e,i){return I(t,N(e,i))}function X(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function U(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const G={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,r=t.state,l=t.name,c=t.options,h=r.elements.arrow,d=r.modifiersData.popperOffsets,u=$(r.placement),f=K(u),p=[o,s].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return X("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:U(t,a))}(c.padding,r),g=H(h),_="y"===f?i:o,b="y"===f?n:s,v=r.rects.reference[p]+r.rects.reference[f]-d[f]-r.rects.popper[p],y=d[f]-r.rects.reference[f],w=Y(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=Q(T,O,C),k=f;r.modifiersData[l]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&B(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function J(t){return t.split("-")[1]}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function tt(t){var e,r=t.popper,a=t.popperRect,l=t.placement,h=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=o,C=i,O=window;if(p){var k=Y(r),L="clientHeight",S="clientWidth";k===x(r)&&"static"!==W(k=R(r)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===i||(l===o||l===s)&&h===c)&&(C=n,y-=(g&&k===O&&O.visualViewport?O.visualViewport.height:k[L])-a.height,y*=f?1:-1),l!==o&&(l!==i&&l!==n||h!==c)||(T=s,b-=(g&&k===O&&O.visualViewport?O.visualViewport.width:k[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&Z),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:P(i*s)/s||0,y:P(n*s)/s||0}}({x:b,y},x(r)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const et={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:$(e.placement),variation:J(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,tt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,tt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var it={passive:!0};const nt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=x(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,it)})),a&&l.addEventListener("resize",i.update,it),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,it)})),a&&l.removeEventListener("resize",i.update,it)}},data:{}};var st={left:"right",right:"left",bottom:"top",top:"bottom"};function ot(t){return t.replace(/left|right|bottom|top/g,(function(t){return st[t]}))}var rt={start:"end",end:"start"};function at(t){return t.replace(/start|end/g,(function(t){return rt[t]}))}function lt(t){var e=x(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ct(t){return F(R(t)).left+lt(t).scrollLeft}function ht(t){var e=W(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function dt(t){return["html","body","#document"].indexOf(O(t))>=0?t.ownerDocument.body:L(t)&&ht(t)?t:dt(q(t))}function ut(t,e){var i;void 0===e&&(e=[]);var n=dt(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=x(n),r=s?[o].concat(o.visualViewport||[],ht(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ut(q(r)))}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function pt(t,e,i){return e===d?ft(function(t,e){var i=x(t),n=R(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=j();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ct(t),y:l}}(t,i)):k(e)?function(t,e){var i=F(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ft(function(t){var e,i=R(t),n=lt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=I(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=I(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ct(t),l=-n.scrollTop;return"rtl"===W(s||i).direction&&(a+=I(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(R(t)))}function mt(t){var e,r=t.reference,a=t.element,h=t.placement,d=h?$(h):null,u=h?J(h):null,f=r.x+r.width/2-a.width/2,p=r.y+r.height/2-a.height/2;switch(d){case i:e={x:f,y:r.y-a.height};break;case n:e={x:f,y:r.y+r.height};break;case s:e={x:r.x+r.width,y:p};break;case o:e={x:r.x-a.width,y:p};break;default:e={x:r.x,y:r.y}}var m=d?K(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case l:e[m]=e[m]-(r[g]/2-a[g]/2);break;case c:e[m]=e[m]+(r[g]/2-a[g]/2)}}return e}function gt(t,e){void 0===e&&(e={});var o=e,r=o.placement,l=void 0===r?t.placement:r,c=o.strategy,p=void 0===c?t.strategy:c,m=o.boundary,g=void 0===m?h:m,_=o.rootBoundary,b=void 0===_?d:_,v=o.elementContext,y=void 0===v?u:v,w=o.altBoundary,E=void 0!==w&&w,A=o.padding,T=void 0===A?0:A,C=X("number"!=typeof T?T:U(T,a)),x=y===u?f:u,S=t.rects.popper,D=t.elements[E?x:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ut(q(t)),i=["absolute","fixed"].indexOf(W(t).position)>=0&&L(t)?Y(t):t;return k(i)?e.filter((function(t){return k(t)&&B(t,i)&&"body"!==O(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=pt(t,i,n);return e.top=I(s.top,e.top),e.right=N(s.right,e.right),e.bottom=N(s.bottom,e.bottom),e.left=I(s.left,e.left),e}),pt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(k(D)?D:D.contextElement||R(t.elements.popper),g,b,p),P=F(t.elements.reference),M=mt({reference:P,element:S,strategy:"absolute",placement:l}),j=ft(Object.assign({},S,M)),H=y===u?j:P,z={top:$.top-H.top+C.top,bottom:H.bottom-$.bottom+C.bottom,left:$.left-H.left+C.left,right:H.right-$.right+C.right},V=t.modifiersData.offset;if(y===u&&V){var K=V[l];Object.keys(z).forEach((function(t){var e=[s,n].indexOf(t)>=0?1:-1,o=[i,n].indexOf(t)>=0?"y":"x";z[t]+=K[o]*e}))}return z}const _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,c=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=c.mainAxis,u=void 0===d||d,f=c.altAxis,g=void 0===f||f,_=c.fallbackPlacements,b=c.padding,v=c.boundary,y=c.rootBoundary,w=c.altBoundary,E=c.flipVariations,A=void 0===E||E,T=c.allowedAutoPlacements,C=e.options.placement,O=$(C),x=_||(O!==C&&A?function(t){if($(t)===r)return[];var e=ot(t);return[at(t),e,at(e)]}(C):[ot(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat($(i)===r?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,l=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?m:c,d=J(n),u=d?l?p:p.filter((function(t){return J(t)===d})):a,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var g=f.reduce((function(e,i){return e[i]=gt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[$(i)],e}),{});return Object.keys(g).sort((function(t,e){return g[t]-g[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,I=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=gt(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?s:o:F?n:i;L[B]>S[B]&&(z=ot(z));var R=ot(z),q=[];if(u&&q.push(W[j]<=0),g&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,I=!1;break}D.set(M,q)}if(I)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function vt(t){return[i,s,n,o].some((function(e){return t[e]>=0}))}const yt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=gt(e,{elementContext:"reference"}),a=gt(e,{altBoundary:!0}),l=bt(r,n),c=bt(a,s,o),h=vt(l),d=vt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},wt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,r=t.name,a=n.offset,l=void 0===a?[0,0]:a,c=m.reduce((function(t,n){return t[n]=function(t,e,n){var r=$(t),a=[o,i].indexOf(r)>=0?-1:1,l="function"==typeof n?n(Object.assign({},e,{placement:t})):n,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[o,s].indexOf(r)>=0?{x:h,y:c}:{x:c,y:h}}(n,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[r]=c}},Et={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=mt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},At={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,r=t.options,a=t.name,c=r.mainAxis,h=void 0===c||c,d=r.altAxis,u=void 0!==d&&d,f=r.boundary,p=r.rootBoundary,m=r.altBoundary,g=r.padding,_=r.tether,b=void 0===_||_,v=r.tetherOffset,y=void 0===v?0:v,w=gt(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=$(e.placement),A=J(e.placement),T=!A,C=K(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),P=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?i:o,B="y"===C?n:s,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[B],V=b?-L[W]/2:0,X=A===l?k[W]:L[W],U=A===l?-L[W]:-k[W],G=e.elements.arrow,Z=b&&G?H(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[B],nt=Q(0,k[W],Z[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:X-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&Y(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==P?void 0:P[C])?j:0,ct=z+ot-lt,ht=Q(b?N(R,z+st-lt-at):R,z,b?I(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?i:o,ft="x"===C?n:s,pt=x[O],mt="y"===O?"height":"width",_t=pt+w[ut],bt=pt-w[ft],vt=-1!==[i,o].indexOf(E),yt=null!=(dt=null==P?void 0:P[O])?dt:0,wt=vt?_t:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=Q(t,e,i);return n>i?i:n}(wt,pt,Et):Q(b?wt:_t,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Tt(t,e,i){void 0===i&&(i=!1);var n,s,o=L(e),r=L(e)&&function(t){var e=t.getBoundingClientRect(),i=P(e.width)/t.offsetWidth||1,n=P(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=R(e),l=F(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==O(e)||ht(a))&&(c=(n=e)!==x(n)&&L(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:lt(n)),L(e)?((h=F(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ct(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ct(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Ot={placement:"bottom",modifiers:[],strategy:"absolute"};function xt(){for(var t=arguments.length,e=new Array(t),i=0;i$t.has(t)&&$t.get(t).get(e)||null,remove(t,e){if(!$t.has(t))return;const i=$t.get(t);i.delete(e),0===i.size&&$t.delete(t)}},Nt="transitionend",Pt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),Mt=t=>{t.dispatchEvent(new Event(Nt))},jt=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ft=t=>jt(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Pt(t)):null,Ht=t=>{if(!jt(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Bt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),Wt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?Wt(t.parentNode):null},zt=()=>{},Rt=t=>{t.offsetHeight},qt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Vt=[],Yt=()=>"rtl"===document.documentElement.dir,Kt=t=>{var e;e=()=>{const e=qt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Vt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Vt)t()})),Vt.push(e)):e()},Qt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Xt=(t,e,i=!0)=>{if(!i)return void Qt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Nt,o),Qt(t))};e.addEventListener(Nt,o),setTimeout((()=>{s||Mt(e)}),n)},Ut=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Gt=/[^.]*(?=\..*)\.|.*/,Jt=/\..*/,Zt=/::\d+$/,te={};let ee=1;const ie={mouseenter:"mouseover",mouseleave:"mouseout"},ne=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function se(t,e){return e&&`${e}::${ee++}`||t.uidEvent||ee++}function oe(t){const e=se(t);return t.uidEvent=e,te[e]=te[e]||{},te[e]}function re(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function ae(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=de(t);return ne.has(o)||(o=t),[n,s,o]}function le(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=ae(e,i,n);if(e in ie){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=oe(t),c=l[a]||(l[a]={}),h=re(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=se(r,e.replace(Gt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return fe(s,{delegateTarget:r}),n.oneOff&&ue.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return fe(n,{delegateTarget:t}),i.oneOff&&ue.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function ce(t,e,i,n,s){const o=re(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function he(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&ce(t,e,i,r.callable,r.delegationSelector)}function de(t){return t=t.replace(Jt,""),ie[t]||t}const ue={on(t,e,i,n){le(t,e,i,n,!1)},one(t,e,i,n){le(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=ae(e,i,n),a=r!==e,l=oe(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))he(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(Zt,"");a&&!e.includes(s)||ce(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;ce(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=qt();let s=null,o=!0,r=!0,a=!1;e!==de(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=fe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function fe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function pe(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function me(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const ge={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${me(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${me(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=pe(t.dataset[n])}return e},getDataAttribute:(t,e)=>pe(t.getAttribute(`data-bs-${me(e)}`))};class _e{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=jt(e)?ge.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...jt(e)?ge.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=jt(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class be extends _e{constructor(t,e){super(),(t=Ft(t))&&(this._element=t,this._config=this._getConfig(e),It.set(this._element,this.constructor.DATA_KEY,this))}dispose(){It.remove(this._element,this.constructor.DATA_KEY),ue.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Xt(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return It.get(Ft(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ve=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?Pt(i.trim()):null}return e},ye={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Bt(t)&&Ht(t)))},getSelectorFromElement(t){const e=ve(t);return e&&ye.findOne(e)?e:null},getElementFromSelector(t){const e=ve(t);return e?ye.findOne(e):null},getMultipleElementsFromSelector(t){const e=ve(t);return e?ye.find(e):[]}},we=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;ue.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Bt(this))return;const s=ye.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ee=".bs.alert",Ae=`close${Ee}`,Te=`closed${Ee}`;class Ce extends be{static get NAME(){return"alert"}close(){if(ue.trigger(this._element,Ae).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),ue.trigger(this._element,Te),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Ce.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}we(Ce,"close"),Kt(Ce);const Oe='[data-bs-toggle="button"]';class xe extends be{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=xe.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}ue.on(document,"click.bs.button.data-api",Oe,(t=>{t.preventDefault();const e=t.target.closest(Oe);xe.getOrCreateInstance(e).toggle()})),Kt(xe);const ke=".bs.swipe",Le=`touchstart${ke}`,Se=`touchmove${ke}`,De=`touchend${ke}`,$e=`pointerdown${ke}`,Ie=`pointerup${ke}`,Ne={endCallback:null,leftCallback:null,rightCallback:null},Pe={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Me extends _e{constructor(t,e){super(),this._element=t,t&&Me.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Ne}static get DefaultType(){return Pe}static get NAME(){return"swipe"}dispose(){ue.off(this._element,ke)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Qt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Qt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(ue.on(this._element,$e,(t=>this._start(t))),ue.on(this._element,Ie,(t=>this._end(t))),this._element.classList.add("pointer-event")):(ue.on(this._element,Le,(t=>this._start(t))),ue.on(this._element,Se,(t=>this._move(t))),ue.on(this._element,De,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const je=".bs.carousel",Fe=".data-api",He="next",Be="prev",We="left",ze="right",Re=`slide${je}`,qe=`slid${je}`,Ve=`keydown${je}`,Ye=`mouseenter${je}`,Ke=`mouseleave${je}`,Qe=`dragstart${je}`,Xe=`load${je}${Fe}`,Ue=`click${je}${Fe}`,Ge="carousel",Je="active",Ze=".active",ti=".carousel-item",ei=Ze+ti,ii={ArrowLeft:ze,ArrowRight:We},ni={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},si={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class oi extends be{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=ye.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Ge&&this.cycle()}static get Default(){return ni}static get DefaultType(){return si}static get NAME(){return"carousel"}next(){this._slide(He)}nextWhenVisible(){!document.hidden&&Ht(this._element)&&this.next()}prev(){this._slide(Be)}pause(){this._isSliding&&Mt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?ue.one(this._element,qe,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void ue.one(this._element,qe,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?He:Be;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&ue.on(this._element,Ve,(t=>this._keydown(t))),"hover"===this._config.pause&&(ue.on(this._element,Ye,(()=>this.pause())),ue.on(this._element,Ke,(()=>this._maybeEnableCycle()))),this._config.touch&&Me.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of ye.find(".carousel-item img",this._element))ue.on(t,Qe,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(We)),rightCallback:()=>this._slide(this._directionToOrder(ze)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Me(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=ii[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=ye.findOne(Ze,this._indicatorsElement);e.classList.remove(Je),e.removeAttribute("aria-current");const i=ye.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Je),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===He,s=e||Ut(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>ue.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Re).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),Rt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(Je),i.classList.remove(Je,c,l),this._isSliding=!1,r(qe)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return ye.findOne(ei,this._element)}_getItems(){return ye.find(ti,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Yt()?t===We?Be:He:t===We?He:Be}_orderToDirection(t){return Yt()?t===Be?We:ze:t===Be?ze:We}static jQueryInterface(t){return this.each((function(){const e=oi.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}ue.on(document,Ue,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=ye.getElementFromSelector(this);if(!e||!e.classList.contains(Ge))return;t.preventDefault();const i=oi.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===ge.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),ue.on(window,Xe,(()=>{const t=ye.find('[data-bs-ride="carousel"]');for(const e of t)oi.getOrCreateInstance(e)})),Kt(oi);const ri=".bs.collapse",ai=`show${ri}`,li=`shown${ri}`,ci=`hide${ri}`,hi=`hidden${ri}`,di=`click${ri}.data-api`,ui="show",fi="collapse",pi="collapsing",mi=`:scope .${fi} .${fi}`,gi='[data-bs-toggle="collapse"]',_i={parent:null,toggle:!0},bi={parent:"(null|element)",toggle:"boolean"};class vi extends be{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=ye.find(gi);for(const t of i){const e=ye.getSelectorFromElement(t),i=ye.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return _i}static get DefaultType(){return bi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>vi.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(ue.trigger(this._element,ai).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(fi),this._element.classList.add(pi),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(pi),this._element.classList.add(fi,ui),this._element.style[e]="",ue.trigger(this._element,li)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(ue.trigger(this._element,ci).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,Rt(this._element),this._element.classList.add(pi),this._element.classList.remove(fi,ui);for(const t of this._triggerArray){const e=ye.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(pi),this._element.classList.add(fi),ue.trigger(this._element,hi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(ui)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ft(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(gi);for(const e of t){const t=ye.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=ye.find(mi,this._config.parent);return ye.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=vi.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}ue.on(document,di,gi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of ye.getMultipleElementsFromSelector(this))vi.getOrCreateInstance(t,{toggle:!1}).toggle()})),Kt(vi);const yi="dropdown",wi=".bs.dropdown",Ei=".data-api",Ai="ArrowUp",Ti="ArrowDown",Ci=`hide${wi}`,Oi=`hidden${wi}`,xi=`show${wi}`,ki=`shown${wi}`,Li=`click${wi}${Ei}`,Si=`keydown${wi}${Ei}`,Di=`keyup${wi}${Ei}`,$i="show",Ii='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ni=`${Ii}.${$i}`,Pi=".dropdown-menu",Mi=Yt()?"top-end":"top-start",ji=Yt()?"top-start":"top-end",Fi=Yt()?"bottom-end":"bottom-start",Hi=Yt()?"bottom-start":"bottom-end",Bi=Yt()?"left-start":"right-start",Wi=Yt()?"right-start":"left-start",zi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class qi extends be{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=ye.next(this._element,Pi)[0]||ye.prev(this._element,Pi)[0]||ye.findOne(Pi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return zi}static get DefaultType(){return Ri}static get NAME(){return yi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Bt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!ue.trigger(this._element,xi,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add($i),this._element.classList.add($i),ue.trigger(this._element,ki,t)}}hide(){if(Bt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!ue.trigger(this._element,Ci,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._popper&&this._popper.destroy(),this._menu.classList.remove($i),this._element.classList.remove($i),this._element.setAttribute("aria-expanded","false"),ge.removeDataAttribute(this._menu,"popper"),ue.trigger(this._element,Oi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!jt(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:jt(this._config.reference)?t=Ft(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=St(t,this._menu,i)}_isShown(){return this._menu.classList.contains($i)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Bi;if(t.classList.contains("dropstart"))return Wi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ji:Mi:e?Hi:Fi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(ge.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Qt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=ye.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Ht(t)));i.length&&Ut(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=ye.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ai,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:ye.prev(this,Ii)[0]||ye.next(this,Ii)[0]||ye.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}ue.on(document,Si,Ii,qi.dataApiKeydownHandler),ue.on(document,Si,Pi,qi.dataApiKeydownHandler),ue.on(document,Li,qi.clearMenus),ue.on(document,Di,qi.clearMenus),ue.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),Kt(qi);const Vi="backdrop",Yi="show",Ki=`mousedown.bs.${Vi}`,Qi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Xi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Qi}static get DefaultType(){return Xi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void Qt(t);this._append();const e=this._getElement();this._config.isAnimated&&Rt(e),e.classList.add(Yi),this._emulateAnimation((()=>{Qt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Yi),this._emulateAnimation((()=>{this.dispose(),Qt(t)}))):Qt(t)}dispose(){this._isAppended&&(ue.off(this._element,Ki),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ft(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),ue.on(t,Ki,(()=>{Qt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Xt(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),ue.off(document,Gi),ue.on(document,Ji,(t=>this._handleFocusin(t))),ue.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,ue.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=ye.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&ge.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=ge.getDataAttribute(t,e);null!==i?(ge.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(jt(t))e(t);else for(const i of ye.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",En="show",An="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends be{constructor(t,e){super(t,e),this._dialog=ye.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||ue.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(ue.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(En),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){ue.off(window,hn),ue.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=ye.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),Rt(this._element),this._element.classList.add(En),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,ue.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){ue.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),ue.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),ue.on(this._element,bn,(t=>{ue.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),ue.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(ue.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(An)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(An),this._queueCallback((()=>{this._element.classList.remove(An),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Yt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Yt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}ue.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=ye.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),ue.one(e,pn,(t=>{t.defaultPrevented||ue.one(e,fn,(()=>{Ht(this)&&this.focus()}))}));const i=ye.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),we(On),Kt(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Bn=`click${xn}${kn}`,Wn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends be{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||ue.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),ue.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(ue.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),ue.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():ue.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){ue.on(this._element,Wn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():ue.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}ue.on(document,Bn,'[data-bs-toggle="offcanvas"]',(function(t){const e=ye.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this))return;ue.one(e,Fn,(()=>{Ht(this)&&this.focus()}));const i=ye.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),ue.on(window,Ln,(()=>{for(const t of ye.find(In))qn.getOrCreateInstance(t).show()})),ue.on(window,Hn,(()=>{for(const t of ye.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),we(qn),Kt(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Yn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Kn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Qn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Yn.has(i)||Boolean(Kn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Xn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends _e{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=ye.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?jt(e)?this._putElementInTemplate(Ft(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Qn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Qt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:Yt()?"left":"right",BOTTOM:"bottom",LEFT:Yt()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends be{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),ue.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=ue.trigger(this._element,this.constructor.eventName("show")),e=(Wt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),ue.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._queueCallback((()=>{ue.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!ue.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),ue.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=Qt(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return St(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Qt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Qt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)ue.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");ue.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),ue.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},ue.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=ge.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ft(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Es={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class As extends be{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return Es}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ft(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(ue.off(this._config.target,ms),ue.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=ye.find(bs,this._config.target);for(const e of t){if(!e.hash||Bt(e))continue;const t=ye.findOne(decodeURI(e.hash),this._element);Ht(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),ue.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))ye.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of ye.parents(t,".nav, .list-group"))for(const t of ye.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=ye.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=As.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}ue.on(window,gs,(()=>{for(const t of ye.find('[data-bs-spy="scroll"]'))As.getOrCreateInstance(t)})),Kt(As);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Bs="show",Ws=".dropdown-toggle",zs=`:not(${Ws})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ys extends be{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),ue.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?ue.trigger(e,Cs,{relatedTarget:t}):null;ue.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),ue.trigger(t,ks,{relatedTarget:e})):t.classList.add(Bs)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),ue.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Bs)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Bt(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=Ut(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ys.getOrCreateInstance(i).show())}_getChildren(){return ye.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=ye.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=ye.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ws,Fs),n(".dropdown-menu",Bs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:ye.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ys.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}ue.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this)||Ys.getOrCreateInstance(this).show()})),ue.on(window,Ds,(()=>{for(const t of ye.find(Vs))Ys.getOrCreateInstance(t)})),Kt(Ys);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Us=`focusin${Ks}`,Gs=`focusout${Ks}`,Js=`hide${Ks}`,Zs=`hidden${Ks}`,to=`show${Ks}`,eo=`shown${Ks}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends be{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){ue.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),Rt(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),ue.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(ue.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),ue.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){ue.on(this._element,Qs,(t=>this._onInteraction(t,!0))),ue.on(this._element,Xs,(t=>this._onInteraction(t,!1))),ue.on(this._element,Us,(t=>this._onInteraction(t,!0))),ue.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function lo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}we(ao),Kt(ao),lo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new cs(t,{delay:{show:500,hide:100}})}))})),lo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),lo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))}))})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/_static/scripts/bootstrap.js.LICENSE.txt b/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 00000000..10f979d0 --- /dev/null +++ b/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/_static/scripts/bootstrap.js.map b/_static/scripts/bootstrap.js.map new file mode 100644 index 00000000..e5bc1575 --- /dev/null +++ b/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.2';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null;\n }\n return selector;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\n\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\n\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both