diff --git a/README.md b/README.md index cde861c..bc50075 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Please follow these rules to keep the repo clean: ### How to add a talk recording #### Manually -- Go to http://localhost:5000/admin/root:talk-recordings/edit +- Go to http://localhost:5000/admin/root:recordings/edit - Click "Add Page" - Choose the "Recording" model - Set the "Title" field to the talk title diff --git a/scripts/recordings/README.md b/scripts/recordings/README.md index 5b56098..7f45a2e 100644 --- a/scripts/recordings/README.md +++ b/scripts/recordings/README.md @@ -2,7 +2,22 @@ These script should help in the process of releasing the talk recordings on Youtube and on the website -## 1. Download Pretalx Schedule +## Steps -**WARNING:** Download the `schedule.json` without being logged in or in private mode otherwise there will be personal data in the json !!!! +1. Download Pretalx Schedule +**WARNING:** Download the `schedule.json` without being logged in or in private mode otherwise there will be personal data (e.g. email addresses) in the json and therefore public as this repo is public !!!! + +2. Run `schedule_2_csv.py` + +Upload video to Youtube with the provided metadata (title, description) from the CSV. Get the Youtube link and add it to the CSV + +3. Run `csv_2_content.py` + +Add link to the content files provided + +4. Copy content files `sps20/content/recordings` to release it + +Copy the slides pdf as well an name it accordingly TODO + +5. For full playlist, add them to `sps20/databags/playlists.json` \ No newline at end of file diff --git a/scripts/recordings/csv_2_content.py b/scripts/recordings/csv_2_content.py index b50de28..2cdd8d8 100644 --- a/scripts/recordings/csv_2_content.py +++ b/scripts/recordings/csv_2_content.py @@ -4,16 +4,18 @@ import re import shutil -FILE_DIR = Path("scripts/recordings/sps24") -assert FILE_DIR.exists(), "FILE_DIR does not exist" +# START Change these two +CONF_YEAR_SLUG = "25" +# END -CSV_PATH = FILE_DIR / "talks.csv" +BASE_DIR = Path(f"scripts/recordings/sps{CONF_YEAR_SLUG}") +CONF_SHORT = f"SPS{CONF_YEAR_SLUG}" +CONF_YEAR = f"20{CONF_YEAR_SLUG}" +CSV_PATH = BASE_DIR / "talks.csv" +assert BASE_DIR.exists(), "BASE_DIR does not exist" +assert CSV_PATH.exists(), "CSV_PATH not found" -CONF_SHORT = "SPS24" -CONF_YEAR = "2024" - -OUTPUT_FOLDER = Path("scripts/recordings/out") def get_data(csv_path, filter_type=["Talk", "Keynote", "Lightning Talks (9x5min)"]): df = pd.read_csv(csv_path) @@ -22,28 +24,27 @@ def get_data(csv_path, filter_type=["Talk", "Keynote", "Lightning Talks (9x5min) return df def create_file_structure(df: pd.DataFrame): - # if OUTPUT_FOLDER.exists(): - # shutil.rmtree(OUTPUT_FOLDER) - OUTPUT_FOLDER.mkdir(exist_ok=False) + out_dir = BASE_DIR / "content" + out_dir.mkdir(exist_ok=False) # Warn user if it exists for i, row in df.iterrows(): - filename = Path(OUTPUT_FOLDER / row.filename) + filename = Path(out_dir / row.filename) filename.mkdir() content = filename / "contents.lr" - content.write_text(create_content(i, row)) + content.write_text(create_content(row)) slide = filename / f"{filename.name}.pdf.lr" slide.write_text("type: slides") -def create_content(i, row): +def create_content(row): text = f''' _model: recording --- title: {row.title} --- -ordering: {i} +ordering: {row.talk_idx} --- speaker: {row.names_combined} --- -video_url: {row.video_url} +video_url: {row.video_url if row.video_url != "" else ""} --- year: {CONF_YEAR} - Day {row.day} ''' diff --git a/scripts/recordings/pretalx_2_csv.py b/scripts/recordings/schedule_2_csv.py similarity index 78% rename from scripts/recordings/pretalx_2_csv.py rename to scripts/recordings/schedule_2_csv.py index abdffba..b670453 100644 --- a/scripts/recordings/pretalx_2_csv.py +++ b/scripts/recordings/schedule_2_csv.py @@ -1,16 +1,29 @@ +''' +Script to convert pretalx schedule.json to a CSV file. +It can be used to easy copy the data to Youtube upload forms and name the slides pdf properly. +''' + import pandas as pd from pathlib import Path import json import re from datetime import datetime +from textwrap import dedent + +# START Change these two +CONF_YEAR_SLUG = "25" +# END -FILE_DIR = Path("scripts/recordings/sps24") -assert FILE_DIR.exists(), "FILE_DIR does not exist" +BASE_DIR = Path(f"scripts/recordings/sps{CONF_YEAR_SLUG}") +CONF_SHORT = f"SPS{CONF_YEAR_SLUG}" +CONF_YEAR = f"20{CONF_YEAR_SLUG}" -CSV_PATH = FILE_DIR / "talks.csv" -PRETALX_SCHEDULE_PATH = FILE_DIR / "schedule.json" -CONF_SHORT = "SPS24" +assert BASE_DIR.exists(), "FILE_DIR does not exist" + +PRETALX_SCHEDULE_PATH = BASE_DIR / "schedule.json" +CSV_PATH = BASE_DIR / "talks.csv" + def get_talks_data(schedule_path = PRETALX_SCHEDULE_PATH): schedule_data = json.loads(schedule_path.read_text()) @@ -19,11 +32,12 @@ def get_talks_data(schedule_path = PRETALX_SCHEDULE_PATH): day_idx = day["index"] print(f"Processing day {day_idx}") room_name = next(iter(day["rooms"])) - for talk in day["rooms"][room_name]: - print(f"\tProcessing talks #{talk['id']}") + for i, talk in enumerate(day["rooms"][room_name]): + print(f"\tProcessing talk #{talk['id']}") names, bios = zip(*[(d["public_name"], d["biography"] if d["biography"] else "") for d in talk["persons"]]) talk_data = dict( day = day_idx, + talk_idx = i, date = talk["date"], title = talk["title"], type = talk["type"], @@ -54,15 +68,15 @@ def enrich(talks): named_title = f'{names} - {talk["title"]}' talk["named_title"] = named_title talk["video_title"] = f"{named_title} - {CONF_SHORT}" - filename = clean_filename(f"{CONF_SHORT}_{named_title}") + filename = clean_filename(f"{CONF_SHORT}_{talk['day']}-{talk['talk_idx']:02d}_{named_title}") talk["filename"] = filename - talk["video_url"] = "" + talk["video_url"] = "" # fill in manually later when the video is uploaded talk["biographies_combined"] = "\n\n".join(talk["biographies_raw"]) talk["date_str"] = talk["date"] # Title and Description for youtube talk["video_text"] = f'{talk["names_combined"]} – {talk["title"]} – {CONF_SHORT}' - talk["video_text"] = f'''Talk recorded at the Swiss Python Summit on {timestring(talk["date"])}. - + talk["video_text"] = f''' +Talk recorded at the Swiss Python Summit on {timestring(talk["date"])}. Licensed as Creative Commons Attribution 4.0 International. --------- @@ -74,7 +88,7 @@ def enrich(talks): About the speaker(s): {talk["biographies_combined"]} -''' +'''.lstrip() return talks def clean_filename(filename, max_length=70): @@ -122,7 +136,7 @@ def main(): df = pd.DataFrame(data) df.to_csv(CSV_PATH) short_csv_path = CSV_PATH.parent / (CSV_PATH.stem + "_notext" + CSV_PATH.suffix) - # print(short_csv_path) + print("CSV saved to:", CSV_PATH) # drop multiline texts df.drop(["abstract","biographies_raw", "biographies_combined", "video_text"], axis=1).to_csv(short_csv_path) diff --git a/scripts/recordings/out/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/contents.lr b/scripts/recordings/sps24/content/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/contents.lr rename to scripts/recordings/sps24/content/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/contents.lr diff --git a/scripts/recordings/out/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_.pdf.lr b/scripts/recordings/sps24/content/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_.pdf.lr rename to scripts/recordings/sps24/content/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_.pdf.lr diff --git a/scripts/recordings/out/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/contents.lr b/scripts/recordings/sps24/content/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/contents.lr rename to scripts/recordings/sps24/content/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/contents.lr diff --git a/scripts/recordings/out/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact.pdf.lr b/scripts/recordings/sps24/content/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact.pdf.lr rename to scripts/recordings/sps24/content/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact.pdf.lr diff --git a/scripts/recordings/out/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/contents.lr b/scripts/recordings/sps24/content/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/contents.lr rename to scripts/recordings/sps24/content/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/contents.lr diff --git a/scripts/recordings/out/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping.pdf.lr b/scripts/recordings/sps24/content/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping.pdf.lr rename to scripts/recordings/sps24/content/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping.pdf.lr diff --git a/scripts/recordings/out/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/contents.lr b/scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/contents.lr rename to scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/contents.lr diff --git a/scripts/recordings/out/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost.pdf.lr b/scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost.pdf.lr rename to scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost.pdf.lr diff --git a/scripts/recordings/out/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/contents.lr b/scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/contents.lr rename to scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/contents.lr diff --git a/scripts/recordings/out/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio.pdf.lr b/scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio.pdf.lr rename to scripts/recordings/sps24/content/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio.pdf.lr diff --git a/scripts/recordings/out/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/contents.lr b/scripts/recordings/sps24/content/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/contents.lr rename to scripts/recordings/sps24/content/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/contents.lr diff --git a/scripts/recordings/out/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/sps24_florian_bruhin_-_property_based_testing_with_hypothesis.pdf.lr b/scripts/recordings/sps24/content/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/sps24_florian_bruhin_-_property_based_testing_with_hypothesis.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/sps24_florian_bruhin_-_property_based_testing_with_hypothesis.pdf.lr rename to scripts/recordings/sps24/content/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/sps24_florian_bruhin_-_property_based_testing_with_hypothesis.pdf.lr diff --git a/scripts/recordings/out/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/contents.lr b/scripts/recordings/sps24/content/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/contents.lr rename to scripts/recordings/sps24/content/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/contents.lr diff --git a/scripts/recordings/out/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/sps24_isaac_chung_-_prototype_to_production_for_rag_applications.pdf.lr b/scripts/recordings/sps24/content/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/sps24_isaac_chung_-_prototype_to_production_for_rag_applications.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/sps24_isaac_chung_-_prototype_to_production_for_rag_applications.pdf.lr rename to scripts/recordings/sps24/content/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/sps24_isaac_chung_-_prototype_to_production_for_rag_applications.pdf.lr diff --git a/scripts/recordings/out/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/contents.lr b/scripts/recordings/sps24/content/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/contents.lr rename to scripts/recordings/sps24/content/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/contents.lr diff --git a/scripts/recordings/out/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w.pdf.lr b/scripts/recordings/sps24/content/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w.pdf.lr rename to scripts/recordings/sps24/content/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w.pdf.lr diff --git a/scripts/recordings/out/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/contents.lr b/scripts/recordings/sps24/content/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/contents.lr rename to scripts/recordings/sps24/content/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/contents.lr diff --git a/scripts/recordings/out/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_.pdf.lr b/scripts/recordings/sps24/content/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_.pdf.lr rename to scripts/recordings/sps24/content/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_.pdf.lr diff --git a/scripts/recordings/out/sps24_juerg_rast_-_lab_automation_with_python/contents.lr b/scripts/recordings/sps24/content/sps24_juerg_rast_-_lab_automation_with_python/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_juerg_rast_-_lab_automation_with_python/contents.lr rename to scripts/recordings/sps24/content/sps24_juerg_rast_-_lab_automation_with_python/contents.lr diff --git a/scripts/recordings/out/sps24_juerg_rast_-_lab_automation_with_python/sps24_juerg_rast_-_lab_automation_with_python.pdf.lr b/scripts/recordings/sps24/content/sps24_juerg_rast_-_lab_automation_with_python/sps24_juerg_rast_-_lab_automation_with_python.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_juerg_rast_-_lab_automation_with_python/sps24_juerg_rast_-_lab_automation_with_python.pdf.lr rename to scripts/recordings/sps24/content/sps24_juerg_rast_-_lab_automation_with_python/sps24_juerg_rast_-_lab_automation_with_python.pdf.lr diff --git a/scripts/recordings/out/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/contents.lr b/scripts/recordings/sps24/content/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/contents.lr rename to scripts/recordings/sps24/content/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/contents.lr diff --git a/scripts/recordings/out/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w.pdf.lr b/scripts/recordings/sps24/content/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w.pdf.lr rename to scripts/recordings/sps24/content/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w.pdf.lr diff --git a/scripts/recordings/out/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/contents.lr b/scripts/recordings/sps24/content/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/contents.lr rename to scripts/recordings/sps24/content/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/contents.lr diff --git a/scripts/recordings/out/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about.pdf.lr b/scripts/recordings/sps24/content/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about.pdf.lr rename to scripts/recordings/sps24/content/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about.pdf.lr diff --git a/scripts/recordings/out/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/contents.lr b/scripts/recordings/sps24/content/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/contents.lr rename to scripts/recordings/sps24/content/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/contents.lr diff --git a/scripts/recordings/out/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_.pdf.lr b/scripts/recordings/sps24/content/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_.pdf.lr rename to scripts/recordings/sps24/content/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_.pdf.lr diff --git a/scripts/recordings/out/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/contents.lr b/scripts/recordings/sps24/content/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/contents.lr rename to scripts/recordings/sps24/content/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/contents.lr diff --git a/scripts/recordings/out/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings.pdf.lr b/scripts/recordings/sps24/content/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings.pdf.lr rename to scripts/recordings/sps24/content/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings.pdf.lr diff --git a/scripts/recordings/out/sps24_orga_-_lightning_talks_day_1/contents.lr b/scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_1/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_orga_-_lightning_talks_day_1/contents.lr rename to scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_1/contents.lr diff --git a/scripts/recordings/out/sps24_orga_-_lightning_talks_day_1/sps24_orga_-_lightning_talks_day_1.pdf.lr b/scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_1/sps24_orga_-_lightning_talks_day_1.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_orga_-_lightning_talks_day_1/sps24_orga_-_lightning_talks_day_1.pdf.lr rename to scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_1/sps24_orga_-_lightning_talks_day_1.pdf.lr diff --git a/scripts/recordings/out/sps24_orga_-_lightning_talks_day_2/contents.lr b/scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_2/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_orga_-_lightning_talks_day_2/contents.lr rename to scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_2/contents.lr diff --git a/scripts/recordings/out/sps24_orga_-_lightning_talks_day_2/sps24_orga_-_lightning_talks_day_2.pdf.lr b/scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_2/sps24_orga_-_lightning_talks_day_2.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_orga_-_lightning_talks_day_2/sps24_orga_-_lightning_talks_day_2.pdf.lr rename to scripts/recordings/sps24/content/sps24_orga_-_lightning_talks_day_2/sps24_orga_-_lightning_talks_day_2.pdf.lr diff --git a/scripts/recordings/out/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/contents.lr b/scripts/recordings/sps24/content/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/contents.lr rename to scripts/recordings/sps24/content/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/contents.lr diff --git a/scripts/recordings/out/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_.pdf.lr b/scripts/recordings/sps24/content/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_.pdf.lr rename to scripts/recordings/sps24/content/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_/sps24_pavel_sulimov_-_quantum_machine_learning_qiskit_1x_vs_pennylane_.pdf.lr diff --git a/scripts/recordings/out/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/contents.lr b/scripts/recordings/sps24/content/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/contents.lr similarity index 100% rename from scripts/recordings/out/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/contents.lr rename to scripts/recordings/sps24/content/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/contents.lr diff --git a/scripts/recordings/out/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre.pdf.lr b/scripts/recordings/sps24/content/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre.pdf.lr similarity index 100% rename from scripts/recordings/out/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre.pdf.lr rename to scripts/recordings/sps24/content/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre/sps24_vita_midori_-_parallel_python_at_last_subinterpreters__free-thre.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-01_tim_head_-_when_close_enough_is_good_enough/contents.lr b/scripts/recordings/sps25/content/sps25_1-01_tim_head_-_when_close_enough_is_good_enough/contents.lr new file mode 100644 index 0000000..81012a9 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-01_tim_head_-_when_close_enough_is_good_enough/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: When Close Enough is Good Enough +--- +ordering: 1 +--- +speaker: Tim Head +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_.pdf.lr b/scripts/recordings/sps25/content/sps25_1-01_tim_head_-_when_close_enough_is_good_enough/sps25_1-01_tim_head_-_when_close_enough_is_good_enough.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_/sps24_albert_weichselbraun_-_artificial_intelligence_why_explanations_.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-01_tim_head_-_when_close_enough_is_good_enough/sps25_1-01_tim_head_-_when_close_enough_is_good_enough.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev/contents.lr b/scripts/recordings/sps25/content/sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev/contents.lr new file mode 100644 index 0000000..b8b164f --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Code review in era of collaborative development +--- +ordering: 2 +--- +speaker: Andrii Soldatenko +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact.pdf.lr b/scripts/recordings/sps25/content/sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev/sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact/sps24_bojan_miletic_-_code_makeover_mastering_the_art_of_python_refact.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev/sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files/contents.lr b/scripts/recordings/sps25/content/sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files/contents.lr new file mode 100644 index 0000000..2d54297 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Bytecode and .pyc files +--- +ordering: 3 +--- +speaker: Konrad Gawda +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping.pdf.lr b/scripts/recordings/sps25/content/sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files/sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping/sps24_chantal_keller_-_empowering_independence_robot-assisted_shopping.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files/sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r/contents.lr b/scripts/recordings/sps25/content/sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r/contents.lr new file mode 100644 index 0000000..9233c3b --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Why you, as a Python developer, should learn Rust +--- +ordering: 4 +--- +speaker: Daniel Szoke +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost.pdf.lr b/scripts/recordings/sps25/content/sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r/sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost/sps24_emanuele_fabbiani_-_from_shap_to_ebm_explain_your_gradient_boost.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r/sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite/contents.lr b/scripts/recordings/sps25/content/sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite/contents.lr new file mode 100644 index 0000000..944a62f --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Functional Python: Saving Christmas with itertools & friends +--- +ordering: 5 +--- +speaker: Edoardo Baldi +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio.pdf.lr b/scripts/recordings/sps25/content/sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite/sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio/sps24_emanuele_fabbiani_-_the_hitchhikers_guide_to_asyncio.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite/sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli/contents.lr b/scripts/recordings/sps25/content/sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli/contents.lr new file mode 100644 index 0000000..26a7b9c --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Building Resilient Python Apps for Unreliable Networks +--- +ordering: 6 +--- +speaker: Emeka Onyebuchi +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/sps24_florian_bruhin_-_property_based_testing_with_hypothesis.pdf.lr b/scripts/recordings/sps25/content/sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli/sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_florian_bruhin_-_property_based_testing_with_hypothesis/sps24_florian_bruhin_-_property_based_testing_with_hypothesis.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli/sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty/contents.lr b/scripts/recordings/sps25/content/sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty/contents.lr new file mode 100644 index 0000000..e24573f --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Software estimation: False sense of certainty +--- +ordering: 7 +--- +speaker: Ines Panker +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/sps24_isaac_chung_-_prototype_to_production_for_rag_applications.pdf.lr b/scripts/recordings/sps25/content/sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty/sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_isaac_chung_-_prototype_to_production_for_rag_applications/sps24_isaac_chung_-_prototype_to_production_for_rag_applications.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty/sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_/contents.lr b/scripts/recordings/sps25/content/sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_/contents.lr new file mode 100644 index 0000000..5c114f8 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Using Python's array API standard for ESA's Euclid mission +--- +ordering: 8 +--- +speaker: Saransh Chopra +--- +video_url: +--- +year: 2025 - Day 1 diff --git a/sps20/content/talk-recordings/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w.pdf.lr b/scripts/recordings/sps25/content/sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_/sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w/sps24_jan_werth_christopher_wetekamp_-_even_if_we_desperatly_want_to_w.pdf.lr rename to scripts/recordings/sps25/content/sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_/sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy/contents.lr b/scripts/recordings/sps25/content/sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy/contents.lr new file mode 100644 index 0000000..56ebd20 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Machine learning for Swiss democracy +--- +ordering: 1 +--- +speaker: Vita Midori +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_.pdf.lr b/scripts/recordings/sps25/content/sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy/sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_/sps24_johannes_kolbe_-_more_than_pixels_-_unlock_your_image_data_with_.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy/sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them/contents.lr b/scripts/recordings/sps25/content/sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them/contents.lr new file mode 100644 index 0000000..6912731 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: AI Coding Agents and how to code them +--- +ordering: 2 +--- +speaker: Alex Shershebnev +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_juerg_rast_-_lab_automation_with_python/sps24_juerg_rast_-_lab_automation_with_python.pdf.lr b/scripts/recordings/sps25/content/sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them/sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_juerg_rast_-_lab_automation_with_python/sps24_juerg_rast_-_lab_automation_with_python.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them/sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig/contents.lr b/scripts/recordings/sps25/content/sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig/contents.lr new file mode 100644 index 0000000..e12d124 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Causal ML for Smarter Advertising Campaigns with Python +--- +ordering: 3 +--- +speaker: Francesco Conti +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w.pdf.lr b/scripts/recordings/sps25/content/sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig/sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w/sps24_kevin_klein_francesc_marti_escofet_-_learning_from_experiments_w.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig/sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_/contents.lr b/scripts/recordings/sps25/content/sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_/contents.lr new file mode 100644 index 0000000..4622983 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Docling: Get your documents ready for generative AI +--- +ordering: 4 +--- +speaker: Peter Staar, Michele Dolfi, Panos Vagenas, Nikos Livathinos +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about.pdf.lr b/scripts/recordings/sps25/content/sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_/sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about/sps24_konrad_gawda_-_float_-_everything_you_wanted_to_know_about.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_/sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in/contents.lr b/scripts/recordings/sps25/content/sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in/contents.lr new file mode 100644 index 0000000..695db2f --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Agentic Cyber Defense with External Threat Intelligence +--- +ordering: 5 +--- +speaker: Jyoti Yadav +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_.pdf.lr b/scripts/recordings/sps25/content/sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in/sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_/sps24_luca_gubler_-_automate_your_network_in_5_easy_steps_with_python_.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in/sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin/contents.lr b/scripts/recordings/sps25/content/sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin/contents.lr new file mode 100644 index 0000000..c4380c0 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Anonymization of sensitive information in financial document +--- +ordering: 6 +--- +speaker: Piotr Gryko +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings.pdf.lr b/scripts/recordings/sps25/content/sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin/sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings/sps24_neil_gibbons_-_demystifying_spark_a_deep_dive_into_its_workings.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin/sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-07_dasindrashis_-_gompertz_linear_units_golu/contents.lr b/scripts/recordings/sps25/content/sps25_2-07_dasindrashis_-_gompertz_linear_units_golu/contents.lr new file mode 100644 index 0000000..7a191f9 --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-07_dasindrashis_-_gompertz_linear_units_golu/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: Gompertz Linear Units (GoLU) +--- +ordering: 7 +--- +speaker: Das Indrashis +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_orga_-_lightning_talks_day_1/sps24_orga_-_lightning_talks_day_1.pdf.lr b/scripts/recordings/sps25/content/sps25_2-07_dasindrashis_-_gompertz_linear_units_golu/sps25_2-07_dasindrashis_-_gompertz_linear_units_golu.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_orga_-_lightning_talks_day_1/sps24_orga_-_lightning_talks_day_1.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-07_dasindrashis_-_gompertz_linear_units_golu/sps25_2-07_dasindrashis_-_gompertz_linear_units_golu.pdf.lr diff --git a/scripts/recordings/sps25/content/sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power/contents.lr b/scripts/recordings/sps25/content/sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power/contents.lr new file mode 100644 index 0000000..bc257dc --- /dev/null +++ b/scripts/recordings/sps25/content/sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power/contents.lr @@ -0,0 +1,12 @@ + +_model: recording +--- +title: What Networks tell us about Trades, Power, and the World? +--- +ordering: 8 +--- +speaker: Kshitijaa Jaglan +--- +video_url: +--- +year: 2025 - Day 2 diff --git a/sps20/content/talk-recordings/sps24_orga_-_lightning_talks_day_2/sps24_orga_-_lightning_talks_day_2.pdf.lr b/scripts/recordings/sps25/content/sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power/sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power.pdf.lr similarity index 100% rename from sps20/content/talk-recordings/sps24_orga_-_lightning_talks_day_2/sps24_orga_-_lightning_talks_day_2.pdf.lr rename to scripts/recordings/sps25/content/sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power/sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power.pdf.lr diff --git a/scripts/recordings/sps25/schedule.json b/scripts/recordings/sps25/schedule.json new file mode 100644 index 0000000..c0e33b7 --- /dev/null +++ b/scripts/recordings/sps25/schedule.json @@ -0,0 +1 @@ +{"$schema": "https://c3voc.de/schedule/schema.json", "generator": {"name": "pretalx", "version": "2025.2.0.dev0"}, "schedule": {"url": "https://talks.python-summit.ch/sps25/schedule/", "version": "0.8", "base_url": "https://talks.python-summit.ch", "conference": {"acronym": "sps25", "title": "Swiss Python Summit 2025", "start": "2025-10-16", "end": "2025-10-17", "daysCount": 2, "timeslot_duration": "00:05", "time_zone_name": "Europe/Zurich", "colors": {"primary": "#336d9c"}, "rooms": [{"name": "Aula 4.101", "slug": "3931-aula-4101", "guid": "73b6b66b-e0dd-5fe2-ad4d-fda51c58f296", "description": "Our main meeting place", "capacity": 500}], "tracks": [{"name": "Day 1 - Python, the programming language you love", "slug": "5550-day-1-python-the-programming-language-you-love", "color": "#f76f21"}, {"name": "Day 2 - Data Science & More", "slug": "5551-day-2-data-science-more", "color": "#4787ba"}], "days": [{"index": 1, "date": "2025-10-16", "day_start": "2025-10-16T04:00:00+02:00", "day_end": "2025-10-17T03:59:00+02:00", "rooms": {"Aula 4.101": [{"guid": "1b0962d7-65cb-5035-86d8-ed33643a1a97", "code": "LL3K3L", "id": 81337, "logo": null, "date": "2025-10-16T09:00:00+02:00", "start": "09:00", "duration": "00:05", "room": "Aula 4.101", "slug": "sps25-81337-welcome-day-1", "url": "https://talks.python-summit.ch/sps25/talk/LL3K3L/", "title": "Welcome - Day 1", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Opening/Closing", "language": "en", "abstract": "A welcome message and useful information from the organisers.\r\n\r\nYou will also find useful information on our website [www.python-summit.ch/venue](https://www.python-summit.ch/venue/). Or feel free to ask any member of staff if you have a question.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "398THE", "name": "Orga", "avatar": null, "biography": null, "public_name": "Orga", "guid": "50917e4d-298c-551c-a458-7cb1dd33aab8", "url": "https://talks.python-summit.ch/sps25/speaker/398THE/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/LL3K3L/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/LL3K3L/", "attachments": []}, {"guid": "f076a430-8b32-50af-a359-aee635d4451b", "code": "QBXDUQ", "id": 71289, "logo": null, "date": "2025-10-16T09:10:00+02:00", "start": "09:10", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-71289-when-close-enough-is-good-enough", "url": "https://talks.python-summit.ch/sps25/talk/QBXDUQ/", "title": "When Close Enough is Good Enough", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "Sometimes getting an approximate answer is super good enough. How do you check for duplicates, count unique users, or track item popularity when your dataset won\u2019t fit in memory? Enter probabilistic data structures like Bloom filters, Count-Min Sketches, and HyperLogLog! This talk introduces these powerful tools, demonstrates simple implementations in Python, and gives you ideas on when to use them.\r\n\r\nWalk away ready to apply these techniques in your own projects - no advanced math required.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "G9FDBT", "name": "Tim Head", "avatar": "https://talks.python-summit.ch/media/avatars/G9FDBT_0krrzKt.jpg", "biography": "I am a maintainer of the scikit-learn machine-learning library. In the past I've worked on building and running mybinder.org and JupyterHub.\r\n\r\nI am employed by NVIDIA.", "public_name": "Tim Head", "guid": "22b2e092-09d8-5036-b5e6-ea4cda0fff99", "url": "https://talks.python-summit.ch/sps25/speaker/G9FDBT/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/QBXDUQ/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/QBXDUQ/", "attachments": []}, {"guid": "100446c9-1219-5d03-ad3c-967f2b47a9a9", "code": "ESM3K7", "id": 72223, "logo": null, "date": "2025-10-16T09:45:00+02:00", "start": "09:45", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-72223-code-review-in-era-of-collaborative-development", "url": "https://talks.python-summit.ch/sps25/talk/ESM3K7/", "title": "Code review in era of collaborative development", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "Code review is a central part of everyday developer jobs. The motivation to create this talk was a quote:\r\n\u201cThe most important superpower of a developer is complaining about everybody else's code.\u201d In this talk, I\u2019ll explain my approach to better code review.\r\n\r\nSometimes, it\u2019s hard to convince a colleague about change or don\u2019t change some lines of code. In my talk I would like to cover some best practices from my software engineering experience about efficient and honest code review. How to create a culture of perfect code review. How to apply automatic tools to improve code review routine of repetitive comments or suggestions. How to write/or reuse coding style guides for your team to reduce the time spent arguing about naming conventions and different styles.\r\nWhat needs to be automated and what needs to be not automated during code review? The key role of patterns that can be reusable is not to confuse colleagues.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "E9QEAS", "name": "Andrii Soldatenko", "avatar": "https://talks.python-summit.ch/media/avatars/E9QEAS_aN4jYqc.jpg", "biography": "My name is Andrii Soldatenko. I am a sr. software engineer originally from Ukraine \ud83c\uddfa\ud83c\udde6, and I am currently living in Austria \ud83c\udde6\ud83c\uddf9. Public speaker (KCD, FOSDEM, GoDays, PyCons) and OSS contributor (Apache Airflow, Golang, OpenAPI, docker). I am a big fan of debuggers, Neovim, Rust.", "public_name": "Andrii Soldatenko", "guid": "4177c8a8-8973-55d2-adcb-bff705e993ff", "url": "https://talks.python-summit.ch/sps25/speaker/E9QEAS/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/ESM3K7/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/ESM3K7/", "attachments": []}, {"guid": "05e4a64f-3987-523e-87a5-7e20609fedb1", "code": "9NWPB9", "id": 72115, "logo": null, "date": "2025-10-16T11:00:00+02:00", "start": "11:00", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-72115-bytecode-and-pyc-files", "url": "https://talks.python-summit.ch/sps25/talk/9NWPB9/", "title": "Bytecode and .pyc files", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "Bytecode, the internal language of instructions used by the interpreter is something that perhaps most Python developers have heard about, but few have dug into. This talk will try to explain the idea behind bytecode and how it works.\r\nWe will see how to extract bytecode from functions - with `dis` module, and from `.pyc` files (and what is the idea of `__pycache__` directories). Then, the other way around: we\u2019ll check the possibility of building new functions with raw bytes in runtime.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "DCSZFT", "name": "Konrad Gawda", "avatar": "https://talks.python-summit.ch/media/avatars/DCSZFT_vpbxUJA.png", "biography": "Python, Linux and Open Source proponent. Cloud Evangelist, Python trainer and programmer. Reportedly seen at Warsaw Python meetups since the first PyWaw meeting ever. Recognized as an Inland Sailor by the Polish Sailing Association and as an inventor by the US Patent Office.", "public_name": "Konrad Gawda", "guid": "e265781d-6ee5-5f85-b860-0df3be76f8f5", "url": "https://talks.python-summit.ch/sps25/speaker/DCSZFT/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/9NWPB9/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/9NWPB9/", "attachments": []}, {"guid": "60b084a9-1f43-5d02-90e0-1b79903d6fbd", "code": "WDJ3WU", "id": 69307, "logo": null, "date": "2025-10-16T11:35:00+02:00", "start": "11:35", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-69307-why-you-as-a-python-developer-should-learn-rust", "url": "https://talks.python-summit.ch/sps25/talk/WDJ3WU/", "title": "Why you, as a Python developer, should learn Rust", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "Why should you, as a Python developer, learn Rust? In this talk, we will explore Rust's compelling answers to this question. Rust offers guaranteed type safety and memory safety without a garbage collector, \"fearless concurrency,\" and incredible performance. We will look into some of Rust's most distinctive features from a Python perspective, including its strict compiler, the ownership and borrowing system, null safety via Option, and explicit mutability. We will discover how Rust eliminates common runtime errors at compile time, and additionally, how understanding the concepts behind Rust's safety features can sharpen your Python skills, helping to write more robust and reliable code. By the end of the talk, you'll understand Rust's core value proposition and how its paradigms can benefit you, whether you are writing Python, Rust, or any other language.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "GNMEZA", "name": "Daniel Szoke", "avatar": "https://talks.python-summit.ch/media/avatars/GNMEZA_5WES3n4.JPG", "biography": "Hello! I am a software engineer working for Sentry in Vienna, Austria. I am the primary maintainer of [Sentry CLI](https://github.com/getsentry/sentry-cli) and I also help maintain the [Sentry Python SDK](https://github.com/getsentry/sentry-python).\r\n\r\nIn my free time, I enjoy skiing, hiking, swimming, running, bouldering, photography, traveling etc.\r\n\r\nI am originally from the US, and have been living in Austria since summer 2023. I speak four languages: English, Hungarian, German, and Spanish.", "public_name": "Daniel Szoke", "guid": "762f9f27-fc2d-5411-9364-0250f42b5ef7", "url": "https://talks.python-summit.ch/sps25/speaker/GNMEZA/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/WDJ3WU/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/WDJ3WU/", "attachments": []}, {"guid": "ebabda3b-4d13-545b-841b-2dd456eef31a", "code": "PA7988", "id": 72869, "logo": null, "date": "2025-10-16T13:30:00+02:00", "start": "13:30", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-72869-functional-python-saving-christmas-with-itertools-friends", "url": "https://talks.python-summit.ch/sps25/talk/PA7988/", "title": "Functional Python: Saving Christmas with itertools & friends", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "Are you writing nested loops when solving coding challenges? Discover how Python's functional programming toolbox can transform your problem-solving approach.\r\n\r\nWe'll explore functional programming principles through the lens of Advent of Code puzzles, learning to think in streams of data rather than step-by-step instructions. We\u2019ll explore some essential bits from `itertools`, `functools`, and `operator` modules, aiming to write more expressive, debuggable code.\r\n\r\nStarting with pure functions and lazy evaluation, we'll build up to solving real AoC problems using techniques like:\r\n\r\n- `itertools.pairwise()` for sequence comparisons\r\n- `functools.reduce()` for data aggregation \r\n- `operator.itemgetter()` for elegant sorting\r\n- Generator expressions for memory-efficient processing\r\n\r\nThrough some puzzles from various years, we\u2019ll see how functional approaches often lead to more concise solutions that closely mirror the problem description. We'll compare imperative vs functional solutions, highlighting pros and cons of both approaches.\r\n\r\nWhether you're preparing for coding interviews, tackling AoC, or just want to expand your Python toolkit, you'll leave with a couple more ideas for writing cleaner, more Pythonic code\u2014no external dependencies required.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "TP3ZGK", "name": "Edoardo Baldi", "avatar": "https://talks.python-summit.ch/media/avatars/TP3ZGK_4JZFrOH.jpeg", "biography": "I\u2019m a curious and analytical mind by nature. I\u2019m a physicist turned research software engineer who enjoys both coding and wandering in the mountains\u2014fortunately, I live in Switzerland. Outside work, I enjoy puzzles, retro tech, and meaningful conversations. I value exploration, both physical and intellectual.", "public_name": "Edoardo Baldi", "guid": "22070315-a01e-5751-aac2-5bd696de7855", "url": "https://talks.python-summit.ch/sps25/speaker/TP3ZGK/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/PA7988/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/PA7988/", "attachments": []}, {"guid": "d05124cd-057b-53ba-833d-584124e55c69", "code": "PBVN3P", "id": 73323, "logo": null, "date": "2025-10-16T14:00:00+02:00", "start": "14:00", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-73323-building-resilient-python-apps-for-unreliable-networks", "url": "https://talks.python-summit.ch/sps25/talk/PBVN3P/", "title": "Building Resilient Python Apps for Unreliable Networks", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "In many parts of the world, especially across Africa, software cannot assume a stable internet connection. From rural communities to field agents working in transit or enforcement, the reality is simple: offline is the default, and sync is a luxury.\r\n\r\nIn this talk, we\u2019ll explore how to build offline-first applications using Python \u2014 apps that work gracefully when the network doesn\u2019t. Drawing from real-world civic and infrastructure projects scenarios in Nigeria, I\u2019ll walk through techniques to queue, cache, and sync data locally, using tools like SQLite, Redis, Celery, and FastAPI. We\u2019ll explore design patterns that prevent data loss, improve user experience, and simplify reconciliation once connectivity is restored.\r\n\r\nWhether you\u2019re building field data tools, mobile dashboards, or lightweight IoT integrations, this session will equip you with the mindset and technical building blocks to ensure your Python applications stay resilient \u2014 no matter the network conditions.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "MPKCMH", "name": "Emeka Onyebuchi", "avatar": "https://talks.python-summit.ch/media/avatars/MPKCMH_TcHaqzD.png", "biography": "Emeka Onyebuchi is a Python backend and AI engineer with years of experience building high-impact systems for companies across the fintech, civic tech, and energy sectors. He has led the development of scalable APIs, data platforms, and infrastructure for projects ranging from payment gateways to smart grid applications, often working in challenging environments where network reliability cannot be taken for granted.", "public_name": "Emeka Onyebuchi", "guid": "3392ed02-170d-56aa-9d9f-47e665ec9395", "url": "https://talks.python-summit.ch/sps25/speaker/MPKCMH/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/PBVN3P/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/PBVN3P/", "attachments": []}, {"guid": "4279c46c-3f88-5198-a446-595d279a1f8f", "code": "7EKTCB", "id": 67217, "logo": null, "date": "2025-10-16T15:15:00+02:00", "start": "15:15", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-67217-software-estimation-false-sense-of-certainty", "url": "https://talks.python-summit.ch/sps25/talk/7EKTCB/", "title": "Software estimation: False sense of certainty", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "It has been known since the 70s that developers tend to give very optimistic estimations. \r\n\r\nWe prefer to have exact numbers, even if that means they are wrong most of the time. \r\n\r\nIn research, developers admitted that they believe their managers will see them as less competent if they provide estimates with huge margins. But mathematically speaking providing a wider min-max interval means you will be right more often.\r\n\r\nSp, maybe it isn\u2019t really accuracy that businesses and people are looking for. Maybe estimates are needed for the sole purpose of risk aversion. \r\n\r\nRisk can be measured in other ways.\r\n\r\nMaybe it is time we stop estimating tasks left and right and instead start managing the project\u2019s risk and customer\u2019s expectations.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "TYCFQS", "name": "Ines Panker", "avatar": "https://talks.python-summit.ch/media/avatars/TYCFQS_P5ncHVk.jpg", "biography": "I've been building software for almost 2 decades. \r\nI'm fascinated by elegant solutions to complex problems, finding simple, straightforward patterns in what at first glance appears to be unorganized chaos. \r\nAnd I love to observe the human aspect of software. People, human interactions and motivations are just as much integral to software development as the focus on solid architecture that is maintainable, scalable and efficient.", "public_name": "Ines Panker", "guid": "1d34cbae-5a9a-58bd-8ef6-86a4f47cbc39", "url": "https://talks.python-summit.ch/sps25/speaker/TYCFQS/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/7EKTCB/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/7EKTCB/", "attachments": []}, {"guid": "b7556887-9ad3-59b2-b6e5-8e61a751fc18", "code": "B7GRMJ", "id": 72698, "logo": null, "date": "2025-10-16T15:50:00+02:00", "start": "15:50", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-72698-using-python-s-array-api-standard-for-esa-s-euclid-mission", "url": "https://talks.python-summit.ch/sps25/talk/B7GRMJ/", "title": "Using Python's array API standard for ESA's Euclid mission", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Talk", "language": "en", "abstract": "Over the years, the lack of an array data type in Python has resulted in the creation of numerous array libraries, each specializing in unique niches but still having some interoperability between each other. NumPy has become the de facto array library of Python, and the other array libraries try to keep their API close to that of NumPy. However, this often becomes infeasible, and the libraries deviate out of necessity. To make Python's array libraries shake hands with each other without any inconsistencies, the Consortium for Python Data API Standards has formalised an Array API standard for libraries offering array creation and manipulation operations.\r\n\r\nThe Array API standard allows users to write and use the same code for arrays belonging to any of the standard-conforming libraries. Through this talk, we will explore the need for such standardisation and discuss its salient features in detail. We will primarily delve into the example of using this standard to make specific parts of European Space Agency's Euclid space mission's code GPU and autodiff compatible. Besides cosmology, we will also take a look at a few other examples, mostly sourced from my experience working with and on several Python array libraries for scientific computing. Ultimately, the audience can expect to leave the room with the knowledge of both, the software engineering and the research side of the array API standard.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "T8FLGG", "name": "Saransh Chopra", "avatar": "https://talks.python-summit.ch/media/avatars/T8FLGG_z3hAsoo.png", "biography": "Saransh is a \"generalist\" research software engineer at UCL\u2019s Advanced Research Computing Centre (at the time of writing this proposal), where he works on Python, HPC, DevOps, and Education projects. Before UCL, he was a research fellow at CERN working on computational physics software, and he will be joining EPFL as a graduate student this fall. Moreover, he develops and maintains several open-source scientific software, which he believes are the key to collaborative and reproducible research.", "public_name": "Saransh Chopra", "guid": "657b453c-4d81-5f24-afc4-4cc9c3b12edf", "url": "https://talks.python-summit.ch/sps25/speaker/T8FLGG/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/B7GRMJ/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/B7GRMJ/", "attachments": []}, {"guid": "615e53c9-4368-520d-a005-5f61743b06e0", "code": "EP7BNX", "id": 81335, "logo": null, "date": "2025-10-16T16:25:00+02:00", "start": "16:25", "duration": "00:45", "room": "Aula 4.101", "slug": "sps25-81335-lightning-talks-day-1", "url": "https://talks.python-summit.ch/sps25/talk/EP7BNX/", "title": "Lightning Talks - Day 1", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Lightning Talks", "language": "en", "abstract": "Our Lightning Talks are open to everyone \ud83d\ude0a\r\n\r\nHow it works:\r\n\u2013 You can register directly at the conference. First come, first served.\r\n\u2013 Any proposal is welcome, as long as your talk has something to do with Python and respects our [Code of Conduct](https://www.python-summit.ch/coc/). We reserve the right to reject talks.\r\n\u2013 Talk time is strictly limited to 5 minutes.\r\n\u2013 To keep turnaround times short, you will not be able to plug in your own device. We will provide a laptop with all slides. Please submit your slides as PDF via email at least 60 minutes before Lightning Talks start. \r\n\u2013 By registering, you accept that your talk may be recorded, published and streamed live (audio & video) under [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/deed.en).", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "398THE", "name": "Orga", "avatar": null, "biography": null, "public_name": "Orga", "guid": "50917e4d-298c-551c-a458-7cb1dd33aab8", "url": "https://talks.python-summit.ch/sps25/speaker/398THE/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/EP7BNX/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/EP7BNX/", "attachments": []}, {"guid": "7f9e779f-5f03-50d4-8c2d-7ce216b706e7", "code": "AZGSCP", "id": 81340, "logo": null, "date": "2025-10-16T17:10:00+02:00", "start": "17:10", "duration": "00:05", "room": "Aula 4.101", "slug": "sps25-81340-closing-day-1", "url": "https://talks.python-summit.ch/sps25/talk/AZGSCP/", "title": "Closing - Day 1", "subtitle": "", "track": "Day 1 - Python, the programming language you love", "type": "Opening/Closing", "language": "en", "abstract": "A thank you from the organisers. We hope you enjoyed your day!\r\n \r\n(It won't take long, we promise! After that long day, everyone is looking forward to the buffet!)", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "398THE", "name": "Orga", "avatar": null, "biography": null, "public_name": "Orga", "guid": "50917e4d-298c-551c-a458-7cb1dd33aab8", "url": "https://talks.python-summit.ch/sps25/speaker/398THE/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/AZGSCP/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/AZGSCP/", "attachments": []}]}}, {"index": 2, "date": "2025-10-17", "day_start": "2025-10-17T04:00:00+02:00", "day_end": "2025-10-18T03:59:00+02:00", "rooms": {"Aula 4.101": [{"guid": "e3bb014a-8bbe-5189-9f61-eb03eb17285f", "code": "D7KQWT", "id": 81338, "logo": null, "date": "2025-10-17T09:00:00+02:00", "start": "09:00", "duration": "00:05", "room": "Aula 4.101", "slug": "sps25-81338-welcome-day-2", "url": "https://talks.python-summit.ch/sps25/talk/D7KQWT/", "title": "Welcome - Day 2", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Opening/Closing", "language": "en", "abstract": "A welcome message and useful information from the organisers.\r\n\r\nYou will also find useful information on our website [www.python-summit.ch/venue](https://www.python-summit.ch/venue/). Or feel free to ask any member of staff if you have a question.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "398THE", "name": "Orga", "avatar": null, "biography": null, "public_name": "Orga", "guid": "50917e4d-298c-551c-a458-7cb1dd33aab8", "url": "https://talks.python-summit.ch/sps25/speaker/398THE/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/D7KQWT/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/D7KQWT/", "attachments": []}, {"guid": "6122e678-041a-5f5a-b3a2-2a12613c0411", "code": "EWUJKH", "id": 72088, "logo": null, "date": "2025-10-17T09:10:00+02:00", "start": "09:10", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-72088-machine-learning-for-swiss-democracy", "url": "https://talks.python-summit.ch/sps25/talk/EWUJKH/", "title": "Machine learning for Swiss democracy", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "Demokratis.ch is a non-profit project working to modernise the consultation procedure\u2014a key democratic process that allows Swiss citizens to provide feedback on proposed laws and amendments. Today, the process is slow and cumbersome for everyone involved: it requires studying lengthy PDFs, writing formal letters, and even synthesising legal arguments by copy-pasting into Excel. There\u2019s a huge opportunity to streamline this process and make this democratic tool more accessible and inclusive.\r\n\r\nIn this talk, I\u2019ll share how we\u2019re tackling this challenge with machine learning: building data processing pipelines, extracting features from endless PDFs, embedding and classifying text, designing and evaluating models\u2014and ultimately deploying them in production. Because the data comes from the federal administration and 26 different cantons, it\u2019s often heterogeneous and in varying formats. Data quality, in general, presents many challenges for both training and evaluation. Spoiler: PDF is a pretty terrible format for machines\u2026 \r\n\r\nOur approach is practical and pragmatic, and our code is open source, so you\u2019re welcome to explore our solutions or even contribute yourself!", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "3KNRFG", "name": "Vita Midori", "avatar": "https://talks.python-summit.ch/media/avatars/3KNRFG_pvEEWwI.jpg", "biography": "I led the development of a stock-trading platform for 8 years. Some bits of C++ and Cython aside, the platform was mainly a Python-based distributed system. Scaling and performance optimisation became not just a necessity but a passion for me. I've since returned to my freelance & consulting roots, and still enjoy helping clients with tough Python problems. Strangely, I've never studied computer science and often run away from all technology into the mountains, forests, and seas of our planet.", "public_name": "Vita Midori", "guid": "fde346fd-87aa-5d1f-89f4-0e1c3f32ef55", "url": "https://talks.python-summit.ch/sps25/speaker/3KNRFG/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/EWUJKH/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/EWUJKH/", "attachments": []}, {"guid": "a558a0ba-135a-533c-b8ba-c19c7b4f4462", "code": "NTGKGW", "id": 68685, "logo": null, "date": "2025-10-17T09:45:00+02:00", "start": "09:45", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-68685-ai-coding-agents-and-how-to-code-them", "url": "https://talks.python-summit.ch/sps25/talk/NTGKGW/", "title": "AI Coding Agents and how to code them", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "AI Agents are the next big thing everyone has been talking about. They are expected to revolutionize various industries by automating routine tasks, mission critical business workflows, enhancing productivity, and enabling humans to focus on creative and strategic work. Of course, you can apply them to your everyday coding tasks as well.\r\n\r\nIn this talk we\u2019ll go over what those agents can bring to the table of coding world, and why they can deliver the promise of coding smarter that the current generation of coding assistants can\u2019t. We will then dive right into a quick live coding session where I\u2019ll show what such agents can do in real life and how you can start using them to enhance your everyday life already right after the talk. And we\u2019ll finish off with some remarks on what the future of programming might look like in the near future as those agents get included into your everyday life.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "USVVEX", "name": "Alex Shershebnev", "avatar": "https://talks.python-summit.ch/media/avatars/USVVEX_IiBAEmE.png", "biography": "Alex Shershebnev is a seasoned Computer Vision and MLOps Engineer with over ten years of experience shaping the future of AI-driven software development. Currently, Alex leads the ML/DevOps team at Zencoder, where he leverages his extensive background in Software Engineering, ML and DevOps to deliver high-quality machine learning solutions. His work spans complex data pipelines, cloud infrastructure management (GCP, Kubernetes), and advanced ML/DevOps pipelines.", "public_name": "Alex Shershebnev", "guid": "43b59c4b-c3c5-51b8-bb4d-db25d86c38d6", "url": "https://talks.python-summit.ch/sps25/speaker/USVVEX/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/NTGKGW/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/NTGKGW/", "attachments": []}, {"guid": "4886d944-dc5c-5828-97fb-4d226fcf7caf", "code": "MNJ98W", "id": 73430, "logo": null, "date": "2025-10-17T11:00:00+02:00", "start": "11:00", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-73430-causal-ml-for-smarter-advertising-campaigns-with-python", "url": "https://talks.python-summit.ch/sps25/talk/MNJ98W/", "title": "Causal ML for Smarter Advertising Campaigns with Python", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "Traditionally, **marketing campaign analysis** relies on simple metrics like the number of purchases made after a contact, or conversions following a promotion. While these numbers tell us what happened, they don\u2019t reveal **why it happened** or if the campaign truly made a difference.\r\n\r\nSuch analysis can\u2019t distinguish between customers who would have acted anyway and those who were genuinely influenced by the campaign. **The key question is: did the campaign actually cause the desired effect?**\r\n\r\nIn this **practical** and **beginner-friendly** session, we\u2019ll explore how **Causal Machine Learning** provides the missing piece in campaign evaluation and targeting.\r\n\r\nStarting from real-world scenarios, we\u2019ll dive into:\r\n\r\n- **Why causality matters** more than correlation when evaluating ad performance.\r\n- How to estimate the true impact of a campaign using **uplift modeling** and treatment effect estimation in just a few lines of code.\r\n- How to target users who are not just likely to interact with ads, but whose behavior can be influenced by the campaign (for example, to reduce churn or boost engagement).\r\n\r\nThe session will be hands-on with Python, with clear examples drawn from marketing applications.\r\n\r\n**Take-away:**\r\nParticipants will gain a practical understanding of how to think causally in digital marketing, learning key techniques to measure impact and target campaigns more intelligently. moving from predictive to truly prescriptive analytics.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "PLHMEQ", "name": "Francesco Conti", "avatar": "https://talks.python-summit.ch/media/avatars/PLHMEQ_x3euLLb.jpg", "biography": "I\u2019m a Telecommunications Engineer who grew up immersed in Fourier transforms (aka Francesco in Fourier-Land). Thanks to Fourier analysis, I learnt that things can look completely different when seen from another perspective. I\u2019m particularly drawn to niche and often overlooked topics, and I like to spend my time where I can truly make a meaningful impact.\r\n\r\nI currently work as a Data Scientist at AgileLab, an amazing company that has given me the chance to work on fascinating projects.", "public_name": "Francesco Conti", "guid": "c52cf8cd-0523-52bd-a726-c34c271b1e7e", "url": "https://talks.python-summit.ch/sps25/speaker/PLHMEQ/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/MNJ98W/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/MNJ98W/", "attachments": []}, {"guid": "81c802bf-3c3b-5e1a-9b93-102466e7fd5c", "code": "QJLGCZ", "id": 67710, "logo": null, "date": "2025-10-17T11:35:00+02:00", "start": "11:35", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-67710-docling-get-your-documents-ready-for-generative-ai", "url": "https://talks.python-summit.ch/sps25/talk/QJLGCZ/", "title": "Docling: Get your documents ready for generative AI", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "Docling is an open-source Python package that simplifies document processing by parsing diverse formats \u2014 including advanced PDF understanding \u2014 and integrating seamlessly with the generative AI ecosystem. It supports a wide range of input types such as PDFs, DOCX, XLSX, HTML, and images, offering rich parsing capabilities including reading order, table structure, code, and formulas. Docling provides a unified and expressive DoclingDocument format, enabling easy export to Markdown, HTML, and lossless JSON. It offers plug-and-play integrations with popular frameworks like LangChain, LlamaIndex, Crew AI, and Haystack, along with strong local execution support for sensitive data and air-gapped environments. As a Python package, Docling is pip-installable and comes with a clean, intuitive API for both programmatic and CLI-based workflows, making it easy to embed into any data pipeline or AI stack. Its modular design also supports extension and customization for enterprise use cases.\r\n\r\nWe also introduce SmolDocling, an ultra-compact 256M parameter vision-language model for end-to-end document conversion. SmolDocling generates a novel markup format called DocTags that captures the full content, structure, and spatial layout of a page, and offers accurate reproduction of document features such as tables, equations, charts, and code across a wide variety of formats \u2014 all while matching the performance of models up to 27\u00d7 larger.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "L3QTWM", "name": "Peter Staar", "avatar": "https://talks.python-summit.ch/media/avatars/L3QTWM_8ejHPZU.png", "biography": "Currently, Peter manages the 'AI for Knowledge' group at the IBM Research - Zurich Laboratory. The group focusses on the development of Docling. \r\n\r\nPeter joined the IBM Research - Zurich Laboratory in July of 2014 as a post-doctoral researcher. The Belgium-born scientist first came to IBM Research as a summer student in 2006.\r\n\r\nPrior to joining IBM", "public_name": "Peter Staar", "guid": "4c12e23f-939a-5a80-be77-0da04006ed9c", "url": "https://talks.python-summit.ch/sps25/speaker/L3QTWM/"}, {"code": "YRFJ3P", "name": "Michele Dolfi", "avatar": null, "biography": null, "public_name": "Michele Dolfi", "guid": "3911a7d0-9ce5-59f4-a9d2-5eed2100eb06", "url": "https://talks.python-summit.ch/sps25/speaker/YRFJ3P/"}, {"code": "E9UEXW", "name": "Panos Vagenas", "avatar": "https://talks.python-summit.ch/media/avatars/E9UEXW_AmLl9jE.jpeg", "biography": "Panos Vagenas is an Advisory Engineer at IBM Research, leading development efforts at the intersection of Artificial Intelligence, Information Retrieval, and Data Management.", "public_name": "Panos Vagenas", "guid": "6238629c-aba5-507e-9ba9-2262e33b5e0b", "url": "https://talks.python-summit.ch/sps25/speaker/E9UEXW/"}, {"code": "EXQJ98", "name": "Nikos Livathinos", "avatar": "https://talks.python-summit.ch/media/avatars/EXQJ98_zDk5YUh.JPG", "biography": "Nikos Livathinos is a Senior Software Engineer at IBM Research, leading research and development initiatives in Computer Vision, Software Architecture, and efficient software systems.\r\n\r\nWith over 15 years of experience in software design and development, Nikos has worked extensively across the domains of Artificial Intelligence, Big Data, and Analytics.\r\n\r\nNikos holds 2 Master\u2019s degrees in Computer Science and works at the intersection of applied research and practical engineering execution.", "public_name": "Nikos Livathinos", "guid": "4cb8115d-9c7d-55d6-889a-edaac14f999c", "url": "https://talks.python-summit.ch/sps25/speaker/EXQJ98/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/QJLGCZ/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/QJLGCZ/", "attachments": []}, {"guid": "a8b11f6a-c97d-571e-9a1b-0795c8938c75", "code": "QNWFTD", "id": 67615, "logo": null, "date": "2025-10-17T13:30:00+02:00", "start": "13:30", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-67615-agentic-cyber-defense-with-external-threat-intelligence", "url": "https://talks.python-summit.ch/sps25/talk/QNWFTD/", "title": "Agentic Cyber Defense with External Threat Intelligence", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "This talk will detail how to integrate external threat intelligence data into an autonomous agentic AI system for proactive cybersecurity. Using real world datasets\u2014including open-source threat feeds, security logs, or OSINT\u2014you will learn how to build a data ingestion pipeline, train models with Python, and deploy agents that autonomously detect and mitigate cyber threats. This case study will provide practical insights into data preprocessing, feature engineering, and the challenges of adversarial conditions.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "YEK3EY", "name": "Jyoti Yadav", "avatar": "https://talks.python-summit.ch/media/avatars/YEK3EY_KMdLsJk.jpg", "biography": "Jyoti Yadav is a Cyber Security Data Scientist at Microsoft with extensive experience in data science, machine learning, and cybersecurity. Having worked at companies like Blockchain.com, EXL, and Lucidian, she has built advanced models for fraud detection, market forecasting, and security risk assessments. She specializes in predictive modeling, machine learning, anomaly detection, Agentic AI, and Large Language Models (LLM). Passionate about driving impactful results.", "public_name": "Jyoti Yadav", "guid": "306e1b09-ff4b-506c-8445-44b7ca201539", "url": "https://talks.python-summit.ch/sps25/speaker/YEK3EY/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/QNWFTD/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/QNWFTD/", "attachments": []}, {"guid": "2e83d71d-d424-56b3-b12c-a0f55f93818a", "code": "EWMBRM", "id": 69348, "logo": null, "date": "2025-10-17T14:05:00+02:00", "start": "14:05", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-69348-anonymization-of-sensitive-information-in-financial-document", "url": "https://talks.python-summit.ch/sps25/talk/EWMBRM/", "title": "Anonymization of sensitive information in financial document", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "Data is the fossil fuel of the machine learning world, essential for developing high quality models but in limited supply. Yet institutions handling sensitive documents \u2014 such as financial, medical, or legal records often cannot fully leverage their own data due to stringent privacy, compliance, and security requirements, making training high quality models difficult.\r\n\r\nA promising solution is to replace the personally identifiable information (PII) with realistic synthetic stand-ins, whilst leaving the rest of the document in tact.\r\n\r\nIn this talk, we will discuss the use of open source tools and models that can be self hosted to anonymize documents. We will go over the various approaches for Named Entity Recognition (NER) to identify sensitive entities and the use of diffusion models to inpaint anonymized content.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "WAL3T3", "name": "Piotr Gryko", "avatar": "https://talks.python-summit.ch/media/avatars/WAL3T3_uN0q5dq.jpg", "biography": "Dr Piotr Gryko, studied experimental physics at University College London. His PhD at Imperial College London focused on using biomaterials to self assemble inorganic materials, merging the boundaries of biological systems and machines.\r\n\r\nWith 12 years of experience writing software, he now focuses on AI engineering.", "public_name": "Piotr Gryko", "guid": "60432d95-e443-5d9b-b1e1-a9e43ee7112e", "url": "https://talks.python-summit.ch/sps25/speaker/WAL3T3/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/EWMBRM/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/EWMBRM/", "attachments": []}, {"guid": "629432c8-197b-5e91-a76d-475538ad02b3", "code": "PNL9LP", "id": 82880, "logo": null, "date": "2025-10-17T15:15:00+02:00", "start": "15:15", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-82880-gompertz-linear-units-golu", "url": "https://talks.python-summit.ch/sps25/talk/PNL9LP/", "title": "Gompertz Linear Units (GoLU)", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "Activation functions are fundamental elements of deep learning architectures as they significantly influence training dynamics. ReLU, while widely used, is prone to the dying neuron problem, which has been mitigated by variants such as LeakyReLU, PReLU, and ELU that better handle negative neuron outputs. Recently, self-gated activations like GELU and Swish have emerged as state-of-the-art alternatives, leveraging their smoothness to ensure stable gradient flow and prevent neuron inactivity.\r\n\r\nIn this work, we introduce the Gompertz Linear Unit (GoLU), a novel self-gated activation function defined as `GoLU(x) = x Gompertz(x)`, where `Gompertz(x) = exp(\u2212exp(\u2212x))`. The GoLU activation leverages the asymmetry in the Gompertz function to reduce variance in the latent space more effectively compared to GELU and Swish, while preserving robust gradient flow. Extensive experiments across diverse tasks, including Image Classification, Language Modeling, Semantic Segmentation, Object Detection, Instance Segmentation, and Diffusion, highlight GoLU's superior performance relative to state-of-the-art activation functions, establishing GoLU as a robust alternative to existing activation functions.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "7K3P3C", "name": "Das\tIndrashis", "avatar": "https://talks.python-summit.ch/media/avatars/7K3P3C_1DokLAj.jpg", "biography": "Hello! I'm Indrashis Das from India. I'm a Machine Learning Engineer at AICONIX in Freiburg, Germany. I hold a Master's in Computer Science (AI specialization) from the University of Freiburg, where I also served as a Teaching Assistant in Prof. Frank Hutter's ML lab for 2.5 years and worked on GoLU as my Master's Thesis.", "public_name": "Das\tIndrashis", "guid": "fccea3c8-9551-59ab-aa3d-7393df3e15c4", "url": "https://talks.python-summit.ch/sps25/speaker/7K3P3C/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/PNL9LP/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/PNL9LP/", "attachments": []}, {"guid": "c33ce1d0-ca40-5d9b-a993-bb6ab0f49663", "code": "GZHTJX", "id": 82710, "logo": null, "date": "2025-10-17T15:50:00+02:00", "start": "15:50", "duration": "00:30", "room": "Aula 4.101", "slug": "sps25-82710-what-networks-tell-us-about-trades-power-and-the-world", "url": "https://talks.python-summit.ch/sps25/talk/GZHTJX/", "title": "What Networks tell us about Trades, Power, and the World?", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Talk", "language": "en", "abstract": "Networks are all around us, shaping phenomena like epidemics, communication, and transportation. In this talk, we will explore how real-world problems can be analyzed and solved using graph-based methods and simple algorithms. Drawing from examples such as trade networks, corporate structures, and historical data, I will demonstrate how network analysis reveals insights that would otherwise remain hidden. Using NetworKit (and NetworkX), we will analyze real-world datasets to answer questions like:\r\n\r\n1. What does the core-periphery model reveal about trade networks?\r\n2. Could we have predicted that Moscow will become Russia's capital?\r\n3. How do corporate hierarchies differ from interaction hierarchies within organizations?\r\n\r\nThroughout the talk, I will introduce key concepts in network analysis and showcase Python as a tool for research. Attendees will have access to all datasets and code, enabling them to replicate the analyses and apply these techniques to their own projects. This session is designed for Python enthusiasts with an interest in data science, networks, and/or applied research.", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "ACG8DX", "name": "Kshitijaa Jaglan", "avatar": "https://talks.python-summit.ch/media/avatars/ACG8DX_1TgR01L.png", "biography": "I'm Kshitijaa Jaglan, and I like using AI, Machine Learning and Networks to make complex systems (and the web) a little more optimized, fast and understandable! Currently I am transitioning from my research position at the Social Computing Group, University of Zurich, towards more applied and technical roles in industry.", "public_name": "Kshitijaa Jaglan", "guid": "e11e265b-1d4d-5105-a34c-ead150aa8d20", "url": "https://talks.python-summit.ch/sps25/speaker/ACG8DX/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/GZHTJX/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/GZHTJX/", "attachments": []}, {"guid": "88ced87f-c3c5-57bd-a614-5741f1357def", "code": "VG8HT8", "id": 81336, "logo": null, "date": "2025-10-17T16:25:00+02:00", "start": "16:25", "duration": "00:45", "room": "Aula 4.101", "slug": "sps25-81336-lightning-talks-day-2", "url": "https://talks.python-summit.ch/sps25/talk/VG8HT8/", "title": "Lightning Talks - Day 2", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Lightning Talks", "language": "en", "abstract": "Our Lightning Talks are open to everyone \ud83d\ude0a\r\n\r\nHow it works:\r\n\u2013 You can register directly at the conference. First come, first served.\r\n\u2013 Any proposal is welcome, as long as your talk has something to do with Python and respects our [Code of Conduct](https://www.python-summit.ch/coc/). We reserve the right to reject talks.\r\n\u2013 Talk time is strictly limited to 5 minutes.\r\n\u2013 To keep turnaround times short, you will not be able to plug in your own device. We will provide a laptop with all slides. Please submit your slides as PDF via email at least 60 minutes before Lightning Talks start. \r\n\u2013 By registering, you accept that your talk may be recorded, published and streamed live (audio & video) under [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/deed.en).", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "398THE", "name": "Orga", "avatar": null, "biography": null, "public_name": "Orga", "guid": "50917e4d-298c-551c-a458-7cb1dd33aab8", "url": "https://talks.python-summit.ch/sps25/speaker/398THE/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/VG8HT8/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/VG8HT8/", "attachments": []}, {"guid": "c4440c0a-e1e3-5edd-b478-ff8fdf38de93", "code": "QW7U3F", "id": 81339, "logo": null, "date": "2025-10-17T17:10:00+02:00", "start": "17:10", "duration": "00:05", "room": "Aula 4.101", "slug": "sps25-81339-closing-day-2", "url": "https://talks.python-summit.ch/sps25/talk/QW7U3F/", "title": "Closing - Day 2", "subtitle": "", "track": "Day 2 - Data Science & More", "type": "Opening/Closing", "language": "en", "abstract": "A thank you from the organisers. We hope you enjoyed your day!\r\n \r\n(It won't take long, we promise! After that long day, everyone is looking forward to the buffet!)", "description": null, "recording_license": "", "do_not_record": false, "persons": [{"code": "398THE", "name": "Orga", "avatar": null, "biography": null, "public_name": "Orga", "guid": "50917e4d-298c-551c-a458-7cb1dd33aab8", "url": "https://talks.python-summit.ch/sps25/speaker/398THE/"}], "links": [], "feedback_url": "https://talks.python-summit.ch/sps25/talk/QW7U3F/feedback/", "origin_url": "https://talks.python-summit.ch/sps25/talk/QW7U3F/", "attachments": []}]}}]}}} \ No newline at end of file diff --git a/scripts/recordings/sps25/talks.csv b/scripts/recordings/sps25/talks.csv new file mode 100644 index 0000000..10244f8 --- /dev/null +++ b/scripts/recordings/sps25/talks.csv @@ -0,0 +1,525 @@ +,day,talk_idx,date,title,type,names_raw,biographies_raw,abstract,names_combined,named_title,video_title,filename,video_url,biographies_combined,date_str,video_text +0,1,0,2025-10-16T09:00:00+02:00,Welcome - Day 1,Opening/Closing,"('Orga',)","('',)","A welcome message and useful information from the organisers. + +You will also find useful information on our website [www.python-summit.ch/venue](https://www.python-summit.ch/venue/). Or feel free to ask any member of staff if you have a question.",Orga,Orga - Welcome - Day 1,Orga - Welcome - Day 1 - SPS25,sps25_1-00_orga_-_welcome_-_day_1,,,2025-10-16T09:00:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +A welcome message and useful information from the organisers. + +You will also find useful information on our website [www.python-summit.ch/venue](https://www.python-summit.ch/venue/). Or feel free to ask any member of staff if you have a question. + +--------------------- +About the speaker(s): + + +" +1,1,1,2025-10-16T09:10:00+02:00,When Close Enough is Good Enough,Talk,"('Tim Head',)","(""I am a maintainer of the scikit-learn machine-learning library. In the past I've worked on building and running mybinder.org and JupyterHub.\r\n\r\nI am employed by NVIDIA."",)","Sometimes getting an approximate answer is super good enough. How do you check for duplicates, count unique users, or track item popularity when your dataset won’t fit in memory? Enter probabilistic data structures like Bloom filters, Count-Min Sketches, and HyperLogLog! This talk introduces these powerful tools, demonstrates simple implementations in Python, and gives you ideas on when to use them. + +Walk away ready to apply these techniques in your own projects - no advanced math required.",Tim Head,Tim Head - When Close Enough is Good Enough,Tim Head - When Close Enough is Good Enough - SPS25,sps25_1-01_tim_head_-_when_close_enough_is_good_enough,,"I am a maintainer of the scikit-learn machine-learning library. In the past I've worked on building and running mybinder.org and JupyterHub. + +I am employed by NVIDIA.",2025-10-16T09:10:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Sometimes getting an approximate answer is super good enough. How do you check for duplicates, count unique users, or track item popularity when your dataset won’t fit in memory? Enter probabilistic data structures like Bloom filters, Count-Min Sketches, and HyperLogLog! This talk introduces these powerful tools, demonstrates simple implementations in Python, and gives you ideas on when to use them. + +Walk away ready to apply these techniques in your own projects - no advanced math required. + +--------------------- +About the speaker(s): + +I am a maintainer of the scikit-learn machine-learning library. In the past I've worked on building and running mybinder.org and JupyterHub. + +I am employed by NVIDIA. +" +2,1,2,2025-10-16T09:45:00+02:00,Code review in era of collaborative development,Talk,"('Andrii Soldatenko',)","('My name is Andrii Soldatenko. I am a sr. software engineer originally from Ukraine 🇺🇦, and I am currently living in Austria 🇦🇹. Public speaker (KCD, FOSDEM, GoDays, PyCons) and OSS contributor (Apache Airflow, Golang, OpenAPI, docker). I am a big fan of debuggers, Neovim, Rust.',)","Code review is a central part of everyday developer jobs. The motivation to create this talk was a quote: +“The most important superpower of a developer is complaining about everybody else's code.” In this talk, I’ll explain my approach to better code review. + +Sometimes, it’s hard to convince a colleague about change or don’t change some lines of code. In my talk I would like to cover some best practices from my software engineering experience about efficient and honest code review. How to create a culture of perfect code review. How to apply automatic tools to improve code review routine of repetitive comments or suggestions. How to write/or reuse coding style guides for your team to reduce the time spent arguing about naming conventions and different styles. +What needs to be automated and what needs to be not automated during code review? The key role of patterns that can be reusable is not to confuse colleagues.",Andrii Soldatenko,Andrii Soldatenko - Code review in era of collaborative development,Andrii Soldatenko - Code review in era of collaborative development - SPS25,sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev,,"My name is Andrii Soldatenko. I am a sr. software engineer originally from Ukraine 🇺🇦, and I am currently living in Austria 🇦🇹. Public speaker (KCD, FOSDEM, GoDays, PyCons) and OSS contributor (Apache Airflow, Golang, OpenAPI, docker). I am a big fan of debuggers, Neovim, Rust.",2025-10-16T09:45:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Code review is a central part of everyday developer jobs. The motivation to create this talk was a quote: +“The most important superpower of a developer is complaining about everybody else's code.” In this talk, I’ll explain my approach to better code review. + +Sometimes, it’s hard to convince a colleague about change or don’t change some lines of code. In my talk I would like to cover some best practices from my software engineering experience about efficient and honest code review. How to create a culture of perfect code review. How to apply automatic tools to improve code review routine of repetitive comments or suggestions. How to write/or reuse coding style guides for your team to reduce the time spent arguing about naming conventions and different styles. +What needs to be automated and what needs to be not automated during code review? The key role of patterns that can be reusable is not to confuse colleagues. + +--------------------- +About the speaker(s): + +My name is Andrii Soldatenko. I am a sr. software engineer originally from Ukraine 🇺🇦, and I am currently living in Austria 🇦🇹. Public speaker (KCD, FOSDEM, GoDays, PyCons) and OSS contributor (Apache Airflow, Golang, OpenAPI, docker). I am a big fan of debuggers, Neovim, Rust. +" +3,1,3,2025-10-16T11:00:00+02:00,Bytecode and .pyc files,Talk,"('Konrad Gawda',)","('Python, Linux and Open Source proponent. Cloud Evangelist, Python trainer and programmer. Reportedly seen at Warsaw Python meetups since the first PyWaw meeting ever. Recognized as an Inland Sailor by the Polish Sailing Association and as an inventor by the US Patent Office.',)","Bytecode, the internal language of instructions used by the interpreter is something that perhaps most Python developers have heard about, but few have dug into. This talk will try to explain the idea behind bytecode and how it works. +We will see how to extract bytecode from functions - with `dis` module, and from `.pyc` files (and what is the idea of `__pycache__` directories). Then, the other way around: we’ll check the possibility of building new functions with raw bytes in runtime.",Konrad Gawda,Konrad Gawda - Bytecode and .pyc files,Konrad Gawda - Bytecode and .pyc files - SPS25,sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files,,"Python, Linux and Open Source proponent. Cloud Evangelist, Python trainer and programmer. Reportedly seen at Warsaw Python meetups since the first PyWaw meeting ever. Recognized as an Inland Sailor by the Polish Sailing Association and as an inventor by the US Patent Office.",2025-10-16T11:00:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Bytecode, the internal language of instructions used by the interpreter is something that perhaps most Python developers have heard about, but few have dug into. This talk will try to explain the idea behind bytecode and how it works. +We will see how to extract bytecode from functions - with `dis` module, and from `.pyc` files (and what is the idea of `__pycache__` directories). Then, the other way around: we’ll check the possibility of building new functions with raw bytes in runtime. + +--------------------- +About the speaker(s): + +Python, Linux and Open Source proponent. Cloud Evangelist, Python trainer and programmer. Reportedly seen at Warsaw Python meetups since the first PyWaw meeting ever. Recognized as an Inland Sailor by the Polish Sailing Association and as an inventor by the US Patent Office. +" +4,1,4,2025-10-16T11:35:00+02:00,"Why you, as a Python developer, should learn Rust",Talk,"('Daniel Szoke',)","('Hello! I am a software engineer working for Sentry in Vienna, Austria. I am the primary maintainer of [Sentry CLI](https://github.com/getsentry/sentry-cli) and I also help maintain the [Sentry Python SDK](https://github.com/getsentry/sentry-python).\r\n\r\nIn my free time, I enjoy skiing, hiking, swimming, running, bouldering, photography, traveling etc.\r\n\r\nI am originally from the US, and have been living in Austria since summer 2023. I speak four languages: English, Hungarian, German, and Spanish.',)","Why should you, as a Python developer, learn Rust? In this talk, we will explore Rust's compelling answers to this question. Rust offers guaranteed type safety and memory safety without a garbage collector, ""fearless concurrency,"" and incredible performance. We will look into some of Rust's most distinctive features from a Python perspective, including its strict compiler, the ownership and borrowing system, null safety via Option, and explicit mutability. We will discover how Rust eliminates common runtime errors at compile time, and additionally, how understanding the concepts behind Rust's safety features can sharpen your Python skills, helping to write more robust and reliable code. By the end of the talk, you'll understand Rust's core value proposition and how its paradigms can benefit you, whether you are writing Python, Rust, or any other language.",Daniel Szoke,"Daniel Szoke - Why you, as a Python developer, should learn Rust","Daniel Szoke - Why you, as a Python developer, should learn Rust - SPS25",sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r,,"Hello! I am a software engineer working for Sentry in Vienna, Austria. I am the primary maintainer of [Sentry CLI](https://github.com/getsentry/sentry-cli) and I also help maintain the [Sentry Python SDK](https://github.com/getsentry/sentry-python). + +In my free time, I enjoy skiing, hiking, swimming, running, bouldering, photography, traveling etc. + +I am originally from the US, and have been living in Austria since summer 2023. I speak four languages: English, Hungarian, German, and Spanish.",2025-10-16T11:35:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Why should you, as a Python developer, learn Rust? In this talk, we will explore Rust's compelling answers to this question. Rust offers guaranteed type safety and memory safety without a garbage collector, ""fearless concurrency,"" and incredible performance. We will look into some of Rust's most distinctive features from a Python perspective, including its strict compiler, the ownership and borrowing system, null safety via Option, and explicit mutability. We will discover how Rust eliminates common runtime errors at compile time, and additionally, how understanding the concepts behind Rust's safety features can sharpen your Python skills, helping to write more robust and reliable code. By the end of the talk, you'll understand Rust's core value proposition and how its paradigms can benefit you, whether you are writing Python, Rust, or any other language. + +--------------------- +About the speaker(s): + +Hello! I am a software engineer working for Sentry in Vienna, Austria. I am the primary maintainer of [Sentry CLI](https://github.com/getsentry/sentry-cli) and I also help maintain the [Sentry Python SDK](https://github.com/getsentry/sentry-python). + +In my free time, I enjoy skiing, hiking, swimming, running, bouldering, photography, traveling etc. + +I am originally from the US, and have been living in Austria since summer 2023. I speak four languages: English, Hungarian, German, and Spanish. +" +5,1,5,2025-10-16T13:30:00+02:00,Functional Python: Saving Christmas with itertools & friends,Talk,"('Edoardo Baldi',)","('I’m a curious and analytical mind by nature. I’m a physicist turned research software engineer who enjoys both coding and wandering in the mountains—fortunately, I live in Switzerland. Outside work, I enjoy puzzles, retro tech, and meaningful conversations. I value exploration, both physical and intellectual.',)","Are you writing nested loops when solving coding challenges? Discover how Python's functional programming toolbox can transform your problem-solving approach. + +We'll explore functional programming principles through the lens of Advent of Code puzzles, learning to think in streams of data rather than step-by-step instructions. We’ll explore some essential bits from `itertools`, `functools`, and `operator` modules, aiming to write more expressive, debuggable code. + +Starting with pure functions and lazy evaluation, we'll build up to solving real AoC problems using techniques like: + +- `itertools.pairwise()` for sequence comparisons +- `functools.reduce()` for data aggregation +- `operator.itemgetter()` for elegant sorting +- Generator expressions for memory-efficient processing + +Through some puzzles from various years, we’ll see how functional approaches often lead to more concise solutions that closely mirror the problem description. We'll compare imperative vs functional solutions, highlighting pros and cons of both approaches. + +Whether you're preparing for coding interviews, tackling AoC, or just want to expand your Python toolkit, you'll leave with a couple more ideas for writing cleaner, more Pythonic code—no external dependencies required.",Edoardo Baldi,Edoardo Baldi - Functional Python: Saving Christmas with itertools & friends,Edoardo Baldi - Functional Python: Saving Christmas with itertools & friends - SPS25,sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite,,"I’m a curious and analytical mind by nature. I’m a physicist turned research software engineer who enjoys both coding and wandering in the mountains—fortunately, I live in Switzerland. Outside work, I enjoy puzzles, retro tech, and meaningful conversations. I value exploration, both physical and intellectual.",2025-10-16T13:30:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Are you writing nested loops when solving coding challenges? Discover how Python's functional programming toolbox can transform your problem-solving approach. + +We'll explore functional programming principles through the lens of Advent of Code puzzles, learning to think in streams of data rather than step-by-step instructions. We’ll explore some essential bits from `itertools`, `functools`, and `operator` modules, aiming to write more expressive, debuggable code. + +Starting with pure functions and lazy evaluation, we'll build up to solving real AoC problems using techniques like: + +- `itertools.pairwise()` for sequence comparisons +- `functools.reduce()` for data aggregation +- `operator.itemgetter()` for elegant sorting +- Generator expressions for memory-efficient processing + +Through some puzzles from various years, we’ll see how functional approaches often lead to more concise solutions that closely mirror the problem description. We'll compare imperative vs functional solutions, highlighting pros and cons of both approaches. + +Whether you're preparing for coding interviews, tackling AoC, or just want to expand your Python toolkit, you'll leave with a couple more ideas for writing cleaner, more Pythonic code—no external dependencies required. + +--------------------- +About the speaker(s): + +I’m a curious and analytical mind by nature. I’m a physicist turned research software engineer who enjoys both coding and wandering in the mountains—fortunately, I live in Switzerland. Outside work, I enjoy puzzles, retro tech, and meaningful conversations. I value exploration, both physical and intellectual. +" +6,1,6,2025-10-16T14:00:00+02:00,Building Resilient Python Apps for Unreliable Networks,Talk,"('Emeka Onyebuchi',)","('Emeka Onyebuchi is a Python backend and AI engineer with years of experience building high-impact systems for companies across the fintech, civic tech, and energy sectors. He has led the development of scalable APIs, data platforms, and infrastructure for projects ranging from payment gateways to smart grid applications, often working in challenging environments where network reliability cannot be taken for granted.',)","In many parts of the world, especially across Africa, software cannot assume a stable internet connection. From rural communities to field agents working in transit or enforcement, the reality is simple: offline is the default, and sync is a luxury. + +In this talk, we’ll explore how to build offline-first applications using Python — apps that work gracefully when the network doesn’t. Drawing from real-world civic and infrastructure projects scenarios in Nigeria, I’ll walk through techniques to queue, cache, and sync data locally, using tools like SQLite, Redis, Celery, and FastAPI. We’ll explore design patterns that prevent data loss, improve user experience, and simplify reconciliation once connectivity is restored. + +Whether you’re building field data tools, mobile dashboards, or lightweight IoT integrations, this session will equip you with the mindset and technical building blocks to ensure your Python applications stay resilient — no matter the network conditions.",Emeka Onyebuchi,Emeka Onyebuchi - Building Resilient Python Apps for Unreliable Networks,Emeka Onyebuchi - Building Resilient Python Apps for Unreliable Networks - SPS25,sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli,,"Emeka Onyebuchi is a Python backend and AI engineer with years of experience building high-impact systems for companies across the fintech, civic tech, and energy sectors. He has led the development of scalable APIs, data platforms, and infrastructure for projects ranging from payment gateways to smart grid applications, often working in challenging environments where network reliability cannot be taken for granted.",2025-10-16T14:00:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +In many parts of the world, especially across Africa, software cannot assume a stable internet connection. From rural communities to field agents working in transit or enforcement, the reality is simple: offline is the default, and sync is a luxury. + +In this talk, we’ll explore how to build offline-first applications using Python — apps that work gracefully when the network doesn’t. Drawing from real-world civic and infrastructure projects scenarios in Nigeria, I’ll walk through techniques to queue, cache, and sync data locally, using tools like SQLite, Redis, Celery, and FastAPI. We’ll explore design patterns that prevent data loss, improve user experience, and simplify reconciliation once connectivity is restored. + +Whether you’re building field data tools, mobile dashboards, or lightweight IoT integrations, this session will equip you with the mindset and technical building blocks to ensure your Python applications stay resilient — no matter the network conditions. + +--------------------- +About the speaker(s): + +Emeka Onyebuchi is a Python backend and AI engineer with years of experience building high-impact systems for companies across the fintech, civic tech, and energy sectors. He has led the development of scalable APIs, data platforms, and infrastructure for projects ranging from payment gateways to smart grid applications, often working in challenging environments where network reliability cannot be taken for granted. +" +7,1,7,2025-10-16T15:15:00+02:00,Software estimation: False sense of certainty,Talk,"('Ines Panker',)","(""I've been building software for almost 2 decades. \r\nI'm fascinated by elegant solutions to complex problems, finding simple, straightforward patterns in what at first glance appears to be unorganized chaos. \r\nAnd I love to observe the human aspect of software. People, human interactions and motivations are just as much integral to software development as the focus on solid architecture that is maintainable, scalable and efficient."",)","It has been known since the 70s that developers tend to give very optimistic estimations. + +We prefer to have exact numbers, even if that means they are wrong most of the time. + +In research, developers admitted that they believe their managers will see them as less competent if they provide estimates with huge margins. But mathematically speaking providing a wider min-max interval means you will be right more often. + +Sp, maybe it isn’t really accuracy that businesses and people are looking for. Maybe estimates are needed for the sole purpose of risk aversion. + +Risk can be measured in other ways. + +Maybe it is time we stop estimating tasks left and right and instead start managing the project’s risk and customer’s expectations.",Ines Panker,Ines Panker - Software estimation: False sense of certainty,Ines Panker - Software estimation: False sense of certainty - SPS25,sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty,,"I've been building software for almost 2 decades. +I'm fascinated by elegant solutions to complex problems, finding simple, straightforward patterns in what at first glance appears to be unorganized chaos. +And I love to observe the human aspect of software. People, human interactions and motivations are just as much integral to software development as the focus on solid architecture that is maintainable, scalable and efficient.",2025-10-16T15:15:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +It has been known since the 70s that developers tend to give very optimistic estimations. + +We prefer to have exact numbers, even if that means they are wrong most of the time. + +In research, developers admitted that they believe their managers will see them as less competent if they provide estimates with huge margins. But mathematically speaking providing a wider min-max interval means you will be right more often. + +Sp, maybe it isn’t really accuracy that businesses and people are looking for. Maybe estimates are needed for the sole purpose of risk aversion. + +Risk can be measured in other ways. + +Maybe it is time we stop estimating tasks left and right and instead start managing the project’s risk and customer’s expectations. + +--------------------- +About the speaker(s): + +I've been building software for almost 2 decades. +I'm fascinated by elegant solutions to complex problems, finding simple, straightforward patterns in what at first glance appears to be unorganized chaos. +And I love to observe the human aspect of software. People, human interactions and motivations are just as much integral to software development as the focus on solid architecture that is maintainable, scalable and efficient. +" +8,1,8,2025-10-16T15:50:00+02:00,Using Python's array API standard for ESA's Euclid mission,Talk,"('Saransh Chopra',)","('Saransh is a ""generalist"" research software engineer at UCL’s Advanced Research Computing Centre (at the time of writing this proposal), where he works on Python, HPC, DevOps, and Education projects. Before UCL, he was a research fellow at CERN working on computational physics software, and he will be joining EPFL as a graduate student this fall. Moreover, he develops and maintains several open-source scientific software, which he believes are the key to collaborative and reproducible research.',)","Over the years, the lack of an array data type in Python has resulted in the creation of numerous array libraries, each specializing in unique niches but still having some interoperability between each other. NumPy has become the de facto array library of Python, and the other array libraries try to keep their API close to that of NumPy. However, this often becomes infeasible, and the libraries deviate out of necessity. To make Python's array libraries shake hands with each other without any inconsistencies, the Consortium for Python Data API Standards has formalised an Array API standard for libraries offering array creation and manipulation operations. + +The Array API standard allows users to write and use the same code for arrays belonging to any of the standard-conforming libraries. Through this talk, we will explore the need for such standardisation and discuss its salient features in detail. We will primarily delve into the example of using this standard to make specific parts of European Space Agency's Euclid space mission's code GPU and autodiff compatible. Besides cosmology, we will also take a look at a few other examples, mostly sourced from my experience working with and on several Python array libraries for scientific computing. Ultimately, the audience can expect to leave the room with the knowledge of both, the software engineering and the research side of the array API standard.",Saransh Chopra,Saransh Chopra - Using Python's array API standard for ESA's Euclid mission,Saransh Chopra - Using Python's array API standard for ESA's Euclid mission - SPS25,sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_,,"Saransh is a ""generalist"" research software engineer at UCL’s Advanced Research Computing Centre (at the time of writing this proposal), where he works on Python, HPC, DevOps, and Education projects. Before UCL, he was a research fellow at CERN working on computational physics software, and he will be joining EPFL as a graduate student this fall. Moreover, he develops and maintains several open-source scientific software, which he believes are the key to collaborative and reproducible research.",2025-10-16T15:50:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Over the years, the lack of an array data type in Python has resulted in the creation of numerous array libraries, each specializing in unique niches but still having some interoperability between each other. NumPy has become the de facto array library of Python, and the other array libraries try to keep their API close to that of NumPy. However, this often becomes infeasible, and the libraries deviate out of necessity. To make Python's array libraries shake hands with each other without any inconsistencies, the Consortium for Python Data API Standards has formalised an Array API standard for libraries offering array creation and manipulation operations. + +The Array API standard allows users to write and use the same code for arrays belonging to any of the standard-conforming libraries. Through this talk, we will explore the need for such standardisation and discuss its salient features in detail. We will primarily delve into the example of using this standard to make specific parts of European Space Agency's Euclid space mission's code GPU and autodiff compatible. Besides cosmology, we will also take a look at a few other examples, mostly sourced from my experience working with and on several Python array libraries for scientific computing. Ultimately, the audience can expect to leave the room with the knowledge of both, the software engineering and the research side of the array API standard. + +--------------------- +About the speaker(s): + +Saransh is a ""generalist"" research software engineer at UCL’s Advanced Research Computing Centre (at the time of writing this proposal), where he works on Python, HPC, DevOps, and Education projects. Before UCL, he was a research fellow at CERN working on computational physics software, and he will be joining EPFL as a graduate student this fall. Moreover, he develops and maintains several open-source scientific software, which he believes are the key to collaborative and reproducible research. +" +9,1,9,2025-10-16T16:25:00+02:00,Lightning Talks - Day 1,Lightning Talks,"('Orga',)","('',)","Our Lightning Talks are open to everyone 😊 + +How it works: +– You can register directly at the conference. First come, first served. +– Any proposal is welcome, as long as your talk has something to do with Python and respects our [Code of Conduct](https://www.python-summit.ch/coc/). We reserve the right to reject talks. +– Talk time is strictly limited to 5 minutes. +– To keep turnaround times short, you will not be able to plug in your own device. We will provide a laptop with all slides. Please submit your slides as PDF via email at least 60 minutes before Lightning Talks start. +– By registering, you accept that your talk may be recorded, published and streamed live (audio & video) under [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/deed.en).",Orga,Orga - Lightning Talks - Day 1,Orga - Lightning Talks - Day 1 - SPS25,sps25_1-09_orga_-_lightning_talks_-_day_1,,,2025-10-16T16:25:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Our Lightning Talks are open to everyone 😊 + +How it works: +– You can register directly at the conference. First come, first served. +– Any proposal is welcome, as long as your talk has something to do with Python and respects our [Code of Conduct](https://www.python-summit.ch/coc/). We reserve the right to reject talks. +– Talk time is strictly limited to 5 minutes. +– To keep turnaround times short, you will not be able to plug in your own device. We will provide a laptop with all slides. Please submit your slides as PDF via email at least 60 minutes before Lightning Talks start. +– By registering, you accept that your talk may be recorded, published and streamed live (audio & video) under [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/deed.en). + +--------------------- +About the speaker(s): + + +" +10,1,10,2025-10-16T17:10:00+02:00,Closing - Day 1,Opening/Closing,"('Orga',)","('',)","A thank you from the organisers. We hope you enjoyed your day! + +(It won't take long, we promise! After that long day, everyone is looking forward to the buffet!)",Orga,Orga - Closing - Day 1,Orga - Closing - Day 1 - SPS25,sps25_1-10_orga_-_closing_-_day_1,,,2025-10-16T17:10:00+02:00,"Talk recorded at the Swiss Python Summit on October 16th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +A thank you from the organisers. We hope you enjoyed your day! + +(It won't take long, we promise! After that long day, everyone is looking forward to the buffet!) + +--------------------- +About the speaker(s): + + +" +11,2,0,2025-10-17T09:00:00+02:00,Welcome - Day 2,Opening/Closing,"('Orga',)","('',)","A welcome message and useful information from the organisers. + +You will also find useful information on our website [www.python-summit.ch/venue](https://www.python-summit.ch/venue/). Or feel free to ask any member of staff if you have a question.",Orga,Orga - Welcome - Day 2,Orga - Welcome - Day 2 - SPS25,sps25_2-00_orga_-_welcome_-_day_2,,,2025-10-17T09:00:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +A welcome message and useful information from the organisers. + +You will also find useful information on our website [www.python-summit.ch/venue](https://www.python-summit.ch/venue/). Or feel free to ask any member of staff if you have a question. + +--------------------- +About the speaker(s): + + +" +12,2,1,2025-10-17T09:10:00+02:00,Machine learning for Swiss democracy,Talk,"('Vita Midori',)","(""I led the development of a stock-trading platform for 8 years. Some bits of C++ and Cython aside, the platform was mainly a Python-based distributed system. Scaling and performance optimisation became not just a necessity but a passion for me. I've since returned to my freelance & consulting roots, and still enjoy helping clients with tough Python problems. Strangely, I've never studied computer science and often run away from all technology into the mountains, forests, and seas of our planet."",)","Demokratis.ch is a non-profit project working to modernise the consultation procedure—a key democratic process that allows Swiss citizens to provide feedback on proposed laws and amendments. Today, the process is slow and cumbersome for everyone involved: it requires studying lengthy PDFs, writing formal letters, and even synthesising legal arguments by copy-pasting into Excel. There’s a huge opportunity to streamline this process and make this democratic tool more accessible and inclusive. + +In this talk, I’ll share how we’re tackling this challenge with machine learning: building data processing pipelines, extracting features from endless PDFs, embedding and classifying text, designing and evaluating models—and ultimately deploying them in production. Because the data comes from the federal administration and 26 different cantons, it’s often heterogeneous and in varying formats. Data quality, in general, presents many challenges for both training and evaluation. Spoiler: PDF is a pretty terrible format for machines… + +Our approach is practical and pragmatic, and our code is open source, so you’re welcome to explore our solutions or even contribute yourself!",Vita Midori,Vita Midori - Machine learning for Swiss democracy,Vita Midori - Machine learning for Swiss democracy - SPS25,sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy,,"I led the development of a stock-trading platform for 8 years. Some bits of C++ and Cython aside, the platform was mainly a Python-based distributed system. Scaling and performance optimisation became not just a necessity but a passion for me. I've since returned to my freelance & consulting roots, and still enjoy helping clients with tough Python problems. Strangely, I've never studied computer science and often run away from all technology into the mountains, forests, and seas of our planet.",2025-10-17T09:10:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Demokratis.ch is a non-profit project working to modernise the consultation procedure—a key democratic process that allows Swiss citizens to provide feedback on proposed laws and amendments. Today, the process is slow and cumbersome for everyone involved: it requires studying lengthy PDFs, writing formal letters, and even synthesising legal arguments by copy-pasting into Excel. There’s a huge opportunity to streamline this process and make this democratic tool more accessible and inclusive. + +In this talk, I’ll share how we’re tackling this challenge with machine learning: building data processing pipelines, extracting features from endless PDFs, embedding and classifying text, designing and evaluating models—and ultimately deploying them in production. Because the data comes from the federal administration and 26 different cantons, it’s often heterogeneous and in varying formats. Data quality, in general, presents many challenges for both training and evaluation. Spoiler: PDF is a pretty terrible format for machines… + +Our approach is practical and pragmatic, and our code is open source, so you’re welcome to explore our solutions or even contribute yourself! + +--------------------- +About the speaker(s): + +I led the development of a stock-trading platform for 8 years. Some bits of C++ and Cython aside, the platform was mainly a Python-based distributed system. Scaling and performance optimisation became not just a necessity but a passion for me. I've since returned to my freelance & consulting roots, and still enjoy helping clients with tough Python problems. Strangely, I've never studied computer science and often run away from all technology into the mountains, forests, and seas of our planet. +" +13,2,2,2025-10-17T09:45:00+02:00,AI Coding Agents and how to code them,Talk,"('Alex Shershebnev',)","('Alex Shershebnev is a seasoned Computer Vision and MLOps Engineer with over ten years of experience shaping the future of AI-driven software development. Currently, Alex leads the ML/DevOps team at Zencoder, where he leverages his extensive background in Software Engineering, ML and DevOps to deliver high-quality machine learning solutions. His work spans complex data pipelines, cloud infrastructure management (GCP, Kubernetes), and advanced ML/DevOps pipelines.',)","AI Agents are the next big thing everyone has been talking about. They are expected to revolutionize various industries by automating routine tasks, mission critical business workflows, enhancing productivity, and enabling humans to focus on creative and strategic work. Of course, you can apply them to your everyday coding tasks as well. + +In this talk we’ll go over what those agents can bring to the table of coding world, and why they can deliver the promise of coding smarter that the current generation of coding assistants can’t. We will then dive right into a quick live coding session where I’ll show what such agents can do in real life and how you can start using them to enhance your everyday life already right after the talk. And we’ll finish off with some remarks on what the future of programming might look like in the near future as those agents get included into your everyday life.",Alex Shershebnev,Alex Shershebnev - AI Coding Agents and how to code them,Alex Shershebnev - AI Coding Agents and how to code them - SPS25,sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them,,"Alex Shershebnev is a seasoned Computer Vision and MLOps Engineer with over ten years of experience shaping the future of AI-driven software development. Currently, Alex leads the ML/DevOps team at Zencoder, where he leverages his extensive background in Software Engineering, ML and DevOps to deliver high-quality machine learning solutions. His work spans complex data pipelines, cloud infrastructure management (GCP, Kubernetes), and advanced ML/DevOps pipelines.",2025-10-17T09:45:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +AI Agents are the next big thing everyone has been talking about. They are expected to revolutionize various industries by automating routine tasks, mission critical business workflows, enhancing productivity, and enabling humans to focus on creative and strategic work. Of course, you can apply them to your everyday coding tasks as well. + +In this talk we’ll go over what those agents can bring to the table of coding world, and why they can deliver the promise of coding smarter that the current generation of coding assistants can’t. We will then dive right into a quick live coding session where I’ll show what such agents can do in real life and how you can start using them to enhance your everyday life already right after the talk. And we’ll finish off with some remarks on what the future of programming might look like in the near future as those agents get included into your everyday life. + +--------------------- +About the speaker(s): + +Alex Shershebnev is a seasoned Computer Vision and MLOps Engineer with over ten years of experience shaping the future of AI-driven software development. Currently, Alex leads the ML/DevOps team at Zencoder, where he leverages his extensive background in Software Engineering, ML and DevOps to deliver high-quality machine learning solutions. His work spans complex data pipelines, cloud infrastructure management (GCP, Kubernetes), and advanced ML/DevOps pipelines. +" +14,2,3,2025-10-17T11:00:00+02:00,Causal ML for Smarter Advertising Campaigns with Python,Talk,"('Francesco Conti',)","('I’m a Telecommunications Engineer who grew up immersed in Fourier transforms (aka Francesco in Fourier-Land). Thanks to Fourier analysis, I learnt that things can look completely different when seen from another perspective. I’m particularly drawn to niche and often overlooked topics, and I like to spend my time where I can truly make a meaningful impact.\r\n\r\nI currently work as a Data Scientist at AgileLab, an amazing company that has given me the chance to work on fascinating projects.',)","Traditionally, **marketing campaign analysis** relies on simple metrics like the number of purchases made after a contact, or conversions following a promotion. While these numbers tell us what happened, they don’t reveal **why it happened** or if the campaign truly made a difference. + +Such analysis can’t distinguish between customers who would have acted anyway and those who were genuinely influenced by the campaign. **The key question is: did the campaign actually cause the desired effect?** + +In this **practical** and **beginner-friendly** session, we’ll explore how **Causal Machine Learning** provides the missing piece in campaign evaluation and targeting. + +Starting from real-world scenarios, we’ll dive into: + +- **Why causality matters** more than correlation when evaluating ad performance. +- How to estimate the true impact of a campaign using **uplift modeling** and treatment effect estimation in just a few lines of code. +- How to target users who are not just likely to interact with ads, but whose behavior can be influenced by the campaign (for example, to reduce churn or boost engagement). + +The session will be hands-on with Python, with clear examples drawn from marketing applications. + +**Take-away:** +Participants will gain a practical understanding of how to think causally in digital marketing, learning key techniques to measure impact and target campaigns more intelligently. moving from predictive to truly prescriptive analytics.",Francesco Conti,Francesco Conti - Causal ML for Smarter Advertising Campaigns with Python,Francesco Conti - Causal ML for Smarter Advertising Campaigns with Python - SPS25,sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig,,"I’m a Telecommunications Engineer who grew up immersed in Fourier transforms (aka Francesco in Fourier-Land). Thanks to Fourier analysis, I learnt that things can look completely different when seen from another perspective. I’m particularly drawn to niche and often overlooked topics, and I like to spend my time where I can truly make a meaningful impact. + +I currently work as a Data Scientist at AgileLab, an amazing company that has given me the chance to work on fascinating projects.",2025-10-17T11:00:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Traditionally, **marketing campaign analysis** relies on simple metrics like the number of purchases made after a contact, or conversions following a promotion. While these numbers tell us what happened, they don’t reveal **why it happened** or if the campaign truly made a difference. + +Such analysis can’t distinguish between customers who would have acted anyway and those who were genuinely influenced by the campaign. **The key question is: did the campaign actually cause the desired effect?** + +In this **practical** and **beginner-friendly** session, we’ll explore how **Causal Machine Learning** provides the missing piece in campaign evaluation and targeting. + +Starting from real-world scenarios, we’ll dive into: + +- **Why causality matters** more than correlation when evaluating ad performance. +- How to estimate the true impact of a campaign using **uplift modeling** and treatment effect estimation in just a few lines of code. +- How to target users who are not just likely to interact with ads, but whose behavior can be influenced by the campaign (for example, to reduce churn or boost engagement). + +The session will be hands-on with Python, with clear examples drawn from marketing applications. + +**Take-away:** +Participants will gain a practical understanding of how to think causally in digital marketing, learning key techniques to measure impact and target campaigns more intelligently. moving from predictive to truly prescriptive analytics. + +--------------------- +About the speaker(s): + +I’m a Telecommunications Engineer who grew up immersed in Fourier transforms (aka Francesco in Fourier-Land). Thanks to Fourier analysis, I learnt that things can look completely different when seen from another perspective. I’m particularly drawn to niche and often overlooked topics, and I like to spend my time where I can truly make a meaningful impact. + +I currently work as a Data Scientist at AgileLab, an amazing company that has given me the chance to work on fascinating projects. +" +15,2,4,2025-10-17T11:35:00+02:00,Docling: Get your documents ready for generative AI,Talk,"('Peter Staar', 'Michele Dolfi', 'Panos Vagenas', 'Nikos Livathinos')","(""Currently, Peter manages the 'AI for Knowledge' group at the IBM Research - Zurich Laboratory. The group focusses on the development of Docling. \r\n\r\nPeter joined the IBM Research - Zurich Laboratory in July of 2014 as a post-doctoral researcher. The Belgium-born scientist first came to IBM Research as a summer student in 2006.\r\n\r\nPrior to joining IBM"", '', 'Panos Vagenas is an Advisory Engineer at IBM Research, leading development efforts at the intersection of Artificial Intelligence, Information Retrieval, and Data Management.', 'Nikos Livathinos is a Senior Software Engineer at IBM Research, leading research and development initiatives in Computer Vision, Software Architecture, and efficient software systems.\r\n\r\nWith over 15 years of experience in software design and development, Nikos has worked extensively across the domains of Artificial Intelligence, Big Data, and Analytics.\r\n\r\nNikos holds 2 Master’s degrees in Computer Science and works at the intersection of applied research and practical engineering execution.')","Docling is an open-source Python package that simplifies document processing by parsing diverse formats — including advanced PDF understanding — and integrating seamlessly with the generative AI ecosystem. It supports a wide range of input types such as PDFs, DOCX, XLSX, HTML, and images, offering rich parsing capabilities including reading order, table structure, code, and formulas. Docling provides a unified and expressive DoclingDocument format, enabling easy export to Markdown, HTML, and lossless JSON. It offers plug-and-play integrations with popular frameworks like LangChain, LlamaIndex, Crew AI, and Haystack, along with strong local execution support for sensitive data and air-gapped environments. As a Python package, Docling is pip-installable and comes with a clean, intuitive API for both programmatic and CLI-based workflows, making it easy to embed into any data pipeline or AI stack. Its modular design also supports extension and customization for enterprise use cases. + +We also introduce SmolDocling, an ultra-compact 256M parameter vision-language model for end-to-end document conversion. SmolDocling generates a novel markup format called DocTags that captures the full content, structure, and spatial layout of a page, and offers accurate reproduction of document features such as tables, equations, charts, and code across a wide variety of formats — all while matching the performance of models up to 27× larger.","Peter Staar, Michele Dolfi, Panos Vagenas, Nikos Livathinos","Peter Staar, Michele Dolfi, Panos Vagenas, Nikos Livathinos - Docling: Get your documents ready for generative AI","Peter Staar, Michele Dolfi, Panos Vagenas, Nikos Livathinos - Docling: Get your documents ready for generative AI - SPS25",sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_,,"Currently, Peter manages the 'AI for Knowledge' group at the IBM Research - Zurich Laboratory. The group focusses on the development of Docling. + +Peter joined the IBM Research - Zurich Laboratory in July of 2014 as a post-doctoral researcher. The Belgium-born scientist first came to IBM Research as a summer student in 2006. + +Prior to joining IBM + + + +Panos Vagenas is an Advisory Engineer at IBM Research, leading development efforts at the intersection of Artificial Intelligence, Information Retrieval, and Data Management. + +Nikos Livathinos is a Senior Software Engineer at IBM Research, leading research and development initiatives in Computer Vision, Software Architecture, and efficient software systems. + +With over 15 years of experience in software design and development, Nikos has worked extensively across the domains of Artificial Intelligence, Big Data, and Analytics. + +Nikos holds 2 Master’s degrees in Computer Science and works at the intersection of applied research and practical engineering execution.",2025-10-17T11:35:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Docling is an open-source Python package that simplifies document processing by parsing diverse formats — including advanced PDF understanding — and integrating seamlessly with the generative AI ecosystem. It supports a wide range of input types such as PDFs, DOCX, XLSX, HTML, and images, offering rich parsing capabilities including reading order, table structure, code, and formulas. Docling provides a unified and expressive DoclingDocument format, enabling easy export to Markdown, HTML, and lossless JSON. It offers plug-and-play integrations with popular frameworks like LangChain, LlamaIndex, Crew AI, and Haystack, along with strong local execution support for sensitive data and air-gapped environments. As a Python package, Docling is pip-installable and comes with a clean, intuitive API for both programmatic and CLI-based workflows, making it easy to embed into any data pipeline or AI stack. Its modular design also supports extension and customization for enterprise use cases. + +We also introduce SmolDocling, an ultra-compact 256M parameter vision-language model for end-to-end document conversion. SmolDocling generates a novel markup format called DocTags that captures the full content, structure, and spatial layout of a page, and offers accurate reproduction of document features such as tables, equations, charts, and code across a wide variety of formats — all while matching the performance of models up to 27× larger. + +--------------------- +About the speaker(s): + +Currently, Peter manages the 'AI for Knowledge' group at the IBM Research - Zurich Laboratory. The group focusses on the development of Docling. + +Peter joined the IBM Research - Zurich Laboratory in July of 2014 as a post-doctoral researcher. The Belgium-born scientist first came to IBM Research as a summer student in 2006. + +Prior to joining IBM + + + +Panos Vagenas is an Advisory Engineer at IBM Research, leading development efforts at the intersection of Artificial Intelligence, Information Retrieval, and Data Management. + +Nikos Livathinos is a Senior Software Engineer at IBM Research, leading research and development initiatives in Computer Vision, Software Architecture, and efficient software systems. + +With over 15 years of experience in software design and development, Nikos has worked extensively across the domains of Artificial Intelligence, Big Data, and Analytics. + +Nikos holds 2 Master’s degrees in Computer Science and works at the intersection of applied research and practical engineering execution. +" +16,2,5,2025-10-17T13:30:00+02:00,Agentic Cyber Defense with External Threat Intelligence,Talk,"('Jyoti Yadav',)","('Jyoti Yadav is a Cyber Security Data Scientist at Microsoft with extensive experience in data science, machine learning, and cybersecurity. Having worked at companies like Blockchain.com, EXL, and Lucidian, she has built advanced models for fraud detection, market forecasting, and security risk assessments. She specializes in predictive modeling, machine learning, anomaly detection, Agentic AI, and Large Language Models (LLM). Passionate about driving impactful results.',)","This talk will detail how to integrate external threat intelligence data into an autonomous agentic AI system for proactive cybersecurity. Using real world datasets—including open-source threat feeds, security logs, or OSINT—you will learn how to build a data ingestion pipeline, train models with Python, and deploy agents that autonomously detect and mitigate cyber threats. This case study will provide practical insights into data preprocessing, feature engineering, and the challenges of adversarial conditions.",Jyoti Yadav,Jyoti Yadav - Agentic Cyber Defense with External Threat Intelligence,Jyoti Yadav - Agentic Cyber Defense with External Threat Intelligence - SPS25,sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in,,"Jyoti Yadav is a Cyber Security Data Scientist at Microsoft with extensive experience in data science, machine learning, and cybersecurity. Having worked at companies like Blockchain.com, EXL, and Lucidian, she has built advanced models for fraud detection, market forecasting, and security risk assessments. She specializes in predictive modeling, machine learning, anomaly detection, Agentic AI, and Large Language Models (LLM). Passionate about driving impactful results.",2025-10-17T13:30:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +This talk will detail how to integrate external threat intelligence data into an autonomous agentic AI system for proactive cybersecurity. Using real world datasets—including open-source threat feeds, security logs, or OSINT—you will learn how to build a data ingestion pipeline, train models with Python, and deploy agents that autonomously detect and mitigate cyber threats. This case study will provide practical insights into data preprocessing, feature engineering, and the challenges of adversarial conditions. + +--------------------- +About the speaker(s): + +Jyoti Yadav is a Cyber Security Data Scientist at Microsoft with extensive experience in data science, machine learning, and cybersecurity. Having worked at companies like Blockchain.com, EXL, and Lucidian, she has built advanced models for fraud detection, market forecasting, and security risk assessments. She specializes in predictive modeling, machine learning, anomaly detection, Agentic AI, and Large Language Models (LLM). Passionate about driving impactful results. +" +17,2,6,2025-10-17T14:05:00+02:00,Anonymization of sensitive information in financial document,Talk,"('Piotr Gryko',)","('Dr Piotr Gryko, studied experimental physics at University College London. His PhD at Imperial College London focused on using biomaterials to self assemble inorganic materials, merging the boundaries of biological systems and machines.\r\n\r\nWith 12 years of experience writing software, he now focuses on AI engineering.',)","Data is the fossil fuel of the machine learning world, essential for developing high quality models but in limited supply. Yet institutions handling sensitive documents — such as financial, medical, or legal records often cannot fully leverage their own data due to stringent privacy, compliance, and security requirements, making training high quality models difficult. + +A promising solution is to replace the personally identifiable information (PII) with realistic synthetic stand-ins, whilst leaving the rest of the document in tact. + +In this talk, we will discuss the use of open source tools and models that can be self hosted to anonymize documents. We will go over the various approaches for Named Entity Recognition (NER) to identify sensitive entities and the use of diffusion models to inpaint anonymized content.",Piotr Gryko,Piotr Gryko - Anonymization of sensitive information in financial document,Piotr Gryko - Anonymization of sensitive information in financial document - SPS25,sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin,,"Dr Piotr Gryko, studied experimental physics at University College London. His PhD at Imperial College London focused on using biomaterials to self assemble inorganic materials, merging the boundaries of biological systems and machines. + +With 12 years of experience writing software, he now focuses on AI engineering.",2025-10-17T14:05:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Data is the fossil fuel of the machine learning world, essential for developing high quality models but in limited supply. Yet institutions handling sensitive documents — such as financial, medical, or legal records often cannot fully leverage their own data due to stringent privacy, compliance, and security requirements, making training high quality models difficult. + +A promising solution is to replace the personally identifiable information (PII) with realistic synthetic stand-ins, whilst leaving the rest of the document in tact. + +In this talk, we will discuss the use of open source tools and models that can be self hosted to anonymize documents. We will go over the various approaches for Named Entity Recognition (NER) to identify sensitive entities and the use of diffusion models to inpaint anonymized content. + +--------------------- +About the speaker(s): + +Dr Piotr Gryko, studied experimental physics at University College London. His PhD at Imperial College London focused on using biomaterials to self assemble inorganic materials, merging the boundaries of biological systems and machines. + +With 12 years of experience writing software, he now focuses on AI engineering. +" +18,2,7,2025-10-17T15:15:00+02:00,Gompertz Linear Units (GoLU),Talk,"('Das\tIndrashis',)","(""Hello! I'm Indrashis Das from India. I'm a Machine Learning Engineer at AICONIX in Freiburg, Germany. I hold a Master's in Computer Science (AI specialization) from the University of Freiburg, where I also served as a Teaching Assistant in Prof. Frank Hutter's ML lab for 2.5 years and worked on GoLU as my Master's Thesis."",)","Activation functions are fundamental elements of deep learning architectures as they significantly influence training dynamics. ReLU, while widely used, is prone to the dying neuron problem, which has been mitigated by variants such as LeakyReLU, PReLU, and ELU that better handle negative neuron outputs. Recently, self-gated activations like GELU and Swish have emerged as state-of-the-art alternatives, leveraging their smoothness to ensure stable gradient flow and prevent neuron inactivity. + +In this work, we introduce the Gompertz Linear Unit (GoLU), a novel self-gated activation function defined as `GoLU(x) = x Gompertz(x)`, where `Gompertz(x) = exp(−exp(−x))`. The GoLU activation leverages the asymmetry in the Gompertz function to reduce variance in the latent space more effectively compared to GELU and Swish, while preserving robust gradient flow. Extensive experiments across diverse tasks, including Image Classification, Language Modeling, Semantic Segmentation, Object Detection, Instance Segmentation, and Diffusion, highlight GoLU's superior performance relative to state-of-the-art activation functions, establishing GoLU as a robust alternative to existing activation functions.",Das Indrashis,Das Indrashis - Gompertz Linear Units (GoLU),Das Indrashis - Gompertz Linear Units (GoLU) - SPS25,sps25_2-07_dasindrashis_-_gompertz_linear_units_golu,,"Hello! I'm Indrashis Das from India. I'm a Machine Learning Engineer at AICONIX in Freiburg, Germany. I hold a Master's in Computer Science (AI specialization) from the University of Freiburg, where I also served as a Teaching Assistant in Prof. Frank Hutter's ML lab for 2.5 years and worked on GoLU as my Master's Thesis.",2025-10-17T15:15:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Activation functions are fundamental elements of deep learning architectures as they significantly influence training dynamics. ReLU, while widely used, is prone to the dying neuron problem, which has been mitigated by variants such as LeakyReLU, PReLU, and ELU that better handle negative neuron outputs. Recently, self-gated activations like GELU and Swish have emerged as state-of-the-art alternatives, leveraging their smoothness to ensure stable gradient flow and prevent neuron inactivity. + +In this work, we introduce the Gompertz Linear Unit (GoLU), a novel self-gated activation function defined as `GoLU(x) = x Gompertz(x)`, where `Gompertz(x) = exp(−exp(−x))`. The GoLU activation leverages the asymmetry in the Gompertz function to reduce variance in the latent space more effectively compared to GELU and Swish, while preserving robust gradient flow. Extensive experiments across diverse tasks, including Image Classification, Language Modeling, Semantic Segmentation, Object Detection, Instance Segmentation, and Diffusion, highlight GoLU's superior performance relative to state-of-the-art activation functions, establishing GoLU as a robust alternative to existing activation functions. + +--------------------- +About the speaker(s): + +Hello! I'm Indrashis Das from India. I'm a Machine Learning Engineer at AICONIX in Freiburg, Germany. I hold a Master's in Computer Science (AI specialization) from the University of Freiburg, where I also served as a Teaching Assistant in Prof. Frank Hutter's ML lab for 2.5 years and worked on GoLU as my Master's Thesis. +" +19,2,8,2025-10-17T15:50:00+02:00,"What Networks tell us about Trades, Power, and the World?",Talk,"('Kshitijaa Jaglan',)","(""I'm Kshitijaa Jaglan, and I like using AI, Machine Learning and Networks to make complex systems (and the web) a little more optimized, fast and understandable! Currently I am transitioning from my research position at the Social Computing Group, University of Zurich, towards more applied and technical roles in industry."",)","Networks are all around us, shaping phenomena like epidemics, communication, and transportation. In this talk, we will explore how real-world problems can be analyzed and solved using graph-based methods and simple algorithms. Drawing from examples such as trade networks, corporate structures, and historical data, I will demonstrate how network analysis reveals insights that would otherwise remain hidden. Using NetworKit (and NetworkX), we will analyze real-world datasets to answer questions like: + +1. What does the core-periphery model reveal about trade networks? +2. Could we have predicted that Moscow will become Russia's capital? +3. How do corporate hierarchies differ from interaction hierarchies within organizations? + +Throughout the talk, I will introduce key concepts in network analysis and showcase Python as a tool for research. Attendees will have access to all datasets and code, enabling them to replicate the analyses and apply these techniques to their own projects. This session is designed for Python enthusiasts with an interest in data science, networks, and/or applied research.",Kshitijaa Jaglan,"Kshitijaa Jaglan - What Networks tell us about Trades, Power, and the World?","Kshitijaa Jaglan - What Networks tell us about Trades, Power, and the World? - SPS25",sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power,,"I'm Kshitijaa Jaglan, and I like using AI, Machine Learning and Networks to make complex systems (and the web) a little more optimized, fast and understandable! Currently I am transitioning from my research position at the Social Computing Group, University of Zurich, towards more applied and technical roles in industry.",2025-10-17T15:50:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Networks are all around us, shaping phenomena like epidemics, communication, and transportation. In this talk, we will explore how real-world problems can be analyzed and solved using graph-based methods and simple algorithms. Drawing from examples such as trade networks, corporate structures, and historical data, I will demonstrate how network analysis reveals insights that would otherwise remain hidden. Using NetworKit (and NetworkX), we will analyze real-world datasets to answer questions like: + +1. What does the core-periphery model reveal about trade networks? +2. Could we have predicted that Moscow will become Russia's capital? +3. How do corporate hierarchies differ from interaction hierarchies within organizations? + +Throughout the talk, I will introduce key concepts in network analysis and showcase Python as a tool for research. Attendees will have access to all datasets and code, enabling them to replicate the analyses and apply these techniques to their own projects. This session is designed for Python enthusiasts with an interest in data science, networks, and/or applied research. + +--------------------- +About the speaker(s): + +I'm Kshitijaa Jaglan, and I like using AI, Machine Learning and Networks to make complex systems (and the web) a little more optimized, fast and understandable! Currently I am transitioning from my research position at the Social Computing Group, University of Zurich, towards more applied and technical roles in industry. +" +20,2,9,2025-10-17T16:25:00+02:00,Lightning Talks - Day 2,Lightning Talks,"('Orga',)","('',)","Our Lightning Talks are open to everyone 😊 + +How it works: +– You can register directly at the conference. First come, first served. +– Any proposal is welcome, as long as your talk has something to do with Python and respects our [Code of Conduct](https://www.python-summit.ch/coc/). We reserve the right to reject talks. +– Talk time is strictly limited to 5 minutes. +– To keep turnaround times short, you will not be able to plug in your own device. We will provide a laptop with all slides. Please submit your slides as PDF via email at least 60 minutes before Lightning Talks start. +– By registering, you accept that your talk may be recorded, published and streamed live (audio & video) under [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/deed.en).",Orga,Orga - Lightning Talks - Day 2,Orga - Lightning Talks - Day 2 - SPS25,sps25_2-09_orga_-_lightning_talks_-_day_2,,,2025-10-17T16:25:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +Our Lightning Talks are open to everyone 😊 + +How it works: +– You can register directly at the conference. First come, first served. +– Any proposal is welcome, as long as your talk has something to do with Python and respects our [Code of Conduct](https://www.python-summit.ch/coc/). We reserve the right to reject talks. +– Talk time is strictly limited to 5 minutes. +– To keep turnaround times short, you will not be able to plug in your own device. We will provide a laptop with all slides. Please submit your slides as PDF via email at least 60 minutes before Lightning Talks start. +– By registering, you accept that your talk may be recorded, published and streamed live (audio & video) under [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/deed.en). + +--------------------- +About the speaker(s): + + +" +21,2,10,2025-10-17T17:10:00+02:00,Closing - Day 2,Opening/Closing,"('Orga',)","('',)","A thank you from the organisers. We hope you enjoyed your day! + +(It won't take long, we promise! After that long day, everyone is looking forward to the buffet!)",Orga,Orga - Closing - Day 2,Orga - Closing - Day 2 - SPS25,sps25_2-10_orga_-_closing_-_day_2,,,2025-10-17T17:10:00+02:00,"Talk recorded at the Swiss Python Summit on October 17th, 2025. +Licensed as Creative Commons Attribution 4.0 International. + +--------- +Abstract: + +A thank you from the organisers. We hope you enjoyed your day! + +(It won't take long, we promise! After that long day, everyone is looking forward to the buffet!) + +--------------------- +About the speaker(s): + + +" diff --git a/scripts/recordings/sps25/talks_notext.csv b/scripts/recordings/sps25/talks_notext.csv new file mode 100644 index 0000000..c64254d --- /dev/null +++ b/scripts/recordings/sps25/talks_notext.csv @@ -0,0 +1,23 @@ +,day,talk_idx,date,title,type,names_raw,names_combined,named_title,video_title,filename,video_url,date_str +0,1,0,2025-10-16T09:00:00+02:00,Welcome - Day 1,Opening/Closing,"('Orga',)",Orga,Orga - Welcome - Day 1,Orga - Welcome - Day 1 - SPS25,sps25_1-00_orga_-_welcome_-_day_1,,2025-10-16T09:00:00+02:00 +1,1,1,2025-10-16T09:10:00+02:00,When Close Enough is Good Enough,Talk,"('Tim Head',)",Tim Head,Tim Head - When Close Enough is Good Enough,Tim Head - When Close Enough is Good Enough - SPS25,sps25_1-01_tim_head_-_when_close_enough_is_good_enough,,2025-10-16T09:10:00+02:00 +2,1,2,2025-10-16T09:45:00+02:00,Code review in era of collaborative development,Talk,"('Andrii Soldatenko',)",Andrii Soldatenko,Andrii Soldatenko - Code review in era of collaborative development,Andrii Soldatenko - Code review in era of collaborative development - SPS25,sps25_1-02_andrii_soldatenko_-_code_review_in_era_of_collaborative_dev,,2025-10-16T09:45:00+02:00 +3,1,3,2025-10-16T11:00:00+02:00,Bytecode and .pyc files,Talk,"('Konrad Gawda',)",Konrad Gawda,Konrad Gawda - Bytecode and .pyc files,Konrad Gawda - Bytecode and .pyc files - SPS25,sps25_1-03_konrad_gawda_-_bytecode_and_pyc_files,,2025-10-16T11:00:00+02:00 +4,1,4,2025-10-16T11:35:00+02:00,"Why you, as a Python developer, should learn Rust",Talk,"('Daniel Szoke',)",Daniel Szoke,"Daniel Szoke - Why you, as a Python developer, should learn Rust","Daniel Szoke - Why you, as a Python developer, should learn Rust - SPS25",sps25_1-04_daniel_szoke_-_why_you_as_a_python_developer_should_learn_r,,2025-10-16T11:35:00+02:00 +5,1,5,2025-10-16T13:30:00+02:00,Functional Python: Saving Christmas with itertools & friends,Talk,"('Edoardo Baldi',)",Edoardo Baldi,Edoardo Baldi - Functional Python: Saving Christmas with itertools & friends,Edoardo Baldi - Functional Python: Saving Christmas with itertools & friends - SPS25,sps25_1-05_edoardo_baldi_-_functional_python_saving_christmas_with_ite,,2025-10-16T13:30:00+02:00 +6,1,6,2025-10-16T14:00:00+02:00,Building Resilient Python Apps for Unreliable Networks,Talk,"('Emeka Onyebuchi',)",Emeka Onyebuchi,Emeka Onyebuchi - Building Resilient Python Apps for Unreliable Networks,Emeka Onyebuchi - Building Resilient Python Apps for Unreliable Networks - SPS25,sps25_1-06_emeka_onyebuchi_-_building_resilient_python_apps_for_unreli,,2025-10-16T14:00:00+02:00 +7,1,7,2025-10-16T15:15:00+02:00,Software estimation: False sense of certainty,Talk,"('Ines Panker',)",Ines Panker,Ines Panker - Software estimation: False sense of certainty,Ines Panker - Software estimation: False sense of certainty - SPS25,sps25_1-07_ines_panker_-_software_estimation_false_sense_of_certainty,,2025-10-16T15:15:00+02:00 +8,1,8,2025-10-16T15:50:00+02:00,Using Python's array API standard for ESA's Euclid mission,Talk,"('Saransh Chopra',)",Saransh Chopra,Saransh Chopra - Using Python's array API standard for ESA's Euclid mission,Saransh Chopra - Using Python's array API standard for ESA's Euclid mission - SPS25,sps25_1-08_saransh_chopra_-_using_pythons_array_api_standard_for_esas_,,2025-10-16T15:50:00+02:00 +9,1,9,2025-10-16T16:25:00+02:00,Lightning Talks - Day 1,Lightning Talks,"('Orga',)",Orga,Orga - Lightning Talks - Day 1,Orga - Lightning Talks - Day 1 - SPS25,sps25_1-09_orga_-_lightning_talks_-_day_1,,2025-10-16T16:25:00+02:00 +10,1,10,2025-10-16T17:10:00+02:00,Closing - Day 1,Opening/Closing,"('Orga',)",Orga,Orga - Closing - Day 1,Orga - Closing - Day 1 - SPS25,sps25_1-10_orga_-_closing_-_day_1,,2025-10-16T17:10:00+02:00 +11,2,0,2025-10-17T09:00:00+02:00,Welcome - Day 2,Opening/Closing,"('Orga',)",Orga,Orga - Welcome - Day 2,Orga - Welcome - Day 2 - SPS25,sps25_2-00_orga_-_welcome_-_day_2,,2025-10-17T09:00:00+02:00 +12,2,1,2025-10-17T09:10:00+02:00,Machine learning for Swiss democracy,Talk,"('Vita Midori',)",Vita Midori,Vita Midori - Machine learning for Swiss democracy,Vita Midori - Machine learning for Swiss democracy - SPS25,sps25_2-01_vita_midori_-_machine_learning_for_swiss_democracy,,2025-10-17T09:10:00+02:00 +13,2,2,2025-10-17T09:45:00+02:00,AI Coding Agents and how to code them,Talk,"('Alex Shershebnev',)",Alex Shershebnev,Alex Shershebnev - AI Coding Agents and how to code them,Alex Shershebnev - AI Coding Agents and how to code them - SPS25,sps25_2-02_alex_shershebnev_-_ai_coding_agents_and_how_to_code_them,,2025-10-17T09:45:00+02:00 +14,2,3,2025-10-17T11:00:00+02:00,Causal ML for Smarter Advertising Campaigns with Python,Talk,"('Francesco Conti',)",Francesco Conti,Francesco Conti - Causal ML for Smarter Advertising Campaigns with Python,Francesco Conti - Causal ML for Smarter Advertising Campaigns with Python - SPS25,sps25_2-03_francesco_conti_-_causal_ml_for_smarter_advertising_campaig,,2025-10-17T11:00:00+02:00 +15,2,4,2025-10-17T11:35:00+02:00,Docling: Get your documents ready for generative AI,Talk,"('Peter Staar', 'Michele Dolfi', 'Panos Vagenas', 'Nikos Livathinos')","Peter Staar, Michele Dolfi, Panos Vagenas, Nikos Livathinos","Peter Staar, Michele Dolfi, Panos Vagenas, Nikos Livathinos - Docling: Get your documents ready for generative AI","Peter Staar, Michele Dolfi, Panos Vagenas, Nikos Livathinos - Docling: Get your documents ready for generative AI - SPS25",sps25_2-04_peter_staar_michele_dolfi_panos_vagenas_nikos_livathinos_-_,,2025-10-17T11:35:00+02:00 +16,2,5,2025-10-17T13:30:00+02:00,Agentic Cyber Defense with External Threat Intelligence,Talk,"('Jyoti Yadav',)",Jyoti Yadav,Jyoti Yadav - Agentic Cyber Defense with External Threat Intelligence,Jyoti Yadav - Agentic Cyber Defense with External Threat Intelligence - SPS25,sps25_2-05_jyoti_yadav_-_agentic_cyber_defense_with_external_threat_in,,2025-10-17T13:30:00+02:00 +17,2,6,2025-10-17T14:05:00+02:00,Anonymization of sensitive information in financial document,Talk,"('Piotr Gryko',)",Piotr Gryko,Piotr Gryko - Anonymization of sensitive information in financial document,Piotr Gryko - Anonymization of sensitive information in financial document - SPS25,sps25_2-06_piotr_gryko_-_anonymization_of_sensitive_information_in_fin,,2025-10-17T14:05:00+02:00 +18,2,7,2025-10-17T15:15:00+02:00,Gompertz Linear Units (GoLU),Talk,"('Das\tIndrashis',)",Das Indrashis,Das Indrashis - Gompertz Linear Units (GoLU),Das Indrashis - Gompertz Linear Units (GoLU) - SPS25,sps25_2-07_dasindrashis_-_gompertz_linear_units_golu,,2025-10-17T15:15:00+02:00 +19,2,8,2025-10-17T15:50:00+02:00,"What Networks tell us about Trades, Power, and the World?",Talk,"('Kshitijaa Jaglan',)",Kshitijaa Jaglan,"Kshitijaa Jaglan - What Networks tell us about Trades, Power, and the World?","Kshitijaa Jaglan - What Networks tell us about Trades, Power, and the World? - SPS25",sps25_2-08_kshitijaa_jaglan_-_what_networks_tell_us_about_trades_power,,2025-10-17T15:50:00+02:00 +20,2,9,2025-10-17T16:25:00+02:00,Lightning Talks - Day 2,Lightning Talks,"('Orga',)",Orga,Orga - Lightning Talks - Day 2,Orga - Lightning Talks - Day 2 - SPS25,sps25_2-09_orga_-_lightning_talks_-_day_2,,2025-10-17T16:25:00+02:00 +21,2,10,2025-10-17T17:10:00+02:00,Closing - Day 2,Opening/Closing,"('Orga',)",Orga,Orga - Closing - Day 2,Orga - Closing - Day 2 - SPS25,sps25_2-10_orga_-_closing_-_day_2,,2025-10-17T17:10:00+02:00 diff --git a/sps20/assets/css/spectre.css b/sps20/assets/css/spectre.css index f06ca22..ec4b5a5 100644 --- a/sps20/assets/css/spectre.css +++ b/sps20/assets/css/spectre.css @@ -1 +1 @@ -/*! Spectre.css v0.5.8 | MIT License | github.com/picturepan2/spectre */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}hr{box-sizing:content-box;height:0;overflow:visible}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}address{font-style:normal}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:"SF Mono","Segoe UI Mono","Roboto Mono",Menlo,Courier,monospace;font-size:1em}dfn{font-style:italic}small{font-size:80%;font-weight:400}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}fieldset{border:0;margin:0;padding:0}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item;outline:none}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,*::before,*::after{box-sizing:inherit}html{box-sizing:border-box;font-size:20px;line-height:1.5;-webkit-tap-highlight-color:transparent}body{background:#fff;color:#3b4351;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;font-size:.8rem;overflow-x:hidden;text-rendering:optimizeLegibility}a{color:#5755d9;outline:none;text-decoration:none}a:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2)}a:focus,a:hover,a:active,a.active{color:#302ecd;text-decoration:underline}a:visited{color:#807fe2}h1,h2,h3,h4,h5,h6{color:inherit;font-weight:500;line-height:1.2;margin-bottom:.5em;margin-top:0}.h1,.h2,.h3,.h4,.h5,.h6{font-weight:500}h1,.h1{font-size:2rem}h2,.h2{font-size:1.6rem}h3,.h3{font-size:1.4rem}h4,.h4{font-size:1.2rem}h5,.h5{font-size:1rem}h6,.h6{font-size:.8rem}p{margin:0 0 1.2rem}a,ins,u{text-decoration-skip:ink edges}abbr[title]{border-bottom:.05rem dotted;cursor:help;text-decoration:none}kbd{border-radius:.1rem;line-height:1.25;padding:.1rem .2rem;background:#303742;color:#fff;font-size:.7rem}mark{background:#ffe9b3;color:#3b4351;border-bottom:.05rem solid #ffd367;border-radius:.1rem;padding:.05rem .1rem 0}blockquote{border-left:.1rem solid #dadee4;margin-left:0;padding:.4rem .8rem}blockquote p:last-child{margin-bottom:0}ul,ol{margin:.8rem 0 .8rem .8rem;padding:0}ul ul,ul ol,ol ul,ol ol{margin:.8rem 0 .8rem .8rem}ul li,ol li{margin-top:.4rem}ul{list-style:disc inside}ul ul{list-style-type:circle}ol{list-style:decimal inside}ol ol{list-style-type:lower-alpha}dl dt{font-weight:bold}dl dd{margin:.4rem 0 .8rem 0}html:lang(zh),html:lang(zh-Hans),.lang-zh,.lang-zh-hans{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Helvetica Neue",sans-serif}html:lang(zh-Hant),.lang-zh-hant{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang TC","Hiragino Sans CNS","Microsoft JhengHei","Helvetica Neue",sans-serif}html:lang(ja),.lang-ja{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Hiragino Sans","Hiragino Kaku Gothic Pro","Yu Gothic",YuGothic,Meiryo,"Helvetica Neue",sans-serif}html:lang(ko),.lang-ko{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Malgun Gothic","Helvetica Neue",sans-serif}:lang(zh) ins,:lang(zh) u,:lang(ja) ins,:lang(ja) u,.lang-cjk ins,.lang-cjk u{border-bottom:.05rem solid;text-decoration:none}:lang(zh) del+del,:lang(zh) del+s,:lang(zh) ins+ins,:lang(zh) ins+u,:lang(zh) s+del,:lang(zh) s+s,:lang(zh) u+ins,:lang(zh) u+u,:lang(ja) del+del,:lang(ja) del+s,:lang(ja) ins+ins,:lang(ja) ins+u,:lang(ja) s+del,:lang(ja) s+s,:lang(ja) u+ins,:lang(ja) u+u,.lang-cjk del+del,.lang-cjk del+s,.lang-cjk ins+ins,.lang-cjk ins+u,.lang-cjk s+del,.lang-cjk s+s,.lang-cjk u+ins,.lang-cjk u+u{margin-left:.125em}.table{border-collapse:collapse;border-spacing:0;width:100%;text-align:left}.table.table-striped tbody tr:nth-of-type(odd){background:#f7f8f9}.table tbody tr.active,.table.table-striped tbody tr.active{background:#eef0f3}.table.table-hover tbody tr:hover{background:#eef0f3}.table.table-scroll{display:block;overflow-x:auto;padding-bottom:.75rem;white-space:nowrap}.table td,.table th{border-bottom:.05rem solid #dadee4;padding:.6rem .4rem}.table th{border-bottom-width:.1rem}.btn{appearance:none;background:#fff;border:.05rem solid #5755d9;border-radius:.1rem;color:#5755d9;cursor:pointer;display:inline-block;font-size:.8rem;height:1.8rem;line-height:1.2rem;outline:none;padding:.25rem .4rem;text-align:center;text-decoration:none;transition:background .2s, border .2s, box-shadow .2s, color .2s;user-select:none;vertical-align:middle;white-space:nowrap}.btn:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2)}.btn:focus,.btn:hover{background:#f1f1fc;border-color:#4b48d6;text-decoration:none}.btn:active,.btn.active{background:#4b48d6;border-color:#3634d2;color:#fff;text-decoration:none}.btn:active.loading::after,.btn.active.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn[disabled],.btn:disabled,.btn.disabled{cursor:default;opacity:.5;pointer-events:none}.btn.btn-primary{background:#5755d9;border-color:#4b48d6;color:#fff}.btn.btn-primary:focus,.btn.btn-primary:hover{background:#4240d4;border-color:#3634d2;color:#fff}.btn.btn-primary:active,.btn.btn-primary.active{background:#3a38d2;border-color:#302ecd;color:#fff}.btn.btn-primary.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn.btn-success{background:#32b643;border-color:#2faa3f;color:#fff}.btn.btn-success:focus{box-shadow:0 0 0 0.1rem rgba(50,182,67,0.2)}.btn.btn-success:focus,.btn.btn-success:hover{background:#30ae40;border-color:#2da23c;color:#fff}.btn.btn-success:active,.btn.btn-success.active{background:#2a9a39;border-color:#278e34;color:#fff}.btn.btn-success.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn.btn-error{background:#e85600;border-color:#d95000;color:#fff}.btn.btn-error:focus{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2)}.btn.btn-error:focus,.btn.btn-error:hover{background:#de5200;border-color:#cf4d00;color:#fff}.btn.btn-error:active,.btn.btn-error.active{background:#c44900;border-color:#b54300;color:#fff}.btn.btn-error.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn.btn-link{background:transparent;border-color:transparent;color:#5755d9}.btn.btn-link:focus,.btn.btn-link:hover,.btn.btn-link:active,.btn.btn-link.active{color:#302ecd}.btn.btn-sm{font-size:.7rem;height:1.4rem;padding:.05rem .3rem}.btn.btn-lg{font-size:.9rem;height:2rem;padding:.35rem .6rem}.btn.btn-block{display:block;width:100%}.btn.btn-action{width:1.8rem;padding-left:0;padding-right:0}.btn.btn-action.btn-sm{width:1.4rem}.btn.btn-action.btn-lg{width:2rem}.btn.btn-clear{background:transparent;border:0;color:currentColor;height:1rem;line-height:.8rem;margin-left:.2rem;margin-right:-2px;opacity:1;padding:.1rem;text-decoration:none;width:1rem}.btn.btn-clear:focus,.btn.btn-clear:hover{background:rgba(247,248,249,0.5);opacity:.95}.btn.btn-clear::before{content:"\2715"}.btn-group{display:inline-flex;flex-wrap:wrap}.btn-group .btn{flex:1 0 auto}.btn-group .btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group .btn:not(:first-child):not(:last-child){border-radius:0;margin-left:-.05rem}.btn-group .btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-.05rem}.btn-group .btn:focus,.btn-group .btn:hover,.btn-group .btn:active,.btn-group .btn.active{z-index:1}.btn-group.btn-group-block{display:flex}.btn-group.btn-group-block .btn{flex:1 0 0}.form-group:not(:last-child){margin-bottom:.4rem}fieldset{margin-bottom:.8rem}legend{font-size:.9rem;font-weight:500;margin-bottom:.8rem}.form-label{display:block;line-height:1.2rem;padding:.3rem 0}.form-label.label-sm{font-size:.7rem;padding:.1rem 0}.form-label.label-lg{font-size:.9rem;padding:.4rem 0}.form-input{appearance:none;background:#fff;background-image:none;border:.05rem solid #bcc3ce;border-radius:.1rem;color:#3b4351;display:block;font-size:.8rem;height:1.8rem;line-height:1.2rem;max-width:100%;outline:none;padding:.25rem .4rem;position:relative;transition:background .2s, border .2s, box-shadow .2s, color .2s;width:100%}.form-input:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2);border-color:#5755d9}.form-input::placeholder{color:#bcc3ce}.form-input.input-sm{font-size:.7rem;height:1.4rem;padding:.05rem .3rem}.form-input.input-lg{font-size:.9rem;height:2rem;padding:.35rem .6rem}.form-input.input-inline{display:inline-block;vertical-align:middle;width:auto}.form-input[type="file"]{height:auto}textarea.form-input,textarea.form-input.input-lg,textarea.form-input.input-sm{height:auto}.form-input-hint{color:#bcc3ce;font-size:.7rem;margin-top:.2rem}.has-success .form-input-hint,.is-success+.form-input-hint{color:#32b643}.has-error .form-input-hint,.is-error+.form-input-hint{color:#e85600}.form-select{appearance:none;border:.05rem solid #bcc3ce;border-radius:.1rem;color:inherit;font-size:.8rem;height:1.8rem;line-height:1.2rem;outline:none;padding:.25rem .4rem;vertical-align:middle;width:100%;background:#fff}.form-select:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2);border-color:#5755d9}.form-select::-ms-expand{display:none}.form-select.select-sm{font-size:.7rem;height:1.4rem;padding:.05rem 1.1rem .05rem .3rem}.form-select.select-lg{font-size:.9rem;height:2rem;padding:.35rem 1.4rem .35rem .6rem}.form-select[size],.form-select[multiple]{height:auto;padding:.25rem .4rem}.form-select[size] option,.form-select[multiple] option{padding:.1rem .2rem}.form-select:not([multiple]):not([size]){background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%204%205'%3E%3Cpath%20fill='%23667189'%20d='M2%200L0%202h4zm0%205L0%203h4z'/%3E%3C/svg%3E") no-repeat right 0.35rem center/0.4rem 0.5rem;padding-right:1.2rem}.has-icon-left,.has-icon-right{position:relative}.has-icon-left .form-icon,.has-icon-right .form-icon{height:.8rem;margin:0 .25rem;position:absolute;top:50%;transform:translateY(-50%);width:.8rem;z-index:2}.has-icon-left .form-icon{left:.05rem}.has-icon-left .form-input{padding-left:1.3rem}.has-icon-right .form-icon{right:.05rem}.has-icon-right .form-input{padding-right:1.3rem}.form-checkbox,.form-radio,.form-switch{display:block;line-height:1.2rem;margin:.2rem 0;min-height:1.4rem;padding:.1rem .4rem .1rem 1.2rem;position:relative}.form-checkbox input,.form-radio input,.form-switch input{clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;position:absolute;width:1px}.form-checkbox input:focus+.form-icon,.form-radio input:focus+.form-icon,.form-switch input:focus+.form-icon{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2);border-color:#5755d9}.form-checkbox input:checked+.form-icon,.form-radio input:checked+.form-icon,.form-switch input:checked+.form-icon{background:#5755d9;border-color:#5755d9}.form-checkbox .form-icon,.form-radio .form-icon,.form-switch .form-icon{border:.05rem solid #bcc3ce;cursor:pointer;display:inline-block;position:absolute;transition:background .2s, border .2s, box-shadow .2s, color .2s}.form-checkbox.input-sm,.form-radio.input-sm,.form-switch.input-sm{font-size:.7rem;margin:0}.form-checkbox.input-lg,.form-radio.input-lg,.form-switch.input-lg{font-size:.9rem;margin:.3rem 0}.form-checkbox .form-icon,.form-radio .form-icon{background:#fff;height:.8rem;left:0;top:.3rem;width:.8rem}.form-checkbox input:active+.form-icon,.form-radio input:active+.form-icon{background:#eef0f3}.form-checkbox .form-icon{border-radius:.1rem}.form-checkbox input:checked+.form-icon::before{background-clip:padding-box;border:.1rem solid #fff;border-left-width:0;border-top-width:0;content:"";height:9px;left:50%;margin-left:-3px;margin-top:-6px;position:absolute;top:50%;transform:rotate(45deg);width:6px}.form-checkbox input:indeterminate+.form-icon{background:#5755d9;border-color:#5755d9}.form-checkbox input:indeterminate+.form-icon::before{background:#fff;content:"";height:2px;left:50%;margin-left:-5px;margin-top:-1px;position:absolute;top:50%;width:10px}.form-radio .form-icon{border-radius:50%}.form-radio input:checked+.form-icon::before{background:#fff;border-radius:50%;content:"";height:6px;left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);width:6px}.form-switch{padding-left:2rem}.form-switch .form-icon{background:#bcc3ce;background-clip:padding-box;border-radius:.45rem;height:.9rem;left:0;top:.25rem;width:1.6rem}.form-switch .form-icon::before{background:#fff;border-radius:50%;content:"";display:block;height:.8rem;left:0;position:absolute;top:0;transition:background .2s, border .2s, box-shadow .2s, color .2s, left .2s;width:.8rem}.form-switch input:checked+.form-icon::before{left:14px}.form-switch input:active+.form-icon::before{background:#f7f8f9}.input-group{display:flex}.input-group .input-group-addon{background:#f7f8f9;border:.05rem solid #bcc3ce;border-radius:.1rem;line-height:1.2rem;padding:.25rem .4rem;white-space:nowrap}.input-group .input-group-addon.addon-sm{font-size:.7rem;padding:.05rem .3rem}.input-group .input-group-addon.addon-lg{font-size:.9rem;padding:.35rem .6rem}.input-group .form-input,.input-group .form-select{flex:1 1 auto;width:1%}.input-group .input-group-btn{z-index:1}.input-group .form-input:first-child:not(:last-child),.input-group .form-select:first-child:not(:last-child),.input-group .input-group-addon:first-child:not(:last-child),.input-group .input-group-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group .form-input:not(:first-child):not(:last-child),.input-group .form-select:not(:first-child):not(:last-child),.input-group .input-group-addon:not(:first-child):not(:last-child),.input-group .input-group-btn:not(:first-child):not(:last-child){border-radius:0;margin-left:-.05rem}.input-group .form-input:last-child:not(:first-child),.input-group .form-select:last-child:not(:first-child),.input-group .input-group-addon:last-child:not(:first-child),.input-group .input-group-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-.05rem}.input-group .form-input:focus,.input-group .form-select:focus,.input-group .input-group-addon:focus,.input-group .input-group-btn:focus{z-index:2}.input-group .form-select{width:auto}.input-group.input-inline{display:inline-flex}.has-success .form-input,.form-input.is-success,.has-success .form-select,.form-select.is-success{background:#f9fdfa;border-color:#32b643}.has-success .form-input:focus,.form-input.is-success:focus,.has-success .form-select:focus,.form-select.is-success:focus{box-shadow:0 0 0 0.1rem rgba(50,182,67,0.2)}.has-error .form-input,.form-input.is-error,.has-error .form-select,.form-select.is-error{background:#fffaf7;border-color:#e85600}.has-error .form-input:focus,.form-input.is-error:focus,.has-error .form-select:focus,.form-select.is-error:focus{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2)}.has-error .form-checkbox .form-icon,.form-checkbox.is-error .form-icon,.has-error .form-radio .form-icon,.form-radio.is-error .form-icon,.has-error .form-switch .form-icon,.form-switch.is-error .form-icon{border-color:#e85600}.has-error .form-checkbox input:checked+.form-icon,.form-checkbox.is-error input:checked+.form-icon,.has-error .form-radio input:checked+.form-icon,.form-radio.is-error input:checked+.form-icon,.has-error .form-switch input:checked+.form-icon,.form-switch.is-error input:checked+.form-icon{background:#e85600;border-color:#e85600}.has-error .form-checkbox input:focus+.form-icon,.form-checkbox.is-error input:focus+.form-icon,.has-error .form-radio input:focus+.form-icon,.form-radio.is-error input:focus+.form-icon,.has-error .form-switch input:focus+.form-icon,.form-switch.is-error input:focus+.form-icon{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2);border-color:#e85600}.has-error .form-checkbox input:indeterminate+.form-icon,.form-checkbox.is-error input:indeterminate+.form-icon{background:#e85600;border-color:#e85600}.form-input:not(:placeholder-shown):invalid{border-color:#e85600}.form-input:not(:placeholder-shown):invalid:focus{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2);background:#fffaf7}.form-input:not(:placeholder-shown):invalid+.form-input-hint{color:#e85600}.form-input:disabled,.form-input.disabled,.form-select:disabled,.form-select.disabled{background-color:#eef0f3;cursor:not-allowed;opacity:.5}.form-input[readonly]{background-color:#f7f8f9}input:disabled+.form-icon,input.disabled+.form-icon{background:#eef0f3;cursor:not-allowed;opacity:.5}.form-switch input:disabled+.form-icon::before,.form-switch input.disabled+.form-icon::before{background:#fff}.form-horizontal{padding:.4rem 0}.form-horizontal .form-group{display:flex;flex-wrap:wrap}.form-inline{display:inline-block}.label{border-radius:.1rem;line-height:1.25;padding:.1rem .2rem;background:#eef0f3;color:#455060;display:inline-block}.label.label-rounded{border-radius:5rem;padding-left:.4rem;padding-right:.4rem}.label.label-primary{background:#5755d9;color:#fff}.label.label-secondary{background:#f1f1fc;color:#5755d9}.label.label-success{background:#32b643;color:#fff}.label.label-warning{background:#ffb700;color:#fff}.label.label-error{background:#e85600;color:#fff}code{border-radius:.1rem;line-height:1.25;padding:.1rem .2rem;background:#fcf2f2;color:#d73e48;font-size:85%}.code{border-radius:.1rem;color:#3b4351;position:relative}.code::before{color:#bcc3ce;content:attr(data-lang);font-size:.7rem;position:absolute;right:.4rem;top:.1rem}.code code{background:#f7f8f9;color:inherit;display:block;line-height:1.5;overflow-x:auto;padding:1rem;width:100%}.img-responsive{display:block;height:auto;max-width:100%}.img-fit-cover{object-fit:cover}.img-fit-contain{object-fit:contain}.video-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.video-responsive::before{content:"";display:block;padding-bottom:56.25%}.video-responsive iframe,.video-responsive object,.video-responsive embed{border:0;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}video.video-responsive{height:auto;max-width:100%}video.video-responsive::before{content:none}.video-responsive-4-3::before{padding-bottom:75%}.video-responsive-1-1::before{padding-bottom:100%}.figure{margin:0 0 .4rem 0}.figure .figure-caption{color:#66758c;margin-top:.4rem}.container{margin-left:auto;margin-right:auto;padding-left:.4rem;padding-right:.4rem;width:100%}.container.grid-xl{max-width:1296px}.container.grid-lg{max-width:976px}.container.grid-md{max-width:856px}.container.grid-sm{max-width:616px}.container.grid-xs{max-width:496px}.show-xs,.show-sm,.show-md,.show-lg,.show-xl{display:none !important}.columns{display:flex;flex-wrap:wrap;margin-left:-.4rem;margin-right:-.4rem}.columns.col-gapless{margin-left:0;margin-right:0}.columns.col-gapless>.column{padding-left:0;padding-right:0}.columns.col-oneline{flex-wrap:nowrap;overflow-x:auto}.column{flex:1;max-width:100%;padding-left:.4rem;padding-right:.4rem}.column.col-12,.column.col-11,.column.col-10,.column.col-9,.column.col-8,.column.col-7,.column.col-6,.column.col-5,.column.col-4,.column.col-3,.column.col-2,.column.col-1,.column.col-auto{flex:none}.col-12{width:100%}.col-11{width:91.66666667%}.col-10{width:83.33333333%}.col-9{width:75%}.col-8{width:66.66666667%}.col-7{width:58.33333333%}.col-6{width:50%}.col-5{width:41.66666667%}.col-4{width:33.33333333%}.col-3{width:25%}.col-2{width:16.66666667%}.col-1{width:8.33333333%}.col-auto{flex:0 0 auto;max-width:none;width:auto}.col-mx-auto{margin-left:auto;margin-right:auto}.col-ml-auto{margin-left:auto}.col-mr-auto{margin-right:auto}@media (max-width: 1280px){.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-xl-auto{flex:none}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-auto{width:auto}.hide-xl{display:none !important}.show-xl{display:block !important}}@media (max-width: 960px){.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-lg-auto{flex:none}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-auto{width:auto}.hide-lg{display:none !important}.show-lg{display:block !important}}@media (max-width: 840px){.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-md-auto{flex:none}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-auto{width:auto}.hide-md{display:none !important}.show-md{display:block !important}}@media (max-width: 600px){.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col-sm-auto{flex:none}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-auto{width:auto}.hide-sm{display:none !important}.show-sm{display:block !important}}@media (max-width: 480px){.col-xs-12,.col-xs-11,.col-xs-10,.col-xs-9,.col-xs-8,.col-xs-7,.col-xs-6,.col-xs-5,.col-xs-4,.col-xs-3,.col-xs-2,.col-xs-1,.col-xs-auto{flex:none}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-auto{width:auto}.hide-xs{display:none !important}.show-xs{display:block !important}}.hero{display:flex;flex-direction:column;justify-content:space-between;padding-bottom:4rem;padding-top:4rem}.hero.hero-sm{padding-bottom:2rem;padding-top:2rem}.hero.hero-lg{padding-bottom:8rem;padding-top:8rem}.hero .hero-body{padding:.4rem}.navbar{align-items:stretch;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar .navbar-section{align-items:center;display:flex;flex:1 0 0}.navbar .navbar-section:not(:first-child):last-child{justify-content:flex-end}.navbar .navbar-center{align-items:center;display:flex;flex:0 0 auto}.navbar .navbar-brand{font-size:.9rem;text-decoration:none}.accordion input:checked~.accordion-header .icon,.accordion[open] .accordion-header .icon{transform:rotate(90deg)}.accordion input:checked~.accordion-body,.accordion[open] .accordion-body{max-height:50rem}.accordion .accordion-header{display:block;padding:.2rem .4rem}.accordion .accordion-header .icon{transition:transform .25s}.accordion .accordion-body{margin-bottom:.4rem;max-height:0;overflow:hidden;transition:max-height .25s}summary.accordion-header::-webkit-details-marker{display:none}.avatar{font-size:.8rem;height:1.6rem;width:1.6rem;background:#5755d9;border-radius:50%;color:rgba(255,255,255,0.85);display:inline-block;font-weight:300;line-height:1.25;margin:0;position:relative;vertical-align:middle}.avatar.avatar-xs{font-size:.4rem;height:.8rem;width:.8rem}.avatar.avatar-sm{font-size:.6rem;height:1.2rem;width:1.2rem}.avatar.avatar-lg{font-size:1.2rem;height:2.4rem;width:2.4rem}.avatar.avatar-xl{font-size:1.6rem;height:3.2rem;width:3.2rem}.avatar img{border-radius:50%;height:100%;position:relative;width:100%;z-index:1}.avatar .avatar-icon,.avatar .avatar-presence{background:#fff;bottom:14.64%;height:50%;padding:.1rem;position:absolute;right:14.64%;transform:translate(50%, 50%);width:50%;z-index:2}.avatar .avatar-presence{background:#bcc3ce;box-shadow:0 0 0 .1rem #fff;border-radius:50%;height:.5em;width:.5em}.avatar .avatar-presence.online{background:#32b643}.avatar .avatar-presence.busy{background:#e85600}.avatar .avatar-presence.away{background:#ffb700}.avatar[data-initial]::before{color:currentColor;content:attr(data-initial);left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:1}.badge{position:relative;white-space:nowrap}.badge[data-badge]::after,.badge:not([data-badge])::after{background:#5755d9;background-clip:padding-box;border-radius:.5rem;box-shadow:0 0 0 0.1rem #fff;color:#fff;content:attr(data-badge);display:inline-block;transform:translate(-0.05rem, -0.5rem)}.badge[data-badge]::after{font-size:.7rem;height:.9rem;line-height:1;min-width:.9rem;padding:.1rem .2rem;text-align:center;white-space:nowrap}.badge:not([data-badge])::after,.badge[data-badge=""]::after{height:6px;min-width:6px;padding:0;width:6px}.badge.btn::after{position:absolute;top:0;right:0;transform:translate(50%, -50%)}.badge.avatar::after{position:absolute;top:14.64%;right:14.64%;transform:translate(50%, -50%);z-index:100}.breadcrumb{list-style:none;margin:.2rem 0;padding:.2rem 0}.breadcrumb .breadcrumb-item{color:#66758c;display:inline-block;margin:0;padding:.2rem 0}.breadcrumb .breadcrumb-item:not(:last-child){margin-right:.2rem}.breadcrumb .breadcrumb-item:not(:last-child) a{color:#66758c}.breadcrumb .breadcrumb-item:not(:first-child)::before{color:#66758c;content:"/";padding-right:.4rem}.bar{background:#eef0f3;border-radius:.1rem;display:flex;flex-wrap:nowrap;height:.8rem;width:100%}.bar.bar-sm{height:.2rem}.bar .bar-item{background:#5755d9;color:#fff;display:block;font-size:.7rem;flex-shrink:0;line-height:.8rem;height:100%;position:relative;text-align:center;width:0}.bar .bar-item:first-child{border-bottom-left-radius:.1rem;border-top-left-radius:.1rem}.bar .bar-item:last-child{border-bottom-right-radius:.1rem;border-top-right-radius:.1rem;flex-shrink:1}.bar-slider{height:.1rem;margin:.4rem 0;position:relative}.bar-slider .bar-item{left:0;padding:0;position:absolute}.bar-slider .bar-item:not(:last-child):first-child{background:#eef0f3;z-index:1}.bar-slider .bar-slider-btn{background:#5755d9;border:0;border-radius:50%;height:.6rem;padding:0;position:absolute;right:0;top:50%;transform:translate(50%, -50%);width:.6rem}.bar-slider .bar-slider-btn:active{box-shadow:0 0 0 0.1rem #5755d9}.card{background:#fff;border:.05rem solid #dadee4;border-radius:.1rem;display:flex;flex-direction:column}.card .card-header,.card .card-body,.card .card-footer{padding:.8rem;padding-bottom:0}.card .card-header:last-child,.card .card-body:last-child,.card .card-footer:last-child{padding-bottom:.8rem}.card .card-body{flex:1 1 auto}.card .card-image{padding-top:.8rem}.card .card-image:first-child{padding-top:0}.card .card-image:first-child img{border-top-left-radius:.1rem;border-top-right-radius:.1rem}.card .card-image:last-child img{border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem}.chip{align-items:center;background:#eef0f3;border-radius:5rem;display:inline-flex;font-size:90%;height:1.2rem;line-height:.8rem;margin:.1rem;max-width:320px;overflow:hidden;padding:.2rem .4rem;text-decoration:none;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.chip.active{background:#5755d9;color:#fff}.chip .avatar{margin-left:-.4rem;margin-right:.2rem}.chip .btn-clear{border-radius:50%;transform:scale(0.75)}.dropdown{display:inline-block;position:relative}.dropdown .menu{animation:slide-down .15s ease 1;display:none;left:0;max-height:50vh;overflow-y:auto;position:absolute;top:100%}.dropdown.dropdown-right .menu{left:auto;right:0}.dropdown.active .menu,.dropdown .dropdown-toggle:focus+.menu,.dropdown .menu:hover{display:block}.dropdown .btn-group .dropdown-toggle:nth-last-child(2){border-bottom-right-radius:.1rem;border-top-right-radius:.1rem}.empty{background:#f7f8f9;border-radius:.1rem;color:#66758c;text-align:center;padding:3.2rem 1.6rem}.empty .empty-icon{margin-bottom:.8rem}.empty .empty-title,.empty .empty-subtitle{margin:.4rem auto}.empty .empty-action{margin-top:.8rem}.menu{box-shadow:0 .05rem .2rem rgba(48,55,66,0.3);background:#fff;border-radius:.1rem;list-style:none;margin:0;min-width:180px;padding:.4rem;transform:translateY(.2rem);z-index:300}.menu.menu-nav{background:transparent;box-shadow:none}.menu .menu-item{margin-top:0;padding:0 .4rem;position:relative;text-decoration:none}.menu .menu-item>a{border-radius:.1rem;color:inherit;display:block;margin:0 -.4rem;padding:.2rem .4rem;text-decoration:none}.menu .menu-item>a:focus,.menu .menu-item>a:hover{background:#f1f1fc;color:#5755d9}.menu .menu-item>a:active,.menu .menu-item>a.active{background:#f1f1fc;color:#5755d9}.menu .menu-item .form-checkbox,.menu .menu-item .form-radio,.menu .menu-item .form-switch{margin:.1rem 0}.menu .menu-item+.menu-item{margin-top:.2rem}.menu .menu-badge{align-items:center;display:flex;height:100%;position:absolute;right:0;top:0}.menu .menu-badge .label{margin-right:.4rem}.modal{align-items:center;bottom:0;display:none;justify-content:center;left:0;opacity:0;overflow:hidden;padding:.4rem;position:fixed;right:0;top:0}.modal:target,.modal.active{display:flex;opacity:1;z-index:400}.modal:target .modal-overlay,.modal.active .modal-overlay{background:rgba(247,248,249,0.75);bottom:0;cursor:default;display:block;left:0;position:absolute;right:0;top:0}.modal:target .modal-container,.modal.active .modal-container{animation:slide-down .2s ease 1;z-index:1}.modal.modal-sm .modal-container{max-width:320px;padding:0 .4rem}.modal.modal-lg .modal-overlay{background:#fff}.modal.modal-lg .modal-container{box-shadow:none;max-width:960px}.modal-container{box-shadow:0 .2rem .5rem rgba(48,55,66,0.3);background:#fff;border-radius:.1rem;display:flex;flex-direction:column;max-height:75vh;max-width:640px;padding:0 .8rem;width:100%}.modal-container.modal-fullheight{max-height:100vh}.modal-container .modal-header{color:#303742;padding:.8rem}.modal-container .modal-body{overflow-y:auto;padding:.8rem;position:relative}.modal-container .modal-footer{padding:.8rem;text-align:right}.nav{display:flex;flex-direction:column;list-style:none;margin:.2rem 0}.nav .nav-item a{color:#66758c;padding:.2rem .4rem;text-decoration:none}.nav .nav-item a:focus,.nav .nav-item a:hover{color:#5755d9}.nav .nav-item.active>a{color:#505c6e;font-weight:bold}.nav .nav-item.active>a:focus,.nav .nav-item.active>a:hover{color:#5755d9}.nav .nav{margin-bottom:.4rem;margin-left:.8rem}.pagination{display:flex;list-style:none;margin:.2rem 0;padding:.2rem 0}.pagination .page-item{margin:.2rem .05rem}.pagination .page-item span{display:inline-block;padding:.2rem .2rem}.pagination .page-item a{border-radius:.1rem;display:inline-block;padding:.2rem .4rem;text-decoration:none}.pagination .page-item a:focus,.pagination .page-item a:hover{color:#5755d9}.pagination .page-item.disabled a{cursor:default;opacity:.5;pointer-events:none}.pagination .page-item.active a{background:#5755d9;color:#fff}.pagination .page-item.page-prev,.pagination .page-item.page-next{flex:1 0 50%}.pagination .page-item.page-next{text-align:right}.pagination .page-item .page-item-title{margin:0}.pagination .page-item .page-item-subtitle{margin:0;opacity:.5}.panel{border:.05rem solid #dadee4;border-radius:.1rem;display:flex;flex-direction:column}.panel .panel-header,.panel .panel-footer{flex:0 0 auto;padding:.8rem}.panel .panel-nav{flex:0 0 auto}.panel .panel-body{flex:1 1 auto;overflow-y:auto;padding:0 .8rem}.popover{display:inline-block;position:relative}.popover .popover-container{left:50%;opacity:0;padding:.4rem;position:absolute;top:0;transform:translate(-50%, -50%) scale(0);transition:transform .2s;width:320px;z-index:300}.popover *:focus+.popover-container,.popover:hover .popover-container{display:block;opacity:1;transform:translate(-50%, -100%) scale(1)}.popover.popover-right .popover-container{left:100%;top:50%}.popover.popover-right *:focus+.popover-container,.popover.popover-right:hover .popover-container{transform:translate(0, -50%) scale(1)}.popover.popover-bottom .popover-container{left:50%;top:100%}.popover.popover-bottom *:focus+.popover-container,.popover.popover-bottom:hover .popover-container{transform:translate(-50%, 0) scale(1)}.popover.popover-left .popover-container{left:0;top:50%}.popover.popover-left *:focus+.popover-container,.popover.popover-left:hover .popover-container{transform:translate(-100%, -50%) scale(1)}.popover .card{box-shadow:0 .2rem .5rem rgba(48,55,66,0.3);border:0}.step{display:flex;flex-wrap:nowrap;list-style:none;margin:.2rem 0;width:100%}.step .step-item{flex:1 1 0;margin-top:0;min-height:1rem;text-align:center;position:relative}.step .step-item:not(:first-child)::before{background:#5755d9;content:"";height:2px;left:-50%;position:absolute;top:9px;width:100%}.step .step-item a{color:#5755d9;display:inline-block;padding:20px 10px 0;text-decoration:none}.step .step-item a::before{background:#5755d9;border:.1rem solid #fff;border-radius:50%;content:"";display:block;height:.6rem;left:50%;position:absolute;top:.2rem;transform:translateX(-50%);width:.6rem;z-index:1}.step .step-item.active a::before{background:#fff;border:.1rem solid #5755d9}.step .step-item.active~.step-item::before{background:#dadee4}.step .step-item.active~.step-item a{color:#bcc3ce}.step .step-item.active~.step-item a::before{background:#dadee4}.tab{align-items:center;border-bottom:.05rem solid #dadee4;display:flex;flex-wrap:wrap;list-style:none;margin:.2rem 0 .15rem 0}.tab .tab-item{margin-top:0}.tab .tab-item a{border-bottom:.1rem solid transparent;color:inherit;display:block;margin:0 .4rem 0 0;padding:.4rem .2rem .3rem .2rem;text-decoration:none}.tab .tab-item a:focus,.tab .tab-item a:hover{color:#5755d9}.tab .tab-item.active a,.tab .tab-item a.active{border-bottom-color:#5755d9;color:#5755d9}.tab .tab-item.tab-action{flex:1 0 auto;text-align:right}.tab .tab-item .btn-clear{margin-top:-.2rem}.tab.tab-block .tab-item{flex:1 0 0;text-align:center}.tab.tab-block .tab-item a{margin:0}.tab.tab-block .tab-item .badge[data-badge]::after{position:absolute;right:.1rem;top:.1rem;transform:translate(0, 0)}.tab:not(.tab-block) .badge{padding-right:0}.tile{align-content:space-between;align-items:flex-start;display:flex}.tile .tile-icon,.tile .tile-action{flex:0 0 auto}.tile .tile-content{flex:1 1 auto}.tile .tile-content:not(:first-child){padding-left:.4rem}.tile .tile-content:not(:last-child){padding-right:.4rem}.tile .tile-title,.tile .tile-subtitle{line-height:1.2rem}.tile.tile-centered{align-items:center}.tile.tile-centered .tile-content{overflow:hidden}.tile.tile-centered .tile-title,.tile.tile-centered .tile-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:0}.toast{background:rgba(48,55,66,0.95);border-color:#303742;border:.05rem solid #303742;border-radius:.1rem;color:#fff;display:block;padding:.4rem;width:100%}.toast.toast-primary{background:rgba(87,85,217,0.95);border-color:#5755d9}.toast.toast-success{background:rgba(50,182,67,0.95);border-color:#32b643}.toast.toast-warning{background:rgba(255,183,0,0.95);border-color:#ffb700}.toast.toast-error{background:rgba(232,86,0,0.95);border-color:#e85600}.toast a{color:#fff;text-decoration:underline}.toast a:focus,.toast a:hover,.toast a:active,.toast a.active{opacity:.75}.toast .btn-clear{margin:.1rem}.toast p:last-child{margin-bottom:0}.tooltip{position:relative}.tooltip::after{background:rgba(48,55,66,0.95);border-radius:.1rem;bottom:100%;color:#fff;content:attr(data-tooltip);display:block;font-size:.7rem;left:50%;max-width:320px;opacity:0;overflow:hidden;padding:.2rem .4rem;pointer-events:none;position:absolute;text-overflow:ellipsis;transform:translate(-50%, .4rem);transition:opacity .2s, transform .2s;white-space:pre;z-index:300}.tooltip:focus::after,.tooltip:hover::after{opacity:1;transform:translate(-50%, -.2rem)}.tooltip[disabled],.tooltip.disabled{pointer-events:auto}.tooltip.tooltip-right::after{bottom:50%;left:100%;transform:translate(-.2rem, 50%)}.tooltip.tooltip-right:focus::after,.tooltip.tooltip-right:hover::after{transform:translate(.2rem, 50%)}.tooltip.tooltip-bottom::after{bottom:auto;top:100%;transform:translate(-50%, -.4rem)}.tooltip.tooltip-bottom:focus::after,.tooltip.tooltip-bottom:hover::after{transform:translate(-50%, .2rem)}.tooltip.tooltip-left::after{bottom:50%;left:auto;right:100%;transform:translate(.4rem, 50%)}.tooltip.tooltip-left:focus::after,.tooltip.tooltip-left:hover::after{transform:translate(-.2rem, 50%)}@keyframes loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes slide-down{0%{opacity:0;transform:translateY(-1.6rem)}100%{opacity:1;transform:translateY(0)}}.text-primary{color:#5755d9 !important}a.text-primary:focus,a.text-primary:hover{color:#4240d4}a.text-primary:visited{color:#6c6ade}.text-secondary{color:#e5e5f9 !important}a.text-secondary:focus,a.text-secondary:hover{color:#d1d0f4}a.text-secondary:visited{color:#fafafe}.text-gray{color:#bcc3ce !important}a.text-gray:focus,a.text-gray:hover{color:#adb6c4}a.text-gray:visited{color:#cbd0d9}.text-light{color:#fff !important}a.text-light:focus,a.text-light:hover{color:#f2f2f2}a.text-light:visited{color:#fff}.text-dark{color:#3b4351 !important}a.text-dark:focus,a.text-dark:hover{color:#303742}a.text-dark:visited{color:#455060}.text-success{color:#32b643 !important}a.text-success:focus,a.text-success:hover{color:#2da23c}a.text-success:visited{color:#39c94b}.text-warning{color:#ffb700 !important}a.text-warning:focus,a.text-warning:hover{color:#e6a500}a.text-warning:visited{color:#ffbe1a}.text-error{color:#e85600 !important}a.text-error:focus,a.text-error:hover{color:#cf4d00}a.text-error:visited{color:#ff6003}.bg-primary{background:#5755d9 !important;color:#fff}.bg-secondary{background:#f1f1fc !important}.bg-dark{background:#303742 !important;color:#fff}.bg-gray{background:#f7f8f9 !important}.bg-success{background:#32b643 !important;color:#fff}.bg-warning{background:#ffb700 !important;color:#fff}.bg-error{background:#e85600 !important;color:#fff}.c-hand{cursor:pointer}.c-move{cursor:move}.c-zoom-in{cursor:zoom-in}.c-zoom-out{cursor:zoom-out}.c-not-allowed{cursor:not-allowed}.c-auto{cursor:auto}.d-block{display:block}.d-inline{display:inline}.d-inline-block{display:inline-block}.d-flex{display:flex}.d-inline-flex{display:inline-flex}.d-none,.d-hide{display:none !important}.d-visible{visibility:visible}.d-invisible{visibility:hidden}.text-hide{background:transparent;border:0;color:transparent;font-size:0;line-height:0;text-shadow:none}.text-assistive{border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.divider,.divider-vert{display:block;position:relative}.divider[data-content]::after,.divider-vert[data-content]::after{background:#fff;color:#bcc3ce;content:attr(data-content);display:inline-block;font-size:.7rem;padding:0 .4rem;transform:translateY(-.65rem)}.divider{border-top:.05rem solid #f1f3f5;height:.05rem;margin:.4rem 0}.divider[data-content]{margin:.8rem 0}.divider-vert{display:block;padding:.8rem}.divider-vert::before{border-left:.05rem solid #dadee4;bottom:.4rem;content:"";display:block;left:50%;position:absolute;top:.4rem;transform:translateX(-50%)}.divider-vert[data-content]::after{left:50%;padding:.2rem 0;position:absolute;top:50%;transform:translate(-50%, -50%)}.loading{color:transparent !important;min-height:.8rem;pointer-events:none;position:relative}.loading::after{animation:loading 500ms infinite linear;border:.1rem solid #5755d9;border-radius:50%;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:.8rem;left:50%;margin-left:-.4rem;margin-top:-.4rem;position:absolute;top:50%;width:.8rem;z-index:1}.loading.loading-lg{min-height:2rem}.loading.loading-lg::after{height:1.6rem;margin-left:-.8rem;margin-top:-.8rem;width:1.6rem}.clearfix::after{clear:both;content:"";display:table}.float-left{float:left !important}.float-right{float:right !important}.p-relative{position:relative !important}.p-absolute{position:absolute !important}.p-fixed{position:fixed !important}.p-sticky{position:sticky !important}.p-centered{display:block;float:none;margin-left:auto;margin-right:auto}.flex-centered{align-items:center;display:flex;justify-content:center}.m-0{margin:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mr-0{margin-right:0 !important}.mt-0{margin-top:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-bottom:0 !important;margin-top:0 !important}.m-1{margin:.2rem !important}.mb-1{margin-bottom:.2rem !important}.ml-1{margin-left:.2rem !important}.mr-1{margin-right:.2rem !important}.mt-1{margin-top:.2rem !important}.mx-1{margin-left:.2rem !important;margin-right:.2rem !important}.my-1{margin-bottom:.2rem !important;margin-top:.2rem !important}.m-2{margin:.4rem !important}.mb-2{margin-bottom:.4rem !important}.ml-2{margin-left:.4rem !important}.mr-2{margin-right:.4rem !important}.mt-2{margin-top:.4rem !important}.mx-2{margin-left:.4rem !important;margin-right:.4rem !important}.my-2{margin-bottom:.4rem !important;margin-top:.4rem !important}.p-0{padding:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.pr-0{padding-right:0 !important}.pt-0{padding-top:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-bottom:0 !important;padding-top:0 !important}.p-1{padding:.2rem !important}.pb-1{padding-bottom:.2rem !important}.pl-1{padding-left:.2rem !important}.pr-1{padding-right:.2rem !important}.pt-1{padding-top:.2rem !important}.px-1{padding-left:.2rem !important;padding-right:.2rem !important}.py-1{padding-bottom:.2rem !important;padding-top:.2rem !important}.p-2{padding:.4rem !important}.pb-2{padding-bottom:.4rem !important}.pl-2{padding-left:.4rem !important}.pr-2{padding-right:.4rem !important}.pt-2{padding-top:.4rem !important}.px-2{padding-left:.4rem !important;padding-right:.4rem !important}.py-2{padding-bottom:.4rem !important;padding-top:.4rem !important}.s-rounded{border-radius:.1rem}.s-circle{border-radius:50%}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-normal{font-weight:normal}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-large{font-size:1.2em}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-clip{overflow:hidden;text-overflow:clip;white-space:nowrap}.text-break{hyphens:auto;word-break:break-word;word-wrap:break-word} +/*! Spectre.css v0.5.8 | MIT License | github.com/picturepan2/spectre */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}hr{box-sizing:content-box;height:0;overflow:visible}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}address{font-style:normal}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:"SF Mono","Segoe UI Mono","Roboto Mono",Menlo,Courier,monospace;font-size:1em}dfn{font-style:italic}small{font-size:80%;font-weight:400}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}fieldset{border:0;margin:0;padding:0}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item;outline:none}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,*::before,*::after{box-sizing:inherit}html{box-sizing:border-box;font-size:20px;line-height:1.5;-webkit-tap-highlight-color:transparent}body{background:#fff;color:#3b4351;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;font-size:.8rem;overflow-x:hidden;text-rendering:optimizeLegibility}a{color:#5755d9;outline:none;text-decoration:none}a:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2)}a:focus,a:hover,a:active,a.active{color:#302ecd;text-decoration:underline}a:visited{color:#807fe2}h1,h2,h3,h4,h5,h6{color:inherit;font-weight:500;line-height:1.2;margin-bottom:.5em;margin-top:0}.h1,.h2,.h3,.h4,.h5,.h6{font-weight:500}h1,.h1{font-size:2rem}h2,.h2{font-size:1.6rem}h3,.h3{font-size:1.4rem}h4,.h4{font-size:1.2rem}h5,.h5{font-size:1rem}h6,.h6{font-size:.8rem}p{margin:0 0 1.2rem}a,ins,u{text-decoration-skip:ink edges}abbr[title]{border-bottom:.05rem dotted;cursor:help;text-decoration:none}kbd{border-radius:.1rem;line-height:1.25;padding:.1rem .2rem;background:#303742;color:#fff;font-size:.7rem}mark{background:#ffe9b3;color:#3b4351;border-bottom:.05rem solid #ffd367;border-radius:.1rem;padding:.05rem .1rem 0}blockquote{border-left:.1rem solid #dadee4;margin-left:0;padding:.4rem .8rem}blockquote p:last-child{margin-bottom:0}ul,ol{margin:.8rem 0 .8rem .8rem;padding:0}ul ul,ul ol,ol ul,ol ol{margin:.8rem 0 .8rem .8rem}ul li,ol li{margin-top:.4rem}ul{list-style:disc inside}ul ul{list-style-type:circle}ol{list-style:decimal inside}ol ol{list-style-type:lower-alpha}dl dt{font-weight:bold}dl dd{margin:.4rem 0 .8rem 0}html:lang(zh),html:lang(zh-Hans),.lang-zh,.lang-zh-hans{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Helvetica Neue",sans-serif}html:lang(zh-Hant),.lang-zh-hant{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang TC","Hiragino Sans CNS","Microsoft JhengHei","Helvetica Neue",sans-serif}html:lang(ja),.lang-ja{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Hiragino Sans","Hiragino Kaku Gothic Pro","Yu Gothic",YuGothic,Meiryo,"Helvetica Neue",sans-serif}html:lang(ko),.lang-ko{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Malgun Gothic","Helvetica Neue",sans-serif}:lang(zh) ins,:lang(zh) u,:lang(ja) ins,:lang(ja) u,.lang-cjk ins,.lang-cjk u{border-bottom:.05rem solid;text-decoration:none}:lang(zh) del+del,:lang(zh) del+s,:lang(zh) ins+ins,:lang(zh) ins+u,:lang(zh) s+del,:lang(zh) s+s,:lang(zh) u+ins,:lang(zh) u+u,:lang(ja) del+del,:lang(ja) del+s,:lang(ja) ins+ins,:lang(ja) ins+u,:lang(ja) s+del,:lang(ja) s+s,:lang(ja) u+ins,:lang(ja) u+u,.lang-cjk del+del,.lang-cjk del+s,.lang-cjk ins+ins,.lang-cjk ins+u,.lang-cjk s+del,.lang-cjk s+s,.lang-cjk u+ins,.lang-cjk u+u{margin-left:.125em}.table{border-collapse:collapse;border-spacing:0;width:100%;text-align:left}.table.table-striped tbody tr:nth-of-type(odd){background:#f7f8f9}.table tbody tr.active,.table.table-striped tbody tr.active{background:#eef0f3}.table.table-hover tbody tr:hover{background:#eef0f3}.table.table-scroll{display:block;overflow-x:auto;padding-bottom:.75rem;white-space:nowrap}.table td,.table th{border-bottom:.05rem solid #dadee4;padding:.6rem .4rem}.table th{border-bottom-width:.1rem}.btn{appearance:none;background:#fff;border:.05rem solid #5755d9;border-radius:.1rem;color:#5755d9;cursor:pointer;display:inline-block;font-size:.8rem;height:1.8rem;line-height:1.2rem;outline:none;padding:.25rem .4rem;text-align:center;text-decoration:none;transition:background .2s, border .2s, box-shadow .2s, color .2s;user-select:none;vertical-align:middle;white-space:nowrap}.btn:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2)}.btn:focus,.btn:hover{background:#f1f1fc;border-color:#4b48d6;text-decoration:none}.btn:active,.btn.active{background:#4b48d6;border-color:#3634d2;color:#fff;text-decoration:none}.btn:active.loading::after,.btn.active.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn[disabled],.btn:disabled,.btn.disabled{cursor:default;opacity:.5;pointer-events:none}.btn.btn-primary{background:#5755d9;border-color:#4b48d6;color:#fff}.btn.btn-primary:focus,.btn.btn-primary:hover{background:#4240d4;border-color:#3634d2;color:#fff}.btn.btn-primary:active,.btn.btn-primary.active{background:#3a38d2;border-color:#302ecd;color:#fff}.btn.btn-primary.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn.btn-success{background:#32b643;border-color:#2faa3f;color:#fff}.btn.btn-success:focus{box-shadow:0 0 0 0.1rem rgba(50,182,67,0.2)}.btn.btn-success:focus,.btn.btn-success:hover{background:#30ae40;border-color:#2da23c;color:#fff}.btn.btn-success:active,.btn.btn-success.active{background:#2a9a39;border-color:#278e34;color:#fff}.btn.btn-success.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn.btn-error{background:#e85600;border-color:#d95000;color:#fff}.btn.btn-error:focus{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2)}.btn.btn-error:focus,.btn.btn-error:hover{background:#de5200;border-color:#cf4d00;color:#fff}.btn.btn-error:active,.btn.btn-error.active{background:#c44900;border-color:#b54300;color:#fff}.btn.btn-error.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn.btn-secondary{background:#f1f1fc;border-color:#e5e5f9;color:#fff}.btn.btn-secondary:focus{box-shadow:0 0 0 0.1rem rgba(241,241,252,0.2)}.btn.btn-secondary:focus,.btn.btn-secondary:hover{background:#e9e9fa;border-color:#dddcf7;color:#fff}.btn.btn-secondary:active,.btn.btn-secondary.active{background:#d5d4f5;border-color:#c8c8f3;color:#fff}.btn.btn-secondary.loading::after{border-bottom-color:#fff;border-left-color:#fff}.btn.btn-link{background:transparent;border-color:transparent;color:#5755d9}.btn.btn-link:focus,.btn.btn-link:hover,.btn.btn-link:active,.btn.btn-link.active{color:#302ecd}.btn.btn-sm{font-size:.7rem;height:1.4rem;padding:.05rem .3rem}.btn.btn-lg{font-size:.9rem;height:2rem;padding:.35rem .6rem}.btn.btn-block{display:block;width:100%}.btn.btn-action{width:1.8rem;padding-left:0;padding-right:0}.btn.btn-action.btn-sm{width:1.4rem}.btn.btn-action.btn-lg{width:2rem}.btn.btn-clear{background:transparent;border:0;color:currentColor;height:1rem;line-height:.8rem;margin-left:.2rem;margin-right:-2px;opacity:1;padding:.1rem;text-decoration:none;width:1rem}.btn.btn-clear:focus,.btn.btn-clear:hover{background:rgba(247,248,249,0.5);opacity:.95}.btn.btn-clear::before{content:"\2715"}.btn-group{display:inline-flex;flex-wrap:wrap}.btn-group .btn{flex:1 0 auto}.btn-group .btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group .btn:not(:first-child):not(:last-child){border-radius:0;margin-left:-.05rem}.btn-group .btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-.05rem}.btn-group .btn:focus,.btn-group .btn:hover,.btn-group .btn:active,.btn-group .btn.active{z-index:1}.btn-group.btn-group-block{display:flex}.btn-group.btn-group-block .btn{flex:1 0 0}.form-group:not(:last-child){margin-bottom:.4rem}fieldset{margin-bottom:.8rem}legend{font-size:.9rem;font-weight:500;margin-bottom:.8rem}.form-label{display:block;line-height:1.2rem;padding:.3rem 0}.form-label.label-sm{font-size:.7rem;padding:.1rem 0}.form-label.label-lg{font-size:.9rem;padding:.4rem 0}.form-input{appearance:none;background:#fff;background-image:none;border:.05rem solid #bcc3ce;border-radius:.1rem;color:#3b4351;display:block;font-size:.8rem;height:1.8rem;line-height:1.2rem;max-width:100%;outline:none;padding:.25rem .4rem;position:relative;transition:background .2s, border .2s, box-shadow .2s, color .2s;width:100%}.form-input:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2);border-color:#5755d9}.form-input::placeholder{color:#bcc3ce}.form-input.input-sm{font-size:.7rem;height:1.4rem;padding:.05rem .3rem}.form-input.input-lg{font-size:.9rem;height:2rem;padding:.35rem .6rem}.form-input.input-inline{display:inline-block;vertical-align:middle;width:auto}.form-input[type="file"]{height:auto}textarea.form-input,textarea.form-input.input-lg,textarea.form-input.input-sm{height:auto}.form-input-hint{color:#bcc3ce;font-size:.7rem;margin-top:.2rem}.has-success .form-input-hint,.is-success+.form-input-hint{color:#32b643}.has-error .form-input-hint,.is-error+.form-input-hint{color:#e85600}.form-select{appearance:none;border:.05rem solid #bcc3ce;border-radius:.1rem;color:inherit;font-size:.8rem;height:1.8rem;line-height:1.2rem;outline:none;padding:.25rem .4rem;vertical-align:middle;width:100%;background:#fff}.form-select:focus{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2);border-color:#5755d9}.form-select::-ms-expand{display:none}.form-select.select-sm{font-size:.7rem;height:1.4rem;padding:.05rem 1.1rem .05rem .3rem}.form-select.select-lg{font-size:.9rem;height:2rem;padding:.35rem 1.4rem .35rem .6rem}.form-select[size],.form-select[multiple]{height:auto;padding:.25rem .4rem}.form-select[size] option,.form-select[multiple] option{padding:.1rem .2rem}.form-select:not([multiple]):not([size]){background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%204%205'%3E%3Cpath%20fill='%23667189'%20d='M2%200L0%202h4zm0%205L0%203h4z'/%3E%3C/svg%3E") no-repeat right 0.35rem center/0.4rem 0.5rem;padding-right:1.2rem}.has-icon-left,.has-icon-right{position:relative}.has-icon-left .form-icon,.has-icon-right .form-icon{height:.8rem;margin:0 .25rem;position:absolute;top:50%;transform:translateY(-50%);width:.8rem;z-index:2}.has-icon-left .form-icon{left:.05rem}.has-icon-left .form-input{padding-left:1.3rem}.has-icon-right .form-icon{right:.05rem}.has-icon-right .form-input{padding-right:1.3rem}.form-checkbox,.form-radio,.form-switch{display:block;line-height:1.2rem;margin:.2rem 0;min-height:1.4rem;padding:.1rem .4rem .1rem 1.2rem;position:relative}.form-checkbox input,.form-radio input,.form-switch input{clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;position:absolute;width:1px}.form-checkbox input:focus+.form-icon,.form-radio input:focus+.form-icon,.form-switch input:focus+.form-icon{box-shadow:0 0 0 0.1rem rgba(87,85,217,0.2);border-color:#5755d9}.form-checkbox input:checked+.form-icon,.form-radio input:checked+.form-icon,.form-switch input:checked+.form-icon{background:#5755d9;border-color:#5755d9}.form-checkbox .form-icon,.form-radio .form-icon,.form-switch .form-icon{border:.05rem solid #bcc3ce;cursor:pointer;display:inline-block;position:absolute;transition:background .2s, border .2s, box-shadow .2s, color .2s}.form-checkbox.input-sm,.form-radio.input-sm,.form-switch.input-sm{font-size:.7rem;margin:0}.form-checkbox.input-lg,.form-radio.input-lg,.form-switch.input-lg{font-size:.9rem;margin:.3rem 0}.form-checkbox .form-icon,.form-radio .form-icon{background:#fff;height:.8rem;left:0;top:.3rem;width:.8rem}.form-checkbox input:active+.form-icon,.form-radio input:active+.form-icon{background:#eef0f3}.form-checkbox .form-icon{border-radius:.1rem}.form-checkbox input:checked+.form-icon::before{background-clip:padding-box;border:.1rem solid #fff;border-left-width:0;border-top-width:0;content:"";height:9px;left:50%;margin-left:-3px;margin-top:-6px;position:absolute;top:50%;transform:rotate(45deg);width:6px}.form-checkbox input:indeterminate+.form-icon{background:#5755d9;border-color:#5755d9}.form-checkbox input:indeterminate+.form-icon::before{background:#fff;content:"";height:2px;left:50%;margin-left:-5px;margin-top:-1px;position:absolute;top:50%;width:10px}.form-radio .form-icon{border-radius:50%}.form-radio input:checked+.form-icon::before{background:#fff;border-radius:50%;content:"";height:6px;left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);width:6px}.form-switch{padding-left:2rem}.form-switch .form-icon{background:#bcc3ce;background-clip:padding-box;border-radius:.45rem;height:.9rem;left:0;top:.25rem;width:1.6rem}.form-switch .form-icon::before{background:#fff;border-radius:50%;content:"";display:block;height:.8rem;left:0;position:absolute;top:0;transition:background .2s, border .2s, box-shadow .2s, color .2s, left .2s;width:.8rem}.form-switch input:checked+.form-icon::before{left:14px}.form-switch input:active+.form-icon::before{background:#f7f8f9}.input-group{display:flex}.input-group .input-group-addon{background:#f7f8f9;border:.05rem solid #bcc3ce;border-radius:.1rem;line-height:1.2rem;padding:.25rem .4rem;white-space:nowrap}.input-group .input-group-addon.addon-sm{font-size:.7rem;padding:.05rem .3rem}.input-group .input-group-addon.addon-lg{font-size:.9rem;padding:.35rem .6rem}.input-group .form-input,.input-group .form-select{flex:1 1 auto;width:1%}.input-group .input-group-btn{z-index:1}.input-group .form-input:first-child:not(:last-child),.input-group .form-select:first-child:not(:last-child),.input-group .input-group-addon:first-child:not(:last-child),.input-group .input-group-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group .form-input:not(:first-child):not(:last-child),.input-group .form-select:not(:first-child):not(:last-child),.input-group .input-group-addon:not(:first-child):not(:last-child),.input-group .input-group-btn:not(:first-child):not(:last-child){border-radius:0;margin-left:-.05rem}.input-group .form-input:last-child:not(:first-child),.input-group .form-select:last-child:not(:first-child),.input-group .input-group-addon:last-child:not(:first-child),.input-group .input-group-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-.05rem}.input-group .form-input:focus,.input-group .form-select:focus,.input-group .input-group-addon:focus,.input-group .input-group-btn:focus{z-index:2}.input-group .form-select{width:auto}.input-group.input-inline{display:inline-flex}.has-success .form-input,.form-input.is-success,.has-success .form-select,.form-select.is-success{background:#f9fdfa;border-color:#32b643}.has-success .form-input:focus,.form-input.is-success:focus,.has-success .form-select:focus,.form-select.is-success:focus{box-shadow:0 0 0 0.1rem rgba(50,182,67,0.2)}.has-error .form-input,.form-input.is-error,.has-error .form-select,.form-select.is-error{background:#fffaf7;border-color:#e85600}.has-error .form-input:focus,.form-input.is-error:focus,.has-error .form-select:focus,.form-select.is-error:focus{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2)}.has-error .form-checkbox .form-icon,.form-checkbox.is-error .form-icon,.has-error .form-radio .form-icon,.form-radio.is-error .form-icon,.has-error .form-switch .form-icon,.form-switch.is-error .form-icon{border-color:#e85600}.has-error .form-checkbox input:checked+.form-icon,.form-checkbox.is-error input:checked+.form-icon,.has-error .form-radio input:checked+.form-icon,.form-radio.is-error input:checked+.form-icon,.has-error .form-switch input:checked+.form-icon,.form-switch.is-error input:checked+.form-icon{background:#e85600;border-color:#e85600}.has-error .form-checkbox input:focus+.form-icon,.form-checkbox.is-error input:focus+.form-icon,.has-error .form-radio input:focus+.form-icon,.form-radio.is-error input:focus+.form-icon,.has-error .form-switch input:focus+.form-icon,.form-switch.is-error input:focus+.form-icon{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2);border-color:#e85600}.has-error .form-checkbox input:indeterminate+.form-icon,.form-checkbox.is-error input:indeterminate+.form-icon{background:#e85600;border-color:#e85600}.form-input:not(:placeholder-shown):invalid{border-color:#e85600}.form-input:not(:placeholder-shown):invalid:focus{box-shadow:0 0 0 0.1rem rgba(232,86,0,0.2);background:#fffaf7}.form-input:not(:placeholder-shown):invalid+.form-input-hint{color:#e85600}.form-input:disabled,.form-input.disabled,.form-select:disabled,.form-select.disabled{background-color:#eef0f3;cursor:not-allowed;opacity:.5}.form-input[readonly]{background-color:#f7f8f9}input:disabled+.form-icon,input.disabled+.form-icon{background:#eef0f3;cursor:not-allowed;opacity:.5}.form-switch input:disabled+.form-icon::before,.form-switch input.disabled+.form-icon::before{background:#fff}.form-horizontal{padding:.4rem 0}.form-horizontal .form-group{display:flex;flex-wrap:wrap}.form-inline{display:inline-block}.label{border-radius:.1rem;line-height:1.25;padding:.1rem .2rem;background:#eef0f3;color:#455060;display:inline-block}.label.label-rounded{border-radius:5rem;padding-left:.4rem;padding-right:.4rem}.label.label-primary{background:#5755d9;color:#fff}.label.label-secondary{background:#f1f1fc;color:#5755d9}.label.label-success{background:#32b643;color:#fff}.label.label-warning{background:#ffb700;color:#fff}.label.label-error{background:#e85600;color:#fff}code{border-radius:.1rem;line-height:1.25;padding:.1rem .2rem;background:#fcf2f2;color:#d73e48;font-size:85%}.code{border-radius:.1rem;color:#3b4351;position:relative}.code::before{color:#bcc3ce;content:attr(data-lang);font-size:.7rem;position:absolute;right:.4rem;top:.1rem}.code code{background:#f7f8f9;color:inherit;display:block;line-height:1.5;overflow-x:auto;padding:1rem;width:100%}.img-responsive{display:block;height:auto;max-width:100%}.img-fit-cover{object-fit:cover}.img-fit-contain{object-fit:contain}.video-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.video-responsive::before{content:"";display:block;padding-bottom:56.25%}.video-responsive iframe,.video-responsive object,.video-responsive embed{border:0;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}video.video-responsive{height:auto;max-width:100%}video.video-responsive::before{content:none}.video-responsive-4-3::before{padding-bottom:75%}.video-responsive-1-1::before{padding-bottom:100%}.figure{margin:0 0 .4rem 0}.figure .figure-caption{color:#66758c;margin-top:.4rem}.container{margin-left:auto;margin-right:auto;padding-left:.4rem;padding-right:.4rem;width:100%}.container.grid-xl{max-width:1296px}.container.grid-lg{max-width:976px}.container.grid-md{max-width:856px}.container.grid-sm{max-width:616px}.container.grid-xs{max-width:496px}.show-xs,.show-sm,.show-md,.show-lg,.show-xl{display:none !important}.columns{display:flex;flex-wrap:wrap;margin-left:-.4rem;margin-right:-.4rem}.columns.col-gapless{margin-left:0;margin-right:0}.columns.col-gapless>.column{padding-left:0;padding-right:0}.columns.col-oneline{flex-wrap:nowrap;overflow-x:auto}.column{flex:1;max-width:100%;padding-left:.4rem;padding-right:.4rem}.column.col-12,.column.col-11,.column.col-10,.column.col-9,.column.col-8,.column.col-7,.column.col-6,.column.col-5,.column.col-4,.column.col-3,.column.col-2,.column.col-1,.column.col-auto{flex:none}.col-12{width:100%}.col-11{width:91.66666667%}.col-10{width:83.33333333%}.col-9{width:75%}.col-8{width:66.66666667%}.col-7{width:58.33333333%}.col-6{width:50%}.col-5{width:41.66666667%}.col-4{width:33.33333333%}.col-3{width:25%}.col-2{width:16.66666667%}.col-1{width:8.33333333%}.col-auto{flex:0 0 auto;max-width:none;width:auto}.col-mx-auto{margin-left:auto;margin-right:auto}.col-ml-auto{margin-left:auto}.col-mr-auto{margin-right:auto}@media (max-width: 1280px){.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-xl-auto{flex:none}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-auto{width:auto}.hide-xl{display:none !important}.show-xl{display:block !important}}@media (max-width: 960px){.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-lg-auto{flex:none}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-auto{width:auto}.hide-lg{display:none !important}.show-lg{display:block !important}}@media (max-width: 840px){.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-md-auto{flex:none}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-auto{width:auto}.hide-md{display:none !important}.show-md{display:block !important}}@media (max-width: 600px){.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col-sm-auto{flex:none}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-auto{width:auto}.hide-sm{display:none !important}.show-sm{display:block !important}}@media (max-width: 480px){.col-xs-12,.col-xs-11,.col-xs-10,.col-xs-9,.col-xs-8,.col-xs-7,.col-xs-6,.col-xs-5,.col-xs-4,.col-xs-3,.col-xs-2,.col-xs-1,.col-xs-auto{flex:none}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-auto{width:auto}.hide-xs{display:none !important}.show-xs{display:block !important}}.hero{display:flex;flex-direction:column;justify-content:space-between;padding-bottom:4rem;padding-top:4rem}.hero.hero-sm{padding-bottom:2rem;padding-top:2rem}.hero.hero-lg{padding-bottom:8rem;padding-top:8rem}.hero .hero-body{padding:.4rem}.navbar{align-items:stretch;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar .navbar-section{align-items:center;display:flex;flex:1 0 0}.navbar .navbar-section:not(:first-child):last-child{justify-content:flex-end}.navbar .navbar-center{align-items:center;display:flex;flex:0 0 auto}.navbar .navbar-brand{font-size:.9rem;text-decoration:none}.accordion input:checked~.accordion-header .icon,.accordion[open] .accordion-header .icon{transform:rotate(90deg)}.accordion input:checked~.accordion-body,.accordion[open] .accordion-body{max-height:50rem}.accordion .accordion-header{display:block;padding:.2rem .4rem}.accordion .accordion-header .icon{transition:transform .25s}.accordion .accordion-body{margin-bottom:.4rem;max-height:0;overflow:hidden;transition:max-height .25s}summary.accordion-header::-webkit-details-marker{display:none}.avatar{font-size:.8rem;height:1.6rem;width:1.6rem;background:#5755d9;border-radius:50%;color:rgba(255,255,255,0.85);display:inline-block;font-weight:300;line-height:1.25;margin:0;position:relative;vertical-align:middle}.avatar.avatar-xs{font-size:.4rem;height:.8rem;width:.8rem}.avatar.avatar-sm{font-size:.6rem;height:1.2rem;width:1.2rem}.avatar.avatar-lg{font-size:1.2rem;height:2.4rem;width:2.4rem}.avatar.avatar-xl{font-size:1.6rem;height:3.2rem;width:3.2rem}.avatar img{border-radius:50%;height:100%;position:relative;width:100%;z-index:1}.avatar .avatar-icon,.avatar .avatar-presence{background:#fff;bottom:14.64%;height:50%;padding:.1rem;position:absolute;right:14.64%;transform:translate(50%, 50%);width:50%;z-index:2}.avatar .avatar-presence{background:#bcc3ce;box-shadow:0 0 0 .1rem #fff;border-radius:50%;height:.5em;width:.5em}.avatar .avatar-presence.online{background:#32b643}.avatar .avatar-presence.busy{background:#e85600}.avatar .avatar-presence.away{background:#ffb700}.avatar[data-initial]::before{color:currentColor;content:attr(data-initial);left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:1}.badge{position:relative;white-space:nowrap}.badge[data-badge]::after,.badge:not([data-badge])::after{background:#5755d9;background-clip:padding-box;border-radius:.5rem;box-shadow:0 0 0 0.1rem #fff;color:#fff;content:attr(data-badge);display:inline-block;transform:translate(-0.05rem, -0.5rem)}.badge[data-badge]::after{font-size:.7rem;height:.9rem;line-height:1;min-width:.9rem;padding:.1rem .2rem;text-align:center;white-space:nowrap}.badge:not([data-badge])::after,.badge[data-badge=""]::after{height:6px;min-width:6px;padding:0;width:6px}.badge.btn::after{position:absolute;top:0;right:0;transform:translate(50%, -50%)}.badge.avatar::after{position:absolute;top:14.64%;right:14.64%;transform:translate(50%, -50%);z-index:100}.breadcrumb{list-style:none;margin:.2rem 0;padding:.2rem 0}.breadcrumb .breadcrumb-item{color:#66758c;display:inline-block;margin:0;padding:.2rem 0}.breadcrumb .breadcrumb-item:not(:last-child){margin-right:.2rem}.breadcrumb .breadcrumb-item:not(:last-child) a{color:#66758c}.breadcrumb .breadcrumb-item:not(:first-child)::before{color:#66758c;content:"/";padding-right:.4rem}.bar{background:#eef0f3;border-radius:.1rem;display:flex;flex-wrap:nowrap;height:.8rem;width:100%}.bar.bar-sm{height:.2rem}.bar .bar-item{background:#5755d9;color:#fff;display:block;font-size:.7rem;flex-shrink:0;line-height:.8rem;height:100%;position:relative;text-align:center;width:0}.bar .bar-item:first-child{border-bottom-left-radius:.1rem;border-top-left-radius:.1rem}.bar .bar-item:last-child{border-bottom-right-radius:.1rem;border-top-right-radius:.1rem;flex-shrink:1}.bar-slider{height:.1rem;margin:.4rem 0;position:relative}.bar-slider .bar-item{left:0;padding:0;position:absolute}.bar-slider .bar-item:not(:last-child):first-child{background:#eef0f3;z-index:1}.bar-slider .bar-slider-btn{background:#5755d9;border:0;border-radius:50%;height:.6rem;padding:0;position:absolute;right:0;top:50%;transform:translate(50%, -50%);width:.6rem}.bar-slider .bar-slider-btn:active{box-shadow:0 0 0 0.1rem #5755d9}.card{background:#fff;border:.05rem solid #dadee4;border-radius:.1rem;display:flex;flex-direction:column}.card .card-header,.card .card-body,.card .card-footer{padding:.8rem;padding-bottom:0}.card .card-header:last-child,.card .card-body:last-child,.card .card-footer:last-child{padding-bottom:.8rem}.card .card-body{flex:1 1 auto}.card .card-image{padding-top:.8rem}.card .card-image:first-child{padding-top:0}.card .card-image:first-child img{border-top-left-radius:.1rem;border-top-right-radius:.1rem}.card .card-image:last-child img{border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem}.chip{align-items:center;background:#eef0f3;border-radius:5rem;display:inline-flex;font-size:90%;height:1.2rem;line-height:.8rem;margin:.1rem;max-width:320px;overflow:hidden;padding:.2rem .4rem;text-decoration:none;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.chip.active{background:#5755d9;color:#fff}.chip .avatar{margin-left:-.4rem;margin-right:.2rem}.chip .btn-clear{border-radius:50%;transform:scale(0.75)}.dropdown{display:inline-block;position:relative}.dropdown .menu{animation:slide-down .15s ease 1;display:none;left:0;max-height:50vh;overflow-y:auto;position:absolute;top:100%}.dropdown.dropdown-right .menu{left:auto;right:0}.dropdown.active .menu,.dropdown .dropdown-toggle:focus+.menu,.dropdown .menu:hover{display:block}.dropdown .btn-group .dropdown-toggle:nth-last-child(2){border-bottom-right-radius:.1rem;border-top-right-radius:.1rem}.empty{background:#f7f8f9;border-radius:.1rem;color:#66758c;text-align:center;padding:3.2rem 1.6rem}.empty .empty-icon{margin-bottom:.8rem}.empty .empty-title,.empty .empty-subtitle{margin:.4rem auto}.empty .empty-action{margin-top:.8rem}.menu{box-shadow:0 .05rem .2rem rgba(48,55,66,0.3);background:#fff;border-radius:.1rem;list-style:none;margin:0;min-width:180px;padding:.4rem;transform:translateY(.2rem);z-index:300}.menu.menu-nav{background:transparent;box-shadow:none}.menu .menu-item{margin-top:0;padding:0 .4rem;position:relative;text-decoration:none}.menu .menu-item>a{border-radius:.1rem;color:inherit;display:block;margin:0 -.4rem;padding:.2rem .4rem;text-decoration:none}.menu .menu-item>a:focus,.menu .menu-item>a:hover{background:#f1f1fc;color:#5755d9}.menu .menu-item>a:active,.menu .menu-item>a.active{background:#f1f1fc;color:#5755d9}.menu .menu-item .form-checkbox,.menu .menu-item .form-radio,.menu .menu-item .form-switch{margin:.1rem 0}.menu .menu-item+.menu-item{margin-top:.2rem}.menu .menu-badge{align-items:center;display:flex;height:100%;position:absolute;right:0;top:0}.menu .menu-badge .label{margin-right:.4rem}.modal{align-items:center;bottom:0;display:none;justify-content:center;left:0;opacity:0;overflow:hidden;padding:.4rem;position:fixed;right:0;top:0}.modal:target,.modal.active{display:flex;opacity:1;z-index:400}.modal:target .modal-overlay,.modal.active .modal-overlay{background:rgba(247,248,249,0.75);bottom:0;cursor:default;display:block;left:0;position:absolute;right:0;top:0}.modal:target .modal-container,.modal.active .modal-container{animation:slide-down .2s ease 1;z-index:1}.modal.modal-sm .modal-container{max-width:320px;padding:0 .4rem}.modal.modal-lg .modal-overlay{background:#fff}.modal.modal-lg .modal-container{box-shadow:none;max-width:960px}.modal-container{box-shadow:0 .2rem .5rem rgba(48,55,66,0.3);background:#fff;border-radius:.1rem;display:flex;flex-direction:column;max-height:75vh;max-width:640px;padding:0 .8rem;width:100%}.modal-container.modal-fullheight{max-height:100vh}.modal-container .modal-header{color:#303742;padding:.8rem}.modal-container .modal-body{overflow-y:auto;padding:.8rem;position:relative}.modal-container .modal-footer{padding:.8rem;text-align:right}.nav{display:flex;flex-direction:column;list-style:none;margin:.2rem 0}.nav .nav-item a{color:#66758c;padding:.2rem .4rem;text-decoration:none}.nav .nav-item a:focus,.nav .nav-item a:hover{color:#5755d9}.nav .nav-item.active>a{color:#505c6e;font-weight:bold}.nav .nav-item.active>a:focus,.nav .nav-item.active>a:hover{color:#5755d9}.nav .nav{margin-bottom:.4rem;margin-left:.8rem}.pagination{display:flex;list-style:none;margin:.2rem 0;padding:.2rem 0}.pagination .page-item{margin:.2rem .05rem}.pagination .page-item span{display:inline-block;padding:.2rem .2rem}.pagination .page-item a{border-radius:.1rem;display:inline-block;padding:.2rem .4rem;text-decoration:none}.pagination .page-item a:focus,.pagination .page-item a:hover{color:#5755d9}.pagination .page-item.disabled a{cursor:default;opacity:.5;pointer-events:none}.pagination .page-item.active a{background:#5755d9;color:#fff}.pagination .page-item.page-prev,.pagination .page-item.page-next{flex:1 0 50%}.pagination .page-item.page-next{text-align:right}.pagination .page-item .page-item-title{margin:0}.pagination .page-item .page-item-subtitle{margin:0;opacity:.5}.panel{border:.05rem solid #dadee4;border-radius:.1rem;display:flex;flex-direction:column}.panel .panel-header,.panel .panel-footer{flex:0 0 auto;padding:.8rem}.panel .panel-nav{flex:0 0 auto}.panel .panel-body{flex:1 1 auto;overflow-y:auto;padding:0 .8rem}.popover{display:inline-block;position:relative}.popover .popover-container{left:50%;opacity:0;padding:.4rem;position:absolute;top:0;transform:translate(-50%, -50%) scale(0);transition:transform .2s;width:320px;z-index:300}.popover *:focus+.popover-container,.popover:hover .popover-container{display:block;opacity:1;transform:translate(-50%, -100%) scale(1)}.popover.popover-right .popover-container{left:100%;top:50%}.popover.popover-right *:focus+.popover-container,.popover.popover-right:hover .popover-container{transform:translate(0, -50%) scale(1)}.popover.popover-bottom .popover-container{left:50%;top:100%}.popover.popover-bottom *:focus+.popover-container,.popover.popover-bottom:hover .popover-container{transform:translate(-50%, 0) scale(1)}.popover.popover-left .popover-container{left:0;top:50%}.popover.popover-left *:focus+.popover-container,.popover.popover-left:hover .popover-container{transform:translate(-100%, -50%) scale(1)}.popover .card{box-shadow:0 .2rem .5rem rgba(48,55,66,0.3);border:0}.step{display:flex;flex-wrap:nowrap;list-style:none;margin:.2rem 0;width:100%}.step .step-item{flex:1 1 0;margin-top:0;min-height:1rem;text-align:center;position:relative}.step .step-item:not(:first-child)::before{background:#5755d9;content:"";height:2px;left:-50%;position:absolute;top:9px;width:100%}.step .step-item a{color:#5755d9;display:inline-block;padding:20px 10px 0;text-decoration:none}.step .step-item a::before{background:#5755d9;border:.1rem solid #fff;border-radius:50%;content:"";display:block;height:.6rem;left:50%;position:absolute;top:.2rem;transform:translateX(-50%);width:.6rem;z-index:1}.step .step-item.active a::before{background:#fff;border:.1rem solid #5755d9}.step .step-item.active~.step-item::before{background:#dadee4}.step .step-item.active~.step-item a{color:#bcc3ce}.step .step-item.active~.step-item a::before{background:#dadee4}.tab{align-items:center;border-bottom:.05rem solid #dadee4;display:flex;flex-wrap:wrap;list-style:none;margin:.2rem 0 .15rem 0}.tab .tab-item{margin-top:0}.tab .tab-item a{border-bottom:.1rem solid transparent;color:inherit;display:block;margin:0 .4rem 0 0;padding:.4rem .2rem .3rem .2rem;text-decoration:none}.tab .tab-item a:focus,.tab .tab-item a:hover{color:#5755d9}.tab .tab-item.active a,.tab .tab-item a.active{border-bottom-color:#5755d9;color:#5755d9}.tab .tab-item.tab-action{flex:1 0 auto;text-align:right}.tab .tab-item .btn-clear{margin-top:-.2rem}.tab.tab-block .tab-item{flex:1 0 0;text-align:center}.tab.tab-block .tab-item a{margin:0}.tab.tab-block .tab-item .badge[data-badge]::after{position:absolute;right:.1rem;top:.1rem;transform:translate(0, 0)}.tab:not(.tab-block) .badge{padding-right:0}.tile{align-content:space-between;align-items:flex-start;display:flex}.tile .tile-icon,.tile .tile-action{flex:0 0 auto}.tile .tile-content{flex:1 1 auto}.tile .tile-content:not(:first-child){padding-left:.4rem}.tile .tile-content:not(:last-child){padding-right:.4rem}.tile .tile-title,.tile .tile-subtitle{line-height:1.2rem}.tile.tile-centered{align-items:center}.tile.tile-centered .tile-content{overflow:hidden}.tile.tile-centered .tile-title,.tile.tile-centered .tile-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:0}.toast{background:rgba(48,55,66,0.95);border-color:#303742;border:.05rem solid #303742;border-radius:.1rem;color:#fff;display:block;padding:.4rem;width:100%}.toast.toast-primary{background:rgba(87,85,217,0.95);border-color:#5755d9}.toast.toast-success{background:rgba(50,182,67,0.95);border-color:#32b643}.toast.toast-warning{background:rgba(255,183,0,0.95);border-color:#ffb700}.toast.toast-error{background:rgba(232,86,0,0.95);border-color:#e85600}.toast a{color:#fff;text-decoration:underline}.toast a:focus,.toast a:hover,.toast a:active,.toast a.active{opacity:.75}.toast .btn-clear{margin:.1rem}.toast p:last-child{margin-bottom:0}.tooltip{position:relative}.tooltip::after{background:rgba(48,55,66,0.95);border-radius:.1rem;bottom:100%;color:#fff;content:attr(data-tooltip);display:block;font-size:.7rem;left:50%;max-width:320px;opacity:0;overflow:hidden;padding:.2rem .4rem;pointer-events:none;position:absolute;text-overflow:ellipsis;transform:translate(-50%, .4rem);transition:opacity .2s, transform .2s;white-space:pre;z-index:300}.tooltip:focus::after,.tooltip:hover::after{opacity:1;transform:translate(-50%, -.2rem)}.tooltip[disabled],.tooltip.disabled{pointer-events:auto}.tooltip.tooltip-right::after{bottom:50%;left:100%;transform:translate(-.2rem, 50%)}.tooltip.tooltip-right:focus::after,.tooltip.tooltip-right:hover::after{transform:translate(.2rem, 50%)}.tooltip.tooltip-bottom::after{bottom:auto;top:100%;transform:translate(-50%, -.4rem)}.tooltip.tooltip-bottom:focus::after,.tooltip.tooltip-bottom:hover::after{transform:translate(-50%, .2rem)}.tooltip.tooltip-left::after{bottom:50%;left:auto;right:100%;transform:translate(.4rem, 50%)}.tooltip.tooltip-left:focus::after,.tooltip.tooltip-left:hover::after{transform:translate(-.2rem, 50%)}@keyframes loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes slide-down{0%{opacity:0;transform:translateY(-1.6rem)}100%{opacity:1;transform:translateY(0)}}.text-primary{color:#5755d9 !important}a.text-primary:focus,a.text-primary:hover{color:#4240d4}a.text-primary:visited{color:#6c6ade}.text-secondary{color:#e5e5f9 !important}a.text-secondary:focus,a.text-secondary:hover{color:#d1d0f4}a.text-secondary:visited{color:#fafafe}.text-gray{color:#bcc3ce !important}a.text-gray:focus,a.text-gray:hover{color:#adb6c4}a.text-gray:visited{color:#cbd0d9}.text-light{color:#fff !important}a.text-light:focus,a.text-light:hover{color:#f2f2f2}a.text-light:visited{color:#fff}.text-dark{color:#3b4351 !important}a.text-dark:focus,a.text-dark:hover{color:#303742}a.text-dark:visited{color:#455060}.text-success{color:#32b643 !important}a.text-success:focus,a.text-success:hover{color:#2da23c}a.text-success:visited{color:#39c94b}.text-warning{color:#ffb700 !important}a.text-warning:focus,a.text-warning:hover{color:#e6a500}a.text-warning:visited{color:#ffbe1a}.text-error{color:#e85600 !important}a.text-error:focus,a.text-error:hover{color:#cf4d00}a.text-error:visited{color:#ff6003}.bg-primary{background:#5755d9 !important;color:#fff}.bg-secondary{background:#f1f1fc !important}.bg-dark{background:#303742 !important;color:#fff}.bg-gray{background:#f7f8f9 !important}.bg-success{background:#32b643 !important;color:#fff}.bg-warning{background:#ffb700 !important;color:#fff}.bg-error{background:#e85600 !important;color:#fff}.c-hand{cursor:pointer}.c-move{cursor:move}.c-zoom-in{cursor:zoom-in}.c-zoom-out{cursor:zoom-out}.c-not-allowed{cursor:not-allowed}.c-auto{cursor:auto}.d-block{display:block}.d-inline{display:inline}.d-inline-block{display:inline-block}.d-flex{display:flex}.d-inline-flex{display:inline-flex}.d-none,.d-hide{display:none !important}.d-visible{visibility:visible}.d-invisible{visibility:hidden}.text-hide{background:transparent;border:0;color:transparent;font-size:0;line-height:0;text-shadow:none}.text-assistive{border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.divider,.divider-vert{display:block;position:relative}.divider[data-content]::after,.divider-vert[data-content]::after{background:#fff;color:#bcc3ce;content:attr(data-content);display:inline-block;font-size:.7rem;padding:0 .4rem;transform:translateY(-.65rem)}.divider{border-top:.05rem solid #f1f3f5;height:.05rem;margin:.4rem 0}.divider[data-content]{margin:.8rem 0}.divider-vert{display:block;padding:.8rem}.divider-vert::before{border-left:.05rem solid #dadee4;bottom:.4rem;content:"";display:block;left:50%;position:absolute;top:.4rem;transform:translateX(-50%)}.divider-vert[data-content]::after{left:50%;padding:.2rem 0;position:absolute;top:50%;transform:translate(-50%, -50%)}.loading{color:transparent !important;min-height:.8rem;pointer-events:none;position:relative}.loading::after{animation:loading 500ms infinite linear;border:.1rem solid #5755d9;border-radius:50%;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:.8rem;left:50%;margin-left:-.4rem;margin-top:-.4rem;position:absolute;top:50%;width:.8rem;z-index:1}.loading.loading-lg{min-height:2rem}.loading.loading-lg::after{height:1.6rem;margin-left:-.8rem;margin-top:-.8rem;width:1.6rem}.clearfix::after{clear:both;content:"";display:table}.float-left{float:left !important}.float-right{float:right !important}.p-relative{position:relative !important}.p-absolute{position:absolute !important}.p-fixed{position:fixed !important}.p-sticky{position:sticky !important}.p-centered{display:block;float:none;margin-left:auto;margin-right:auto}.flex-centered{align-items:center;display:flex;justify-content:center}.m-0{margin:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mr-0{margin-right:0 !important}.mt-0{margin-top:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-bottom:0 !important;margin-top:0 !important}.m-1{margin:.2rem !important}.mb-1{margin-bottom:.2rem !important}.ml-1{margin-left:.2rem !important}.mr-1{margin-right:.2rem !important}.mt-1{margin-top:.2rem !important}.mx-1{margin-left:.2rem !important;margin-right:.2rem !important}.my-1{margin-bottom:.2rem !important;margin-top:.2rem !important}.m-2{margin:.4rem !important}.mb-2{margin-bottom:.4rem !important}.ml-2{margin-left:.4rem !important}.mr-2{margin-right:.4rem !important}.mt-2{margin-top:.4rem !important}.mx-2{margin-left:.4rem !important;margin-right:.4rem !important}.my-2{margin-bottom:.4rem !important;margin-top:.4rem !important}.p-0{padding:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.pr-0{padding-right:0 !important}.pt-0{padding-top:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-bottom:0 !important;padding-top:0 !important}.p-1{padding:.2rem !important}.pb-1{padding-bottom:.2rem !important}.pl-1{padding-left:.2rem !important}.pr-1{padding-right:.2rem !important}.pt-1{padding-top:.2rem !important}.px-1{padding-left:.2rem !important;padding-right:.2rem !important}.py-1{padding-bottom:.2rem !important;padding-top:.2rem !important}.p-2{padding:.4rem !important}.pb-2{padding-bottom:.4rem !important}.pl-2{padding-left:.4rem !important}.pr-2{padding-right:.4rem !important}.pt-2{padding-top:.4rem !important}.px-2{padding-left:.4rem !important;padding-right:.4rem !important}.py-2{padding-bottom:.4rem !important;padding-top:.4rem !important}.s-rounded{border-radius:.1rem}.s-circle{border-radius:50%}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-normal{font-weight:normal}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-large{font-size:1.2em}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-clip{overflow:hidden;text-overflow:clip;white-space:nowrap}.text-break{hyphens:auto;word-break:break-word;word-wrap:break-word} diff --git a/sps20/assets/scss/spectre/_buttons.scss b/sps20/assets/scss/spectre/_buttons.scss index 9158f0f..8b02b07 100755 --- a/sps20/assets/scss/spectre/_buttons.scss +++ b/sps20/assets/scss/spectre/_buttons.scss @@ -81,7 +81,13 @@ &.btn-error { @include button-variant($error-color); } + + &.btn-secondary { + @include button-variant($secondary-color); + } + + // Button Link &.btn-link { background: transparent; diff --git a/sps20/assets/scss/style.scss b/sps20/assets/scss/style.scss index d9a16c9..0a99623 100644 --- a/sps20/assets/scss/style.scss +++ b/sps20/assets/scss/style.scss @@ -24,7 +24,7 @@ $header-bullet-color: $spsa-orange; $actual-bullet-color: $spsa-blue-dark; $primary-color: $spsa-blue; -$secondar-color: $spsa-orange; +$secondary-color: $spsa-orange; $navigation-fg: #fff; $navigation-fg-border: #999; diff --git a/sps20/content/404.html/contents.lr b/sps20/content/404.html/contents.lr index 7f1d447..be4fb44 100644 --- a/sps20/content/404.html/contents.lr +++ b/sps20/content/404.html/contents.lr @@ -2,10 +2,10 @@ title: Oops! --- ordering: -1 --- +_template: 404.html +--- body: The page you are looking for does not exist. Want to go back to the [homepage](/)? ---- -_template: 404.html \ No newline at end of file diff --git a/sps20/content/contents.lr b/sps20/content/contents.lr index bd035f7..d087928 100644 --- a/sps20/content/contents.lr +++ b/sps20/content/contents.lr @@ -6,12 +6,12 @@ body: # Swiss Python Summit -What an incredible two days that was! A hug thanks to all the visitors, supporters, speakers, helpers and sponsors! The next conference will take place in the fall of **2026**. +What an incredible two days that was! 🥳 A hug thanks to all the visitors, supporters, speakers, helpers and sponsors! The next conference will take place in the fall of **2026**. ## 📣 Latest news -!! The next conference will take place in the fall of **2026**. The exact date will be announced at the beginning of the year🥳 - +!! 📅 The next conference will take place in the fall of **2026**. The exact date will be announced at the beginning of the year +

📹️ The [recordings and (some) slides](recordings) of 2025 are already available! ## 🐍 The conference diff --git a/sps20/content/program/contents.lr b/sps20/content/program/contents.lr index 23426cd..fa47494 100644 --- a/sps20/content/program/contents.lr +++ b/sps20/content/program/contents.lr @@ -4,13 +4,13 @@ description: The schedule of the Swiss Python Summit --- ordering: 3 --- +_hidden: no +--- body: # Program 2025 -We are pleased to announce our schedule for this years conference. - -Please note, that changes may still happen due to unforeseen circumstances. So please check it regularely! +This was this years conference schedule. Take a look at the [recordings](/recordings) page for videos and slides.