diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 00000000000..37373bfb460 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,267 @@ +{ + "projectName": "python-deadlines", + "projectOwner": "JesperDramsch", + "skipCi": true, + "files": [ + "README.md", + "CONTRIBUTING.md" + ], + "imageSize": 100, + "commitType": "docs", + "commitConvention": "angular", + "contributorsPerLine": 7, + "types": { + "conference": { + "symbol": "📆", + "description": "Python conference (Added or updated)", + "link": "#conference-<%= contributor.login %>" + } + }, + "contributors": [ + { + "login": "JesperDramsch", + "name": "Jesper Dramsch", + "avatar_url": "https://avatars.githubusercontent.com/u/2620316?v=4", + "profile": "http://dramsch.net", + "contributions": [ + "a11y", + "bug", + "blog", + "code", + "conference", + "content", + "doc", + "design", + "financial", + "ideas", + "infra", + "promotion", + "review", + "security", + "tool", + "translation", + "talk" + ] + }, + { + "login": "abhshkdz", + "name": "Abhishek Das", + "avatar_url": "https://avatars.githubusercontent.com/u/1156489?v=4", + "profile": "https://abhishekdas.com/", + "contributions": [ + "code" + ] + }, + { + "login": "john-sandall", + "name": "John Sandall", + "avatar_url": "https://avatars.githubusercontent.com/u/2884159?v=4", + "profile": "https://coefficient.ai", + "contributions": [ + "conference", + "bug" + ] + }, + { + "login": "thibaudcolas", + "name": "Thibaud Colas", + "avatar_url": "https://avatars.githubusercontent.com/u/877585?v=4", + "profile": "https://thib.me/", + "contributions": [ + "conference" + ] + }, + { + "login": "tankala", + "name": "Tankala Ashok", + "avatar_url": "https://avatars.githubusercontent.com/u/29096822?v=4", + "profile": "http://tanka.la", + "contributions": [ + "conference" + ] + }, + { + "login": "RCdeWit", + "name": "Rob de Wit", + "avatar_url": "https://avatars.githubusercontent.com/u/7165065?v=4", + "profile": "http://robdewit.nl", + "contributions": [ + "conference" + ] + }, + { + "login": "takanory", + "name": "Takanori Suzuki", + "avatar_url": "https://avatars.githubusercontent.com/u/988241?v=4", + "profile": "https://slides.takanory.net/", + "contributions": [ + "conference" + ] + }, + { + "login": "alanderex", + "name": "Alexander CS Hendorf", + "avatar_url": "https://avatars.githubusercontent.com/u/1356401?v=4", + "profile": "https://github.com/alanderex", + "contributions": [ + "conference" + ] + }, + { + "login": "radujica", + "name": "Radu", + "avatar_url": "https://avatars.githubusercontent.com/u/8166962?v=4", + "profile": "https://github.com/radujica", + "contributions": [ + "bug" + ] + }, + { + "login": "isabelizimm", + "name": "Isabel Zimmerman", + "avatar_url": "https://avatars.githubusercontent.com/u/54685329?v=4", + "profile": "http://isabelizimm.me", + "contributions": [ + "bug" + ] + }, + { + "login": "jeroenjanssens", + "name": "Jeroen Janssens", + "avatar_url": "https://avatars.githubusercontent.com/u/1368256?v=4", + "profile": "https://jeroenjanssens.com/", + "contributions": [ + "conference" + ] + }, + { + "login": "systematicguy", + "name": "David Horvath", + "avatar_url": "https://avatars.githubusercontent.com/u/12820811?v=4", + "profile": "https://github.com/systematicguy", + "contributions": [ + "conference" + ] + }, + { + "login": "ogrisel", + "name": "Olivier Grisel", + "avatar_url": "https://avatars.githubusercontent.com/u/89061?v=4", + "profile": "https://ogrisel.com/", + "contributions": [ + "conference" + ] + }, + { + "login": "mtsokol", + "name": "Mateusz Sokół", + "avatar_url": "https://avatars.githubusercontent.com/u/8431159?v=4", + "profile": "https://github.com/mtsokol", + "contributions": [ + "conference" + ] + }, + { + "login": "theopinard", + "name": "Theodore Meynard", + "avatar_url": "https://avatars.githubusercontent.com/u/16977967?v=4", + "profile": "https://github.com/theopinard", + "contributions": [ + "conference" + ] + }, + { + "login": "kgawda", + "name": "Konrad Gawda", + "avatar_url": "https://avatars.githubusercontent.com/u/3084325?v=4", + "profile": "https://github.com/kgawda", + "contributions": [ + "conference" + ] + }, + { + "login": "egeakman", + "name": "Ege Akman", + "avatar_url": "https://avatars.githubusercontent.com/u/75242929?v=4", + "profile": "https://github.com/egeakman", + "contributions": [ + "bug", + "conference", + "code" + ] + }, + { + "login": "raviselker", + "name": "Ravi Selker", + "avatar_url": "https://avatars.githubusercontent.com/u/4669197?v=4", + "profile": "https://github.com/raviselker", + "contributions": [ + "conference" + ] + }, + { + "login": "bardiharborow", + "name": "Bardi Harborow", + "avatar_url": "https://avatars.githubusercontent.com/u/1073681?v=4", + "profile": "https://bardiharborow.com/", + "contributions": [ + "conference" + ] + }, + { + "login": "coolandsmartrr", + "name": "Ricky", + "avatar_url": "https://avatars.githubusercontent.com/u/905436?v=4", + "profile": "https://github.com/coolandsmartrr", + "contributions": [ + "conference" + ] + }, + { + "login": "The-Compiler", + "name": "Florian Bruhin", + "avatar_url": "https://avatars.githubusercontent.com/u/625793?v=4", + "profile": "https://bruhin.software/", + "contributions": [ + "conference" + ] + }, + { + "login": "jungmir", + "name": "jungmir", + "avatar_url": "https://avatars.githubusercontent.com/u/61821253?v=4", + "profile": "https://github.com/jungmir", + "contributions": [ + "conference" + ] + }, + { + "login": "drnlm", + "name": "Neil Muller", + "avatar_url": "https://avatars.githubusercontent.com/u/642056?v=4", + "profile": "https://github.com/drnlm", + "contributions": [ + "conference" + ] + }, + { + "login": "mrswats", + "name": "Ferran Jovell", + "avatar_url": "https://avatars.githubusercontent.com/u/3410779?v=4", + "profile": "https://github.com/mrswats", + "contributions": [ + "conference" + ] + }, + { + "login": "agriyakhetarpal", + "name": "Agriya Khetarpal", + "avatar_url": "https://avatars.githubusercontent.com/u/74401230?v=4", + "profile": "https://github.com/agriyakhetarpal", + "contributions": [ + "conference" + ] + } + ], + "repoType": "github" +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..ad1ca15b467 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +* text=auto + +*.ics text eol=crlf + +*.png binary +*.jpg binary + +# GitHub syntax highlighting +pixi.lock linguist-language=YAML diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..57535d922f0 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: +- package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 00000000000..aa9b60f98e0 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,63 @@ +Tests: +- changed-files: + - any-glob-to-any-file: [ "tests/**/*" ] + +Dependencies: +- changed-files: + - any-glob-to-any-file: + - "requirements.txt" + - "setup.py" + - "pyproject.toml" + - "poetry.lock" + - "pixi.toml" + - "pixi.lock" + - "Pipfile" + - "Pipfile.lock" + - "requirements/*.txt" + - "requirements/*.in" + +Build: +- changed-files: + - any-glob-to-any-file: + - "Dockerfile*" + - "docker-compose*.yml" + - "Makefile" + +Documentation: +- changed-files: + - any-glob-to-any-file: + - "docs/**/*" + - "*.md" + - "*.rst" + +Config: +- changed-files: + - any-glob-to-any-file: + - ".pre-commit-config.yaml" + - "config/**/*" + - "settings/**/*" + - "*.ini" + - "*.cfg" + - "*.conf" + +CI/CD: +- changed-files: + - any-glob-to-any-file: + - ".github/**/*" + - "tox.ini" + - ".coveragerc" + +# Add 'feature' label to any PR where the head branch name starts with `feature` or has a `feature` section in the name +feature: +- head-branch: + - '^feature' + - 'feature' + +# Add 'bugfix' label to branches with bug/fix/hotfix prefixes +bugfix: +- head-branch: [ '^bug', '^fix', '^hotfix' ] + +# Add 'breaking' label for major version bumps or breaking change commits +breaking: +- title: [ '^BREAKING CHANGE', 'BREAKING-CHANGE' ] +- body: [ 'BREAKING CHANGE:', 'BREAKING-CHANGE:' ] diff --git a/.github/workflows/archive-new-urls.yml b/.github/workflows/archive-new-urls.yml new file mode 100644 index 00000000000..00ec2ab0edb --- /dev/null +++ b/.github/workflows/archive-new-urls.yml @@ -0,0 +1,146 @@ +name: Archive New Conference URLs + +permissions: + contents: read + +on: + push: + branches: [ main, master] + paths: + - '_data/**' + schedule: + # Runs at 00:00 UTC on Saturday + - cron: '0 0 * * 6' + workflow_dispatch: + inputs: + skip_archive: + description: 'Skip Web Archive (only add to changedetection)' + type: boolean + default: false + skip_changedetection: + description: 'Skip changedetection.io (only archive)' + type: boolean + default: false + +jobs: + check-new-urls: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 # Full history for finding last run + + - name: Find last successful run commit + id: last-run + run: | + last_sha=$(gh run list --workflow="Archive New Conference URLs" --json conclusion,headSha --jq '.[] | select(.conclusion=="success") | .headSha' | head -n1) + if [ -n "$last_sha" ]; then + echo "sha=$last_sha" >> $GITHUB_OUTPUT + else + echo "sha=$(git rev-list --max-parents=0 HEAD)" >> $GITHUB_OUTPUT + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract new conference entries + id: extract + run: | + # Get the diff for conferences.yml + DIFF=$(git diff ${{ steps.last-run.outputs.sha }} -- _data/conferences.yml || true) + + if [ -z "$DIFF" ]; then + echo "No changes to conferences.yml" + echo "has_changes=false" >> $GITHUB_OUTPUT + exit 0 + fi + + echo "has_changes=true" >> $GITHUB_OUTPUT + + # Parse new conference entries from the diff + # We need: link, conference name, place, sub + python3 << 'EOF' + import yaml + import subprocess + import json + import re + + # Get current and previous versions + result = subprocess.run( + ['git', 'show', '${{ steps.last-run.outputs.sha }}:_data/conferences.yml'], + capture_output=True, text=True + ) + old_data = yaml.safe_load(result.stdout) if result.returncode == 0 else [] + + with open('_data/conferences.yml', 'r') as f: + new_data = yaml.safe_load(f) + + # Create sets of existing URLs (normalize trailing slashes) + def normalize_url(url): + return url.rstrip('/').lower() if url else '' + + old_urls = {normalize_url(c.get('link', '')) for c in (old_data or [])} + + # Find new entries + new_entries = [] + for conf in (new_data or []): + url = normalize_url(conf.get('link', '')) + if url and url not in old_urls: + new_entries.append({ + 'url': conf.get('link', ''), + 'name': f"{conf.get('conference', 'Unknown')} {conf.get('year', '')}".strip(), + 'place': conf.get('place', ''), + 'sub': conf.get('sub', 'PY'), + }) + + # Output as JSON for later steps + print(f"Found {len(new_entries)} new conference URLs") + with open('/tmp/new_conferences.json', 'w') as f: + json.dump(new_entries, f) + + # Also output just URLs for backward compatibility + urls = [e['url'] for e in new_entries] + with open('/tmp/new_urls.txt', 'w') as f: + f.write('\n'.join(urls)) + EOF + + # Set outputs + if [ -s /tmp/new_urls.txt ]; then + echo "url_count=$(wc -l < /tmp/new_urls.txt)" >> $GITHUB_OUTPUT + else + echo "url_count=0" >> $GITHUB_OUTPUT + fi + + - name: Archive to Wayback Machine + if: steps.extract.outputs.has_changes == 'true' && steps.extract.outputs.url_count != '0' && inputs.skip_archive != true + run: | + echo "## Web Archive Results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + while IFS= read -r url; do + [ -z "$url" ] && continue + echo "Archiving: $url" + + response=$(curl -s -L -X POST \ + -A "Python-Deadlines-Bot/1.0 (https://pythondeadlin.es; admin@python-deadlin.es)" \ + "https://web.archive.org/save/$url" || true) + status=$? + + if [ $status -eq 0 ]; then + echo "✓ Successfully archived: $url" + echo "- ✅ $url" >> $GITHUB_STEP_SUMMARY + else + echo "⚠ Failed to archive: $url (error $status)" + echo "- ⚠️ $url (failed)" >> $GITHUB_STEP_SUMMARY + fi + + sleep 5 + done < /tmp/new_urls.txt + + - name: Summary + if: always() + run: | + echo "" >> $GITHUB_STEP_SUMMARY + echo "---" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Total new URLs:** ${{ steps.extract.outputs.url_count }}" >> $GITHUB_STEP_SUMMARY + echo "**Commit range:** ${{ steps.last-run.outputs.sha }}..HEAD" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/canonical-source-update.yml b/.github/workflows/canonical-source-update.yml new file mode 100644 index 00000000000..68f8a0a1388 --- /dev/null +++ b/.github/workflows/canonical-source-update.yml @@ -0,0 +1,331 @@ +name: Canonical Source Update + +on: + # Triggered by IFTTT/changedetection webhooks when canonical sources update + repository_dispatch: + types: [canonical-source-update] + + # Manual trigger for testing + workflow_dispatch: + inputs: + source: + description: 'Source to update from' + required: true + type: choice + options: + - all + - ics + - csv + default: all + dry_run: + description: 'Dry run (no commit/PR)' + required: false + type: boolean + default: false + +# Prevent concurrent runs to avoid merge conflicts on the accumulator branch +concurrency: + group: canonical-source-update + cancel-in-progress: false + +permissions: + contents: write + pull-requests: write + +env: + UPDATE_BRANCH: auto/conference-updates + +jobs: + update-from-canonical: + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + with: + fetch-depth: 0 + token: ${{ github.token }} + persist-credentials: true + + - name: Configure git identity + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Parse trigger source + id: source + env: + EVENT_NAME: ${{ github.event_name }} + PAYLOAD_SOURCE: ${{ github.event.client_payload.source }} + INPUT_SOURCE: ${{ inputs.source }} + run: | + if [ "$EVENT_NAME" = "repository_dispatch" ]; then + # Webhook trigger - get source from payload + SOURCE="${PAYLOAD_SOURCE:-all}" + echo "Triggered by webhook for source: $SOURCE" + else + # Manual trigger + SOURCE="${INPUT_SOURCE:-all}" + echo "Manual trigger for source: $SOURCE" + fi + + # Validate source + case "$SOURCE" in + all|ics|csv) + echo "source=$SOURCE" >> $GITHUB_OUTPUT + ;; + *) + echo "::warning title=Unknown Source::Unknown source '$SOURCE', defaulting to 'all'" + echo "source=all" >> $GITHUB_OUTPUT + ;; + esac + + echo "## Trigger Info" >> $GITHUB_STEP_SUMMARY + echo "- **Event:** $EVENT_NAME" >> $GITHUB_STEP_SUMMARY + echo "- **Source:** $SOURCE" >> $GITHUB_STEP_SUMMARY + + - name: Setup accumulator branch + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + + if git ls-remote --heads origin $UPDATE_BRANCH | grep -q $UPDATE_BRANCH; then + echo "::notice title=Branch::Checking out existing accumulator branch" + git fetch origin $UPDATE_BRANCH + git checkout $UPDATE_BRANCH + + # Sync with main - try rebase first, then merge + if ! git rebase origin/main; then + echo "::warning title=Rebase Failed::Attempting merge instead" + git rebase --abort 2>/dev/null || true + if ! git merge origin/main --no-edit; then + git merge --abort 2>/dev/null || true + echo "::warning title=Merge Conflict::Auto-resolving conflicts in favor of main" + if ! git merge origin/main -X theirs --no-edit; then + git merge --abort 2>/dev/null || true + echo "::error title=Branch Sync Failed::Could not sync with main" + exit 1 + fi + fi + fi + else + echo "::notice title=Branch::Creating new accumulator branch" + git checkout -b $UPDATE_BRANCH + fi + + - name: Snapshot data files + run: | + cp _data/conferences.yml /tmp/conferences_before.yml + cp _data/archive.yml /tmp/archive_before.yml 2>/dev/null || true + cp _data/legacy.yml /tmp/legacy_before.yml 2>/dev/null || true + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: Run merge scripts + id: merge + env: + SOURCE: ${{ steps.source.outputs.source }} + run: | + echo "::group::Running merge for source: $SOURCE" + + case "$SOURCE" in + ics) + echo "Importing from Python official calendar (ICS)..." + pixi run python ./utils/import_python_official.py + pixi run sort + ;; + csv) + echo "Importing from Python organizers (CSV)..." + pixi run python ./utils/import_python_organizers.py + pixi run sort + ;; + all) + echo "Running full merge pipeline..." + pixi run merge + ;; + esac + + echo "::endgroup::" + + # Capture which source was processed for commit message + echo "source_label=$SOURCE" >> $GITHUB_OUTPUT + + - name: Verify no conference data loss + run: | + # An automated merge must never delete or rename existing conferences. + # This blocks e.g. two distinct conferences being fuzzy-matched into one + # (PyCon Africa vs PyCon South Africa) before anything is committed. + pixi run python ./utils/check_data_loss.py \ + --before /tmp/conferences_before.yml /tmp/archive_before.yml /tmp/legacy_before.yml \ + --after _data/conferences.yml _data/archive.yml _data/legacy.yml + + - name: Check for changes + id: check_changes + run: | + # Check if any data files changed + CHANGED=false + + if ! diff -q _data/conferences.yml /tmp/conferences_before.yml > /dev/null 2>&1; then + echo "conferences.yml has changes" + CHANGED=true + fi + + if [ -f /tmp/archive_before.yml ] && ! diff -q _data/archive.yml /tmp/archive_before.yml > /dev/null 2>&1; then + echo "archive.yml has changes" + CHANGED=true + fi + + echo "changed=$CHANGED" >> $GITHUB_OUTPUT + + if [ "$CHANGED" = "true" ]; then + echo "::notice title=Changes Detected::Data files were updated" + + # Show summary of changes + echo "## Changes" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`diff" >> $GITHUB_STEP_SUMMARY + diff -u /tmp/conferences_before.yml _data/conferences.yml | head -50 >> $GITHUB_STEP_SUMMARY || true + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + else + echo "::notice title=No Changes::Data files are up to date" + echo "## No Changes" >> $GITHUB_STEP_SUMMARY + echo "Canonical sources did not have any new data." >> $GITHUB_STEP_SUMMARY + fi + + - name: Commit and push + if: steps.check_changes.outputs.changed == 'true' && inputs.dry_run != true + id: commit + env: + SOURCE: ${{ steps.source.outputs.source }} + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + + # Stage data files + git add _data/conferences.yml _data/archive.yml _data/legacy.yml 2>/dev/null || git add _data/conferences.yml + + # Create descriptive commit message based on source + case "$SOURCE" in + ics) + COMMIT_MSG="conf: data merge from PSF calendar" + ;; + csv) + COMMIT_MSG="conf: data merge from python-organizers" + ;; + all) + COMMIT_MSG="conf: data merge" + ;; + esac + + git commit -m "$COMMIT_MSG" -m "Source: canonical-$SOURCE" -m "Triggered: $(date -u +%Y-%m-%dT%H:%M:%SZ)" + git push origin $UPDATE_BRANCH --force-with-lease + + echo "commit_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + echo "commit_msg=$COMMIT_MSG" >> $GITHUB_OUTPUT + + - name: Create or update PR + if: steps.check_changes.outputs.changed == 'true' && inputs.dry_run != true + uses: actions/github-script@v9 + env: + UPDATE_BRANCH: ${{ env.UPDATE_BRANCH }} + SOURCE: ${{ steps.source.outputs.source }} + COMMIT_SHA: ${{ steps.commit.outputs.commit_sha }} + COMMIT_MSG: ${{ steps.commit.outputs.commit_msg }} + with: + script: | + const branch = process.env.UPDATE_BRANCH; + const source = process.env.SOURCE; + const sha = process.env.COMMIT_SHA.substring(0, 7); + const date = new Date().toISOString().split('T')[0]; + + // Source labels for the "Conference" column (matches existing workflow format) + // Using 📊 emoji to distinguish canonical source updates from website scrapes + const sourceLabels = { + 'ics': '📊 PSF Calendar', + 'csv': '📊 python-organizers', + 'all': '📊 Canonical sources' + }; + const sourceLabel = sourceLabels[source] || `📊 ${source}`; + + // Check for existing PR from the update branch + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:${branch}`, + state: 'open' + }); + + // Use same table format as check-conference-update.yml (Conference | Commit | Date) + const entry = `| ${sourceLabel} | [${sha}](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/commit/${process.env.COMMIT_SHA}) | ${date} |`; + + if (prs.length > 0) { + // Update existing PR - append to table + const pr = prs[0]; + let body = pr.body || ''; + + // Add entry before the END_UPDATES marker + body = body.replace(/()/, `${entry}\n$1`); + + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pr.number, + body + }); + + console.log(`Updated PR #${pr.number}`); + core.notice(`Updated PR #${pr.number} with canonical source merge`); + } else { + // Create new PR - use EXACT same format as check-conference-update.yml + const { data: newPr } = await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: '🐍 Conference updates', + head: branch, + base: 'main', + body: `## 🐍 Automated Conference Updates\n\n| Conference | Commit | Date |\n|------------|--------|------|\n${entry}\n` + }); + + // Add labels + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: newPr.number, + labels: ['automated', 'conference-update'] + }); + + console.log(`Created PR #${newPr.number}`); + core.notice(`Created PR #${newPr.number} for canonical source merge`); + } + + - name: Trigger TBA enrichment + if: steps.check_changes.outputs.changed == 'true' && inputs.dry_run != true + env: + GH_TOKEN: ${{ github.token }} + run: | + echo "::notice title=Triggering TBA Enrichment::Starting TBA conference enrichment workflow" + gh workflow run enrich-tba-conferences.yml -f enrichment_level=full || { + echo "::warning title=Trigger Failed::Could not trigger TBA enrichment workflow" + } + + - name: Summary + if: always() + env: + SOURCE: ${{ steps.source.outputs.source }} + CHANGED: ${{ steps.check_changes.outputs.changed }} + DRY_RUN: ${{ inputs.dry_run }} + run: | + echo "" >> $GITHUB_STEP_SUMMARY + echo "## Result" >> $GITHUB_STEP_SUMMARY + + if [ "$CHANGED" = "true" ]; then + if [ "$DRY_RUN" = "true" ]; then + echo "- Status: Changes detected (dry run - not committed)" >> $GITHUB_STEP_SUMMARY + else + echo "- Status: ✅ Changes committed and PR updated" >> $GITHUB_STEP_SUMMARY + echo "- TBA Enrichment: Triggered" >> $GITHUB_STEP_SUMMARY + fi + else + echo "- Status: ✓ No new data from canonical sources" >> $GITHUB_STEP_SUMMARY + fi + + echo "- Source: $SOURCE" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/check-conference-update.yml b/.github/workflows/check-conference-update.yml new file mode 100644 index 00000000000..9db3888c778 --- /dev/null +++ b/.github/workflows/check-conference-update.yml @@ -0,0 +1,1329 @@ +name: Check Conference Update + +on: + # Triggered by changedetection.io webhook + repository_dispatch: + types: [conference-change] + + # Manual trigger for testing + workflow_dispatch: + inputs: + url: + description: 'Conference website URL to check' + required: true + type: string + conference_name: + description: 'Conference name (e.g., "PyCon US")' + required: true + type: string + skip_triage: + description: 'Skip triage and go straight to full analysis' + required: false + type: boolean + default: false + force_zone: + description: 'Override zone detection (normal/slow/dead)' + required: false + type: string + default: '' + +# Bug #3 Fix: Per-conference concurrency to prevent duplicate triggers +# Different conferences can run in parallel, but the same conference serializes +# This prevents race conditions when changedetection.io sends multiple notifications +concurrency: + group: conference-update-${{ github.event.client_payload.watch_uuid || inputs.url || github.run_id }} + cancel-in-progress: false + +permissions: + contents: write + pull-requests: write + issues: write + +jobs: + # Stage 0: Determine monitoring zone BEFORE spending money on triage + # This is FREE - just reads YAML and does date math + zone-check: + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + zone: ${{ steps.detect.outputs.zone }} + skip: ${{ steps.detect.outputs.skip }} + triage_mode: ${{ steps.detect.outputs.triage_mode }} + url: ${{ steps.vars.outputs.url }} + conference: ${{ steps.vars.outputs.conference }} + diff_b64: ${{ steps.vars.outputs.diff_b64 }} + watch_uuid: ${{ steps.vars.outputs.watch_uuid }} + has_diff: ${{ steps.vars.outputs.has_diff }} + has_pending: ${{ steps.pending.outputs.has_pending }} + # Trigger context from scheduled extension checker + trigger_reason: ${{ steps.vars.outputs.trigger_reason }} + original_cfp_deadline: ${{ steps.vars.outputs.original_cfp_deadline }} + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Validate payload + id: validate + env: + EVENT_NAME: ${{ github.event_name }} + PAYLOAD_URL: ${{ github.event.client_payload.url }} + PAYLOAD_TITLE: ${{ github.event.client_payload.title }} + PAYLOAD_UUID: ${{ github.event.client_payload.watch_uuid }} + INPUT_URL: ${{ inputs.url }} + INPUT_CONFERENCE: ${{ inputs.conference_name }} + run: | + # Payload validation: Fail fast with clear error messages if required fields are missing + # This helps diagnose issues like expired tokens or malformed webhook payloads + + echo "::group::Payload Validation" + echo "Event: $EVENT_NAME" + + if [ "$EVENT_NAME" = "repository_dispatch" ]; then + MISSING_FIELDS="" + + if [ -z "$PAYLOAD_URL" ]; then + MISSING_FIELDS="${MISSING_FIELDS}url, " + echo "::error title=Missing Field::client_payload.url is required for repository_dispatch" + fi + + if [ -z "$PAYLOAD_TITLE" ]; then + MISSING_FIELDS="${MISSING_FIELDS}title, " + echo "::error title=Missing Field::client_payload.title is required for repository_dispatch" + fi + + if [ -z "$PAYLOAD_UUID" ]; then + echo "::warning title=Missing Field::client_payload.watch_uuid is missing - concurrency may not work correctly" + fi + + if [ -n "$MISSING_FIELDS" ]; then + echo "::endgroup::" + echo "" + echo "## ❌ Payload Validation Failed" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Missing required fields: ${MISSING_FIELDS%, }" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "This usually indicates one of:" >> $GITHUB_STEP_SUMMARY + echo "- The GitHub PAT token used by changedetection.io is expired or has insufficient permissions" >> $GITHUB_STEP_SUMMARY + echo "- The webhook payload is malformed" >> $GITHUB_STEP_SUMMARY + echo "- The repository_dispatch event was triggered with incomplete data" >> $GITHUB_STEP_SUMMARY + exit 1 + fi + + echo "✓ All required fields present for repository_dispatch" + else + # workflow_dispatch validation + if [ -z "$INPUT_URL" ]; then + echo "::error title=Missing Input::url input is required for manual trigger" + echo "::endgroup::" + exit 1 + fi + + if [ -z "$INPUT_CONFERENCE" ]; then + echo "::error title=Missing Input::conference_name input is required for manual trigger" + echo "::endgroup::" + exit 1 + fi + + echo "✓ All required inputs present for workflow_dispatch" + fi + echo "::endgroup::" + + - name: Set up variables + id: vars + env: + # Pass webhook payload via env to prevent injection + PAYLOAD_URL: ${{ github.event.client_payload.url }} + PAYLOAD_TITLE: ${{ github.event.client_payload.title }} + PAYLOAD_DIFF: ${{ toJson(github.event.client_payload.diff) }} + PAYLOAD_UUID: ${{ github.event.client_payload.watch_uuid }} + # Trigger context from scheduled extension checker + PAYLOAD_TRIGGER_REASON: ${{ github.event.client_payload.trigger_reason }} + PAYLOAD_ORIGINAL_CFP: ${{ github.event.client_payload.original_cfp_deadline }} + INPUT_URL: ${{ inputs.url }} + INPUT_CONFERENCE: ${{ inputs.conference_name }} + EVENT_NAME: ${{ github.event_name }} + run: | + # Bug #2 Fix: Use base64 encoding for diff content to prevent heredoc delimiter collision + # The diff can contain arbitrary website content including strings that look like delimiters + + if [ "$EVENT_NAME" = "repository_dispatch" ]; then + echo "url=$PAYLOAD_URL" >> $GITHUB_OUTPUT + echo "conference=$PAYLOAD_TITLE" >> $GITHUB_OUTPUT + # Base64 encode the diff to safely pass multi-line content with special characters + DIFF_B64=$(printf '%s' "$PAYLOAD_DIFF" | base64 -w 0) + echo "diff_b64=$DIFF_B64" >> $GITHUB_OUTPUT + echo "watch_uuid=$PAYLOAD_UUID" >> $GITHUB_OUTPUT + echo "has_diff=true" >> $GITHUB_OUTPUT + # Trigger context (empty if from changedetection.io, populated if from scheduled checker) + echo "trigger_reason=${PAYLOAD_TRIGGER_REASON:-website_change}" >> $GITHUB_OUTPUT + echo "original_cfp_deadline=${PAYLOAD_ORIGINAL_CFP:-}" >> $GITHUB_OUTPUT + else + echo "url=$INPUT_URL" >> $GITHUB_OUTPUT + echo "conference=$INPUT_CONFERENCE" >> $GITHUB_OUTPUT + echo "has_diff=false" >> $GITHUB_OUTPUT + echo "watch_uuid=" >> $GITHUB_OUTPUT + echo "diff_b64=" >> $GITHUB_OUTPUT + echo "trigger_reason=manual" >> $GITHUB_OUTPUT + echo "original_cfp_deadline=" >> $GITHUB_OUTPUT + fi + + - name: Check for pending updates + id: pending + env: + CONF_NAME: ${{ steps.vars.outputs.conference }} + CONF_URL: ${{ steps.vars.outputs.url }} + UPDATE_BRANCH: auto/conference-updates + GH_TOKEN: ${{ github.token }} + run: | + # Bug #1 Fix (Revised): Check if any open PR modifies the same conference FILE + # This is more precise than fuzzy title/branch matching + # Logic: Find PRs that modify _data/conferences.yml, then check if their diff includes this conference + + echo "::group::Checking for open PRs modifying ${CONF_NAME}" + + MATCHING_PR_NUM="" + TARGET_FILE="_data/conferences.yml" + + # Get all open PRs + OPEN_PRS=$(gh pr list --state open --json number,title --jq '.[].number' --limit 50 2>/dev/null || echo "") + + if [ -n "$OPEN_PRS" ]; then + echo "Found $(echo "$OPEN_PRS" | wc -w) open PRs, checking which ones modify $TARGET_FILE..." + + for PR_NUM in $OPEN_PRS; do + # Get files changed by this PR + CHANGED_FILES=$(gh pr view "$PR_NUM" --json files --jq '.files[].path' 2>/dev/null || echo "") + + # Check if this PR modifies the conferences file + if echo "$CHANGED_FILES" | grep -q "^${TARGET_FILE}$"; then + echo "PR #$PR_NUM modifies $TARGET_FILE, checking if it affects ${CONF_NAME}..." + + # Get the PR diff and search for this conference + # Use Python for safe string matching + PR_DIFF=$(gh pr diff "$PR_NUM" -- "$TARGET_FILE" 2>/dev/null || echo "") + + if [ -n "$PR_DIFF" ]; then + export PR_DIFF + FOUND=$(python3 << 'DIFFSEARCH' + import os + import re + + conf_name = os.environ.get('CONF_NAME', '').lower() + diff_content = os.environ.get('PR_DIFF', '').lower() + + # Normalize conference name for matching + # "PyCon US" -> also match "pycon us", "pycon-us", etc. + conf_slug = re.sub(r'[^a-z0-9]+', '-', conf_name).strip('-') + conf_compact = re.sub(r'[^a-z0-9]+', '', conf_name) + + # Check if this conference appears in the diff + if (conf_name in diff_content or + conf_slug in diff_content or + conf_compact in diff_content): + print("FOUND") + DIFFSEARCH + ) + + if [ "$FOUND" = "FOUND" ]; then + MATCHING_PR_NUM="$PR_NUM" + echo "PR #$PR_NUM modifies ${CONF_NAME}" + break + fi + fi + fi + done + + if [ -z "$MATCHING_PR_NUM" ]; then + echo "Checked all PRs - none modify ${CONF_NAME} in $TARGET_FILE" + fi + else + echo "No open PRs found" + fi + + if [ -n "$MATCHING_PR_NUM" ]; then + MATCHING_PR=$(gh pr view "$MATCHING_PR_NUM" --json title,url --jq '"\(.title) (\(.url))"' 2>/dev/null || echo "PR #$MATCHING_PR_NUM") + echo "has_pending=true" >> $GITHUB_OUTPUT + echo "pending_pr=$MATCHING_PR_NUM" >> $GITHUB_OUTPUT + echo "::notice title=Open PR Found::${CONF_NAME} already has an open PR: ${MATCHING_PR}" + echo "::endgroup::" + exit 0 + fi + + echo "::endgroup::" + + # Also check the accumulator branch for pending commits + echo "::group::Checking accumulator branch for pending commits" + if git ls-remote --heads origin "$UPDATE_BRANCH" | grep -q "$UPDATE_BRANCH"; then + git fetch origin "$UPDATE_BRANCH" --depth=50 + + # Look for commits mentioning this conference that aren't in main yet + if git log "origin/main..origin/$UPDATE_BRANCH" --oneline --grep="conf: ${CONF_NAME}" 2>/dev/null | grep -q .; then + PENDING_COMMIT=$(git log "origin/main..origin/$UPDATE_BRANCH" --oneline --grep="conf: ${CONF_NAME}" -1) + + # Check if there's an open PR from the update branch + OPEN_PR=$(gh pr list --head "$UPDATE_BRANCH" --state open --json number --jq '.[0].number' 2>/dev/null || echo "") + + if [ -n "$OPEN_PR" ]; then + echo "has_pending=true" >> $GITHUB_OUTPUT + echo "pending_pr=$OPEN_PR" >> $GITHUB_OUTPUT + echo "::notice title=Pending Update::${CONF_NAME} already has pending commit: ${PENDING_COMMIT} (PR #${OPEN_PR})" + else + echo "has_pending=false" >> $GITHUB_OUTPUT + echo "::notice title=Stale Branch::${CONF_NAME} has commit ${PENDING_COMMIT} but no open PR - proceeding with update" + fi + else + echo "has_pending=false" >> $GITHUB_OUTPUT + fi + else + echo "has_pending=false" >> $GITHUB_OUTPUT + fi + echo "::endgroup::" + + - name: Detect monitoring zone + id: detect + env: + CONF_NAME: ${{ steps.vars.outputs.conference }} + FORCE_ZONE: ${{ inputs.force_zone }} + run: | + # Allow manual override + if [ -n "$FORCE_ZONE" ]; then + echo "zone=$FORCE_ZONE" >> $GITHUB_OUTPUT + if [ "$FORCE_ZONE" = "dead" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + echo "triage_mode=$FORCE_ZONE" >> $GITHUB_OUTPUT + echo "::notice title=Zone Override::Manually set to $FORCE_ZONE" + exit 0 + fi + + # Run zone detection (safe - uses env vars, not interpolation) + python3 << 'ZONECHECK' > /tmp/zone_check.txt 2>&1 + import yaml + import os + import sys + from datetime import datetime, timedelta + + conf_name = os.environ.get('CONF_NAME', '') + today = datetime.now().date() + + # Load both conferences.yml and archive.yml + all_confs = [] + + try: + with open("_data/conferences.yml") as f: + confs = yaml.safe_load(f) or [] + all_confs.extend(confs) + except FileNotFoundError: + print("INFO: conferences.yml not found", file=sys.stderr) + except yaml.YAMLError as e: + print(f"WARNING: Failed to parse conferences.yml: {e}", file=sys.stderr) + + try: + with open("_data/archive.yml") as f: + archived = yaml.safe_load(f) or [] + all_confs.extend(archived) + except FileNotFoundError: + print("INFO: archive.yml not found", file=sys.stderr) + except yaml.YAMLError as e: + print(f"WARNING: Failed to parse archive.yml: {e}", file=sys.stderr) + + if not all_confs: + print("No conference data found - defaulting to NORMAL zone") + print("ZONE=normal") + print("SKIP=false") + print("TRIAGE_MODE=normal") + sys.exit(0) + + # Find the most recent entry for this conference (highest year) + matching = [c for c in all_confs if conf_name.lower() in c.get("conference", "").lower()] + conf = max(matching, key=lambda x: x.get("year", 0)) if matching else None + + if not conf: + print(f"Conference '{conf_name}' not found - NORMAL zone (discovery mode)") + print("ZONE=normal") + print("SKIP=false") + print("TRIAGE_MODE=normal") + sys.exit(0) + + # Get CFP date (use extension if available) + cfp_str = conf.get("cfp_ext") or conf.get("cfp", "TBA") + has_extension = conf.get("cfp_ext") is not None + + # Get conference end date + end_date = conf.get("end") + if isinstance(end_date, str): + end_date = datetime.strptime(end_date, "%Y-%m-%d").date() + + # No CFP yet = NORMAL zone (actively hunting for CFP) + if cfp_str in ("TBA", "Cancelled", "None"): + print(f"No CFP announced yet for {conf_name} - NORMAL zone (hunting mode)") + print("ZONE=normal") + print("SKIP=false") + print("TRIAGE_MODE=normal") + sys.exit(0) + + # Parse CFP date + try: + cfp_date = datetime.strptime(cfp_str[:10], "%Y-%m-%d").date() + except ValueError as e: + print(f"WARNING: Could not parse CFP date '{cfp_str}': {e}", file=sys.stderr) + print("ZONE=normal") + print("SKIP=false") + print("TRIAGE_MODE=normal") + sys.exit(0) + + dead_zone_end = end_date + timedelta(days=60) + + # CFP is still open = SLOW zone + if today <= cfp_date: + print(f"CFP open until {cfp_date} - SLOW zone (watching for extensions)") + print("ZONE=slow") + print("SKIP=false") + print("TRIAGE_MODE=slow") + sys.exit(0) + + # CFP just closed (within 3 days) and no extension yet + extension_window = cfp_date + timedelta(days=3) + if today <= extension_window and not has_extension: + print(f"CFP just closed ({cfp_date}) - extension_watch zone") + print("ZONE=extension_watch") + print("SKIP=false") + print("TRIAGE_MODE=slow") + sys.exit(0) + + # Between CFP close and conference end + 60 days = DEAD zone + if cfp_date < today <= dead_zone_end: + print(f"DEAD zone: CFP closed {cfp_date}, no updates until {dead_zone_end}") + print("ZONE=dead") + print("SKIP=true") + print("TRIAGE_MODE=dead") + sys.exit(0) + + # Past dead zone = NORMAL (hunting for next year's CFP) + print(f"Past dead zone ({dead_zone_end}) - NORMAL zone (hunting next year)") + print("ZONE=normal") + print("SKIP=false") + print("TRIAGE_MODE=normal") + ZONECHECK + + # Parse results + cat /tmp/zone_check.txt + + ZONE=$(grep "^ZONE=" /tmp/zone_check.txt | cut -d= -f2 || echo "normal") + SKIP=$(grep "^SKIP=" /tmp/zone_check.txt | cut -d= -f2 || echo "false") + TRIAGE_MODE=$(grep "^TRIAGE_MODE=" /tmp/zone_check.txt | cut -d= -f2 || echo "normal") + + echo "zone=${ZONE:-normal}" >> $GITHUB_OUTPUT + echo "skip=${SKIP:-false}" >> $GITHUB_OUTPUT + echo "triage_mode=${TRIAGE_MODE:-normal}" >> $GITHUB_OUTPUT + + echo "::group::Zone Detection Results" + echo "Conference: $CONF_NAME" + echo "Zone: $ZONE" + echo "Skip: $SKIP" + echo "Triage mode: $TRIAGE_MODE" + echo "::endgroup::" + + - name: Log zone detection + env: + CONFERENCE: ${{ steps.vars.outputs.conference }} + ZONE: ${{ steps.detect.outputs.zone }} + SKIP: ${{ steps.detect.outputs.skip }} + TRIAGE_MODE: ${{ steps.detect.outputs.triage_mode }} + run: | + echo "## Zone Detection" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Conference:** $CONFERENCE" >> $GITHUB_STEP_SUMMARY + echo "**Zone:** $ZONE" >> $GITHUB_STEP_SUMMARY + echo "**Skip:** $SKIP" >> $GITHUB_STEP_SUMMARY + echo "**Triage Mode:** $TRIAGE_MODE" >> $GITHUB_STEP_SUMMARY + + # Stage 1: Quick triage using DIRECT API call (no agent overhead) + # This is ~10x cheaper than using claude-code-action for simple classification + triage: + needs: zone-check + if: needs.zone-check.outputs.skip != 'true' && needs.zone-check.outputs.has_pending != 'true' + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + should_analyze: ${{ steps.parse.outputs.should_analyze }} + triage_reason: ${{ steps.parse.outputs.reason }} + suggested_filters: ${{ steps.parse.outputs.suggested_filters }} + is_new_year: ${{ steps.parse.outputs.is_new_year }} + detected_year: ${{ steps.parse.outputs.detected_year }} + + steps: + - name: Check if triage should be skipped + id: skip_check + env: + SKIP_TRIAGE: ${{ inputs.skip_triage }} + HAS_DIFF: ${{ needs.zone-check.outputs.has_diff }} + run: | + if [ "$SKIP_TRIAGE" = "true" ] || [ "$HAS_DIFF" = "false" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + echo "::notice title=Triage Skipped::Manual trigger or no diff available" + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + # Direct API call - much cheaper than agent mode for simple classification + - name: Quick triage via API + id: triage_api + if: steps.skip_check.outputs.skip != 'true' + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + CONF_URL: ${{ needs.zone-check.outputs.url }} + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + DIFF_B64: ${{ needs.zone-check.outputs.diff_b64 }} + TRIAGE_MODE: ${{ needs.zone-check.outputs.triage_mode }} + # Trigger context from scheduled extension checker + TRIGGER_REASON: ${{ needs.zone-check.outputs.trigger_reason }} + ORIGINAL_CFP_DEADLINE: ${{ needs.zone-check.outputs.original_cfp_deadline }} + run: | + # Bug #2 Fix: Decode base64 diff content + # The diff is base64 encoded to safely pass multi-line content with special characters + if [ -n "$DIFF_B64" ]; then + DIFF_CONTENT=$(echo "$DIFF_B64" | base64 -d 2>/dev/null || echo "Failed to decode diff") + else + DIFF_CONTENT="No diff available" + fi + export DIFF_CONTENT + + # Build the appropriate prompt based on trigger context and triage mode + # Priority: extension_check trigger > slow zone > general website change + # Export so Python subprocess can access it + if [ "$TRIGGER_REASON" = "extension_check" ]; then + # Triggered by scheduled extension checker - CFP deadline has passed + export PROMPT="You are checking for a CFP EXTENSION. The CFP deadline (${ORIGINAL_CFP_DEADLINE}) has passed. Focus ONLY on: 1) Whether the CFP was extended (new deadline announced), 2) Any 'extended', 'deadline moved', 'last chance' announcements. If you find a new CFP deadline date, mark RELEVANT and include the new date in REASON. If NO extension is mentioned, mark NOISE with REASON 'No CFP extension found'. Do NOT mark relevant for general website changes, schedules, speakers, etc." + echo "::notice title=Trigger Context::Scheduled CFP extension check (deadline was ${ORIGINAL_CFP_DEADLINE})" + elif [ "$TRIAGE_MODE" = "slow" ]; then + export PROMPT="You are a STRICT triage filter. This conference already has a CFP deadline - we ONLY care about EXTENSIONS. RELEVANT (extension indicators): extended, extension, new deadline, deadline moved, pushed back, more time, last chance. NOISE (everything else): speaker announcements, schedule, sponsors, registration, venue info. Be STRICT - if not clearly about deadline extension, mark NOISE." + else + export PROMPT="You are a triage filter for a Python conference tracker. NEW YEAR indicators: future year (2025/2026/2027) WITH SPECIFIC DATES (exact days like 'September 15-17', not just month or season). RELEVANT: CFP announcements with specific deadlines (exact date), specific conference dates announced (exact days). NOISE: copyright year only, timestamps, counters, typos, cookies, nav changes, sponsors, speakers, schedule. ALSO NOISE: Vague date announcements ('sometime in September', 'early 2026', 'Fall 2026', 'dates TBD', 'coming soon') - these are not actionable until specific dates are published." + fi + + # Create the API request payload + cat > /tmp/request.json << 'PAYLOAD_END' + { + "model": "claude-haiku-4-5-20251001", + "max_tokens": 256, + "messages": [ + { + "role": "user", + "content": "PROMPT_PLACEHOLDER\n\nConference: CONF_PLACEHOLDER\nURL: URL_PLACEHOLDER\n\nDIFF:\n```\nDIFF_PLACEHOLDER\n```\n\nRespond with EXACTLY this format:\nDECISION: RELEVANT or NOISE\nNEW_YEAR: YES or NO\nDETECTED_YEAR: [year or none]\nREASON: [one sentence]\nCONFIDENCE: HIGH, MEDIUM, or LOW\nSUGGESTED_FILTERS: [CSS selectors like '.footer, #nav, .countdown' and/or text patterns like 'text:Copyright, text:Last updated' - or 'none' if no filters needed. Do NOT use natural language descriptions.]" + } + ] + } + PAYLOAD_END + + # Use Python to safely substitute values (prevents injection) + python3 << 'PYSUBST' + import json + import os + + with open('/tmp/request.json') as f: + data = json.load(f) + + prompt = os.environ.get('PROMPT', '') + conf_name = os.environ.get('CONF_NAME', '') + conf_url = os.environ.get('CONF_URL', '') + diff = os.environ.get('DIFF_CONTENT', '')[:8000] # Limit diff size + + content = data['messages'][0]['content'] + content = content.replace('PROMPT_PLACEHOLDER', prompt) + content = content.replace('CONF_PLACEHOLDER', conf_name) + content = content.replace('URL_PLACEHOLDER', conf_url) + content = content.replace('DIFF_PLACEHOLDER', diff) + data['messages'][0]['content'] = content + + with open('/tmp/request.json', 'w') as f: + json.dump(data, f) + PYSUBST + + # Make the API call with retry for transient errors + echo "Calling Claude API for triage..." + for attempt in 1 2 3; do + HTTP_CODE=$(curl -s -w "%{http_code}" -o /tmp/response.json \ + -X POST "https://api.anthropic.com/v1/messages" \ + -H "x-api-key: $ANTHROPIC_API_KEY" \ + -H "content-type: application/json" \ + -H "anthropic-version: 2023-06-01" \ + -d @/tmp/request.json) + + # Success + if [ "$HTTP_CODE" = "200" ]; then + break + fi + + # Retry on rate limit (429) or overloaded (529) + if [ "$HTTP_CODE" = "429" ] || [ "$HTTP_CODE" = "529" ]; then + echo "::warning title=API Rate Limited::HTTP $HTTP_CODE, attempt $attempt/3" + sleep $((attempt * 5)) + continue + fi + + # Other errors - don't retry + break + done + + if [ "$HTTP_CODE" != "200" ]; then + echo "::warning title=API Error::HTTP $HTTP_CODE - falling back to full analysis" + echo "success=false" >> $GITHUB_OUTPUT + cat /tmp/response.json >&2 + exit 0 + fi + + # Extract the response text + RESPONSE=$(jq -r '.content[0].text // ""' /tmp/response.json) + + if [ -z "$RESPONSE" ]; then + echo "::warning title=Empty Response::No content in API response" + echo "success=false" >> $GITHUB_OUTPUT + exit 0 + fi + + echo "success=true" >> $GITHUB_OUTPUT + + # Save response for parsing + DELIM="RESP_EOF_$(date +%s%N)_$$" + echo "response<<$DELIM" >> $GITHUB_OUTPUT + echo "$RESPONSE" >> $GITHUB_OUTPUT + echo "$DELIM" >> $GITHUB_OUTPUT + + # Log token usage (use awk instead of bc for portability) + INPUT_TOKENS=$(jq -r '.usage.input_tokens // 0' /tmp/response.json) + OUTPUT_TOKENS=$(jq -r '.usage.output_tokens // 0' /tmp/response.json) + echo "::group::API Usage" + echo "Input tokens: $INPUT_TOKENS" + echo "Output tokens: $OUTPUT_TOKENS" + COST=$(awk "BEGIN {printf \"%.6f\", $INPUT_TOKENS * 0.00000025 + $OUTPUT_TOKENS * 0.00000125}") + echo "Estimated cost: \$$COST" + echo "::endgroup::" + + # Cleanup temp files (security best practice) + rm -f /tmp/request.json + + - name: Parse triage result + id: parse + env: + SKIP_CHECK: ${{ steps.skip_check.outputs.skip }} + API_SUCCESS: ${{ steps.triage_api.outputs.success }} + TRIAGE_RESPONSE: ${{ steps.triage_api.outputs.response }} + TRIGGER_REASON: ${{ needs.zone-check.outputs.trigger_reason }} + ORIGINAL_CFP_DEADLINE: ${{ needs.zone-check.outputs.original_cfp_deadline }} + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + run: | + # Default to analyzing if triage was skipped + if [ "$SKIP_CHECK" = "true" ]; then + echo "should_analyze=true" >> $GITHUB_OUTPUT + echo "reason=Triage skipped - manual trigger or no diff" >> $GITHUB_OUTPUT + echo "suggested_filters=" >> $GITHUB_OUTPUT + echo "is_new_year=false" >> $GITHUB_OUTPUT + echo "detected_year=" >> $GITHUB_OUTPUT + exit 0 + fi + + # Default to analyzing if API call failed + if [ "$API_SUCCESS" != "true" ]; then + echo "should_analyze=true" >> $GITHUB_OUTPUT + echo "reason=Triage API failed - analyzing as fallback" >> $GITHUB_OUTPUT + echo "suggested_filters=" >> $GITHUB_OUTPUT + echo "is_new_year=false" >> $GITHUB_OUTPUT + echo "detected_year=" >> $GITHUB_OUTPUT + exit 0 + fi + + echo "::group::Triage Response" + echo "$TRIAGE_RESPONSE" + echo "::endgroup::" + + # Parse DECISION (case-insensitive, whitespace-tolerant) + if echo "$TRIAGE_RESPONSE" | grep -iqE "DECISION:\s*RELEVANT"; then + echo "should_analyze=true" >> $GITHUB_OUTPUT + elif echo "$TRIAGE_RESPONSE" | grep -iqE "DECISION:\s*NOISE"; then + # Check confidence - if LOW, analyze anyway + if echo "$TRIAGE_RESPONSE" | grep -iqE "CONFIDENCE:\s*LOW"; then + echo "should_analyze=true" >> $GITHUB_OUTPUT + echo "::notice title=Low Confidence::Analyzing despite NOISE decision" + else + echo "should_analyze=false" >> $GITHUB_OUTPUT + # Log "no extension found" specifically for extension checks + if [ "$TRIGGER_REASON" = "extension_check" ]; then + echo "::notice title=No Extension Found::${CONF_NAME} - CFP deadline ${ORIGINAL_CFP_DEADLINE} was NOT extended" + echo "## ✓ No Extension Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Conference:** ${CONF_NAME}" >> $GITHUB_STEP_SUMMARY + echo "**Original CFP deadline:** ${ORIGINAL_CFP_DEADLINE}" >> $GITHUB_STEP_SUMMARY + echo "**Result:** No CFP extension announced - no PR needed" >> $GITHUB_STEP_SUMMARY + fi + fi + else + echo "should_analyze=true" >> $GITHUB_OUTPUT + echo "::warning title=Parse Error::Could not parse DECISION, defaulting to analyze" + fi + + # Parse NEW_YEAR + if echo "$TRIAGE_RESPONSE" | grep -iqE "NEW_YEAR:\s*YES"; then + echo "is_new_year=true" >> $GITHUB_OUTPUT + else + echo "is_new_year=false" >> $GITHUB_OUTPUT + fi + + # Parse DETECTED_YEAR + DETECTED_YEAR=$(echo "$TRIAGE_RESPONSE" | grep -iE "DETECTED_YEAR:" | sed 's/.*DETECTED_YEAR:\s*//i' | head -1 | tr -d ' ') + if [ "$DETECTED_YEAR" = "none" ] || [ -z "$DETECTED_YEAR" ]; then + echo "detected_year=" >> $GITHUB_OUTPUT + else + echo "detected_year=$DETECTED_YEAR" >> $GITHUB_OUTPUT + fi + + # Extract reason + REASON=$(echo "$TRIAGE_RESPONSE" | grep -iE "REASON:" | sed 's/.*REASON:\s*//i' | head -1) + echo "reason=${REASON:-Triage completed}" >> $GITHUB_OUTPUT + + # Extract suggested filters + FILTERS=$(echo "$TRIAGE_RESPONSE" | grep -iE "SUGGESTED_FILTERS:" | sed 's/.*SUGGESTED_FILTERS:\s*//i' | head -1) + echo "suggested_filters=${FILTERS:-}" >> $GITHUB_OUTPUT + + # Apply filters directly to changedetection.io + apply-filters: + needs: [zone-check, triage] + if: | + always() && + needs.triage.outputs.should_analyze == 'false' && + needs.triage.outputs.suggested_filters != 'none' && + needs.triage.outputs.suggested_filters != '' + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: + issues: write + + steps: + - name: Apply filters via API + id: apply_api + if: vars.CHANGEDETECTION_URL != '' && needs.zone-check.outputs.watch_uuid != '' + env: + WATCH_UUID: ${{ needs.zone-check.outputs.watch_uuid }} + FILTERS: ${{ needs.triage.outputs.suggested_filters }} + CHANGEDETECTION_URL: ${{ vars.CHANGEDETECTION_URL }} + CHANGEDETECTION_KEY: ${{ secrets.CHANGEDETECTION_KEY }} + CF_ACCESS_CLIENT_ID: ${{ secrets.CF_ACCESS_CLIENT_ID }} + CF_ACCESS_CLIENT_SECRET: ${{ secrets.CF_ACCESS_CLIENT_SECRET }} + run: | + if [ -z "$FILTERS" ] || [ "$FILTERS" = "none" ]; then + echo "No filters to apply" + echo "success=skipped" >> $GITHUB_OUTPUT + exit 0 + fi + + # Validate filter format: must contain CSS selectors (starting with . # or tag names) + # or text: patterns. Reject natural language descriptions. + # Valid examples: ".footer, #nav, text:Copyright" + # Invalid: "Filter out pages discussing..." + if ! echo "$FILTERS" | grep -qE '^\s*([.#]|text:|[a-z]+\[|[a-z]+\s*,|[a-z]+\s*$)' ; then + # Check if it looks like natural language (contains common words) + if echo "$FILTERS" | grep -qiE '\b(filter|out|pages|discussing|announcements|containing|patterns|deadline)\b'; then + echo "::warning::Filters appear to be natural language, not CSS selectors. Skipping." + echo "success=skipped" >> $GITHUB_OUTPUT + exit 0 + fi + fi + + # Parse CSS selectors and text patterns + CSS_FILTERS=$(echo "$FILTERS" | tr ',' '\n' | grep -v 'text:' | sed 's/^ *//' | tr '\n' ',' | sed 's/,$//') + TEXT_PATTERNS=$(echo "$FILTERS" | tr ',' '\n' | grep 'text:' | sed 's/text://' | sed 's/^ *//' | jq -R -s -c 'split("\n") | map(select(length > 0))') + + echo "::group::Filter Details" + echo "CSS filters: $CSS_FILTERS" + echo "Text patterns: $TEXT_PATTERNS" + echo "::endgroup::" + + # Fetch current config + CURRENT=$(curl -sf \ + -H "x-api-key: $CHANGEDETECTION_KEY" \ + -H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \ + -H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET" \ + "$CHANGEDETECTION_URL/api/v1/watch/$WATCH_UUID") || { + echo "::warning::Failed to fetch watch config" + echo "success=false" >> $GITHUB_OUTPUT + exit 0 + } + + # Merge filters + EXISTING_CSS=$(echo "$CURRENT" | jq -r '.subtractive_selectors // ""') + if [ -n "$EXISTING_CSS" ] && [ "$EXISTING_CSS" != "null" ] && [ -n "$CSS_FILTERS" ]; then + MERGED_CSS="$EXISTING_CSS, $CSS_FILTERS" + elif [ -n "$CSS_FILTERS" ]; then + MERGED_CSS="$CSS_FILTERS" + else + MERGED_CSS="$EXISTING_CSS" + fi + + EXISTING_TEXT=$(echo "$CURRENT" | jq -c '.ignore_text // []' 2>/dev/null) || EXISTING_TEXT="[]" + # Ensure EXISTING_TEXT is valid JSON array + if ! echo "$EXISTING_TEXT" | jq -e 'type == "array"' > /dev/null 2>&1; then + EXISTING_TEXT="[]" + fi + + # Ensure TEXT_PATTERNS is valid JSON array + if [ -z "$TEXT_PATTERNS" ] || ! echo "$TEXT_PATTERNS" | jq -e 'type == "array"' > /dev/null 2>&1; then + TEXT_PATTERNS="[]" + fi + + if [ "$TEXT_PATTERNS" != "[]" ]; then + MERGED_TEXT=$(echo "$EXISTING_TEXT $TEXT_PATTERNS" | jq -s 'add | unique' 2>/dev/null) || MERGED_TEXT="$EXISTING_TEXT" + else + MERGED_TEXT="$EXISTING_TEXT" + fi + + # Final validation: ensure MERGED_TEXT is valid JSON array + if ! echo "$MERGED_TEXT" | jq -e 'type == "array"' > /dev/null 2>&1; then + MERGED_TEXT="[]" + fi + + # Apply update + UPDATE_PAYLOAD=$(jq -n --arg css "$MERGED_CSS" --argjson text "$MERGED_TEXT" '{subtractive_selectors: $css, ignore_text: $text}') + + curl -sf -X PUT \ + -H "x-api-key: $CHANGEDETECTION_KEY" \ + -H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \ + -H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET" \ + -H "Content-Type: application/json" \ + -d "$UPDATE_PAYLOAD" \ + "$CHANGEDETECTION_URL/api/v1/watch/$WATCH_UUID" && { + echo "success=true" >> $GITHUB_OUTPUT + echo "::notice::Filters applied successfully" + } || { + echo "success=false" >> $GITHUB_OUTPUT + echo "::warning::Failed to apply filters" + } + + - name: Log unapplied filter suggestion + if: steps.apply_api.outputs.success == 'false' || vars.CHANGEDETECTION_URL == '' + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + TRIAGE_FILTERS: ${{ needs.triage.outputs.suggested_filters }} + run: | + echo "::warning title=Filter Not Applied::Could not apply filters for ${CONF_NAME}: ${TRIAGE_FILTERS}" + + # Stage 2: Full analysis with Claude Code Action (needs file editing tools) + analyze-update: + needs: [zone-check, triage] + if: | + needs.zone-check.outputs.skip != 'true' && + needs.zone-check.outputs.has_pending != 'true' && + needs.triage.outputs.should_analyze == 'true' && + needs.triage.outputs.is_new_year != 'true' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + id-token: write + + env: + UPDATE_BRANCH: auto/conference-updates + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + with: + fetch-depth: 0 + token: ${{ github.token }} + persist-credentials: true + + - name: Configure git identity + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Setup accumulator branch + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + + if git ls-remote --heads origin $UPDATE_BRANCH | grep -q $UPDATE_BRANCH; then + git fetch origin $UPDATE_BRANCH + git checkout $UPDATE_BRANCH + # Try rebase first, then merge, fail if neither works + if ! git rebase origin/main; then + echo "::warning title=Rebase Failed::Attempting merge instead" + git rebase --abort 2>/dev/null || true + if ! git merge origin/main --no-edit; then + git merge --abort 2>/dev/null || true + echo "::warning title=Merge Conflict::Auto-resolving conflicts in favor of main" + if ! git merge origin/main -X theirs --no-edit; then + git merge --abort 2>/dev/null || true + echo "::error title=Branch Sync Failed::Could not sync with main" + exit 1 + fi + fi + fi + else + git checkout -b $UPDATE_BRANCH + fi + + - name: Snapshot conferences.yml + run: cp _data/conferences.yml /tmp/conferences_before.yml + + - name: Prepare content + id: content + env: + DIFF_B64: ${{ needs.zone-check.outputs.diff_b64 }} + CONF_URL: ${{ needs.zone-check.outputs.url }} + HAS_DIFF: ${{ needs.zone-check.outputs.has_diff }} + run: | + # Bug #2 Fix: Write content to a temp file instead of using heredoc + # This prevents delimiter collision when scraped content contains special characters + # Claude Code Action can read the file using its Read tool + + CONTENT_FILE="${RUNNER_TEMP}/website_content.txt" + + # Decode base64 diff if available + if [ "$HAS_DIFF" = "true" ] && [ -n "$DIFF_B64" ]; then + DIFF_CONTENT=$(echo "$DIFF_B64" | base64 -d 2>/dev/null || echo "") + DIFF_LENGTH=${#DIFF_CONTENT} + else + DIFF_CONTENT="" + DIFF_LENGTH=0 + fi + + if [ "$DIFF_LENGTH" -gt 100 ]; then + echo "source=diff" >> $GITHUB_OUTPUT + printf '%s' "$DIFF_CONTENT" > "$CONTENT_FILE" + else + echo "source=fetched" >> $GITHUB_OUTPUT + # Use lynx for clean text extraction (much fewer tokens than raw HTML) + sudo apt-get install -qq -y lynx > /dev/null 2>&1 || true + lynx -dump -nolist -nonumbers -width=200 "$CONF_URL" 2>/dev/null | head -c 6000 > "$CONTENT_FILE" || echo "Failed to fetch content" > "$CONTENT_FILE" + fi + + # Store the file path as output (safe - no special characters) + echo "content_file=$CONTENT_FILE" >> $GITHUB_OUTPUT + echo "::notice title=Content::Stored $(wc -c < "$CONTENT_FILE") bytes in $CONTENT_FILE" + + # Workaround for anthropics/claude-code-action#900: the action's + # checkHumanActor calls the GitHub API before checking allowed_bots, + # which 404s for bot actors like github-actions[bot]. Override + # GITHUB_ACTOR so the action sees a real user. + - name: Fix actor for bot-triggered runs + if: contains(github.actor, '[bot]') + run: echo "GITHUB_ACTOR=${{ github.repository_owner }}" >> "$GITHUB_ENV" + + - name: Run Claude Code Analysis + uses: anthropics/claude-code-action@v1.0.191 + with: + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + allowed_bots: 'github-actions[bot]' + prompt: | + Update pythondeadlin.es conference data. DO NOT use Task tool or fetch URLs. + + Conference: ${{ needs.zone-check.outputs.conference }} + URL: ${{ needs.zone-check.outputs.url }} + Zone: ${{ needs.zone-check.outputs.zone }} + Reason: ${{ needs.triage.outputs.triage_reason }} + + FIRST: Use the Read tool to read the website content from: ${{ steps.content.outputs.content_file }} + This file contains either the diff of recent changes or the fetched website content. + + Task: Read _data/conferences.yml, find this conference, update if needed. + If zone is slow/extension_watch: ONLY update cfp_ext for extensions. + If zone is normal: update CFP dates, conference dates, URLs. + + Schema: conference (no year), year (int), link, cfp ('YYYY-MM-DD HH:mm:ss' or 'TBA'), cfp_ext (extended deadline), place ("City, Country"), start/end (YYYY-MM-DD), sub (PY|SCIPY|DATA|WEB|BIZ|GEO) + + CFP Extension: Keep original cfp, set cfp_ext to new deadline. + + CRITICAL: Only update dates if you find SPECIFIC dates (e.g., "September 15-17, 2026"). If dates are vague ("sometime in September", "Fall 2026", "TBD"), do NOT update the entry. Report "No changes - specific dates not found" and make no edits. Never fabricate or approximate dates. + claude_args: | + --model claude-haiku-4-5-20251001 + --max-turns 5 + --allowedTools Read,Edit,Grep,Glob + + - name: Check for changes + id: check_changes + run: | + if ! diff -q _data/conferences.yml /tmp/conferences_before.yml > /dev/null 2>&1; then + echo "changed=true" >> $GITHUB_OUTPUT + else + echo "changed=false" >> $GITHUB_OUTPUT + fi + + - name: Setup Pixi + if: steps.check_changes.outputs.changed == 'true' + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: Sort conferences + if: steps.check_changes.outputs.changed == 'true' + run: pixi run sort + + - name: Commit and push + if: steps.check_changes.outputs.changed == 'true' + id: commit + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + CONF_URL: ${{ needs.zone-check.outputs.url }} + CONF_ZONE: ${{ needs.zone-check.outputs.zone }} + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + git add _data/conferences.yml + git commit -m "conf: ${CONF_NAME}" -m "Source: ${CONF_URL}" -m "Zone: ${CONF_ZONE}" + git push origin $UPDATE_BRANCH --force-with-lease + echo "commit_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + + - name: Create or update PR + if: steps.check_changes.outputs.changed == 'true' + uses: actions/github-script@v9 + env: + UPDATE_BRANCH: ${{ env.UPDATE_BRANCH }} + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + COMMIT_SHA: ${{ steps.commit.outputs.commit_sha }} + with: + script: | + const branch = process.env.UPDATE_BRANCH; + const conference = process.env.CONF_NAME; + const sha = process.env.COMMIT_SHA.substring(0, 7); + const date = new Date().toISOString().split('T')[0]; + + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:${branch}`, + state: 'open' + }); + + const entry = `| ${conference} | [${sha}](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/commit/${process.env.COMMIT_SHA}) | ${date} |`; + + if (prs.length > 0) { + const pr = prs[0]; + let body = pr.body || ''; + body = body.replace(/()/, `${entry}\n$1`); + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pr.number, + body + }); + } else { + const { data: newPr } = await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: '🐍 Conference updates', + head: branch, + base: 'main', + body: `## 🐍 Automated Conference Updates\n\n| Conference | Commit | Date |\n|------------|--------|------|\n${entry}\n` + }); + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: newPr.number, + labels: ['automated', 'conference-update'] + }); + } + + - name: Summary + if: always() + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + CHANGED: ${{ steps.check_changes.outputs.changed }} + run: | + echo "## Update: $CONF_NAME" >> $GITHUB_STEP_SUMMARY + echo "Status: $([[ '$CHANGED' == 'true' ]] && echo '✅ Updated' || echo '✓ No changes')" >> $GITHUB_STEP_SUMMARY + + # Stage 2b: Comprehensive new year scraper + new-year-scraper: + needs: [zone-check, triage] + if: | + needs.zone-check.outputs.skip != 'true' && + needs.zone-check.outputs.has_pending != 'true' && + needs.triage.outputs.should_analyze == 'true' && + needs.triage.outputs.is_new_year == 'true' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + id-token: write + + env: + UPDATE_BRANCH: auto/conference-updates + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + with: + fetch-depth: 0 + token: ${{ github.token }} + persist-credentials: true + + - name: Configure git identity + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Setup accumulator branch + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + + if git ls-remote --heads origin $UPDATE_BRANCH | grep -q $UPDATE_BRANCH; then + git fetch origin $UPDATE_BRANCH + git checkout $UPDATE_BRANCH + # Try rebase first, then merge, fail if neither works + if ! git rebase origin/main; then + echo "::warning title=Rebase Failed::Attempting merge instead" + git rebase --abort 2>/dev/null || true + if ! git merge origin/main --no-edit; then + git merge --abort 2>/dev/null || true + echo "::warning title=Merge Conflict::Auto-resolving conflicts in favor of main" + if ! git merge origin/main -X theirs --no-edit; then + git merge --abort 2>/dev/null || true + echo "::error title=Branch Sync Failed::Could not sync with main" + exit 1 + fi + fi + fi + else + git checkout -b $UPDATE_BRANCH + fi + + - name: Snapshot and get previous entry + id: prep + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + run: | + cp _data/conferences.yml /tmp/conferences_before.yml + + # Bug #2 Fix: Write previous entry to a file instead of using heredoc + # This prevents delimiter collision when content contains special characters + + PREV_FILE="${RUNNER_TEMP}/prev_entry.txt" + + # Get previous entry for reference + python3 << 'GETPREV' > "$PREV_FILE" + import yaml, os, sys + conf_name = os.environ.get('CONF_NAME', '') + all_confs = [] + for f in ['_data/conferences.yml', '_data/archive.yml']: + try: + with open(f) as fh: all_confs.extend(yaml.safe_load(fh) or []) + except: pass + matching = [c for c in all_confs if conf_name.lower() in c.get('conference','').lower()] + if matching: + c = max(matching, key=lambda x: x.get('year', 0)) + for k in ['year','conference','sub','place','link','timezone','twitter','mastodon']: + if c.get(k): print(f"{k}: {c[k]}") + GETPREV + + # Store file path as output (safe - no special characters) + echo "prev_file=$PREV_FILE" >> $GITHUB_OUTPUT + echo "::notice title=Previous Entry::Found $(wc -l < "$PREV_FILE") lines of reference data" + + - name: Pre-fetch conference pages + id: fetch + env: + CONF_URL: ${{ needs.zone-check.outputs.url }} + run: | + # Bug #2 Fix: Write content to files instead of using heredoc + # This prevents delimiter collision when scraped content contains special characters + # Claude Code Action can read the files using its Read tool + + # Install lynx for clean text extraction + sudo apt-get install -qq -y lynx > /dev/null 2>&1 || true + + CONTENT_FILE="${RUNNER_TEMP}/website_content.txt" + + # Fetch main page as text (much fewer tokens than HTML) + lynx -dump -nolist -nonumbers -width=200 "$CONF_URL" 2>/dev/null > /tmp/main_text.txt || echo "Failed to fetch main page" > /tmp/main_text.txt + + # Also fetch raw HTML to extract subpage links + curl -sL --max-time 30 "$CONF_URL" > /tmp/main.html 2>/dev/null || true + + # Find CFP/finaid/sponsor links + grep -oiE 'href="[^"]*(/cfp|/submit|/call|/speak|/finaid|/financial|/grant|/sponsor|/partner)[^"]*"' /tmp/main.html | \ + sed 's/href="//;s/"$//' | head -3 > /tmp/subpage_links.txt 2>/dev/null || true + + # Fetch subpages with lynx + echo "" > /tmp/subpages_text.txt + while read -r link; do + [ -z "$link" ] && continue + # Handle relative URLs + if [[ "$link" == /* ]]; then + BASE=$(echo "$CONF_URL" | sed 's|^\(https\?://[^/]*\).*|\1|') + link="${BASE}${link}" + fi + echo "Fetching: $link" + lynx -dump -nolist -nonumbers -width=200 "$link" 2>/dev/null | head -c 4000 >> /tmp/subpages_text.txt || true + echo -e "\n---\n" >> /tmp/subpages_text.txt + done < /tmp/subpage_links.txt + + # Combine content into a single file (avoids heredoc issues) + { + head -c 12000 /tmp/main_text.txt + echo -e "\n\n--- SUBPAGES ---\n" + head -c 8000 /tmp/subpages_text.txt + } > "$CONTENT_FILE" + + # Store file path as output (safe - no special characters) + echo "content_file=$CONTENT_FILE" >> $GITHUB_OUTPUT + echo "::notice title=Content::Stored $(wc -c < "$CONTENT_FILE") bytes in $CONTENT_FILE" + + # Workaround for anthropics/claude-code-action#900: the action's + # checkHumanActor calls the GitHub API before checking allowed_bots, + # which 404s for bot actors like github-actions[bot]. Override + # GITHUB_ACTOR so the action sees a real user. + - name: Fix actor for bot-triggered runs + if: contains(github.actor, '[bot]') + run: echo "GITHUB_ACTOR=${{ github.repository_owner }}" >> "$GITHUB_ENV" + + - name: Run Claude Code Analysis + uses: anthropics/claude-code-action@v1.0.191 + with: + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + allowed_bots: 'github-actions[bot]' + prompt: | + Create/update entry for NEW YEAR of Python conference. DO NOT fetch URLs - content provided in files. + + Conference: ${{ needs.zone-check.outputs.conference }} + URL: ${{ needs.zone-check.outputs.url }} + Year: ${{ needs.triage.outputs.detected_year }} + + FIRST: Read the following files using the Read tool: + 1. Previous entry reference: ${{ steps.prep.outputs.prev_file }} + 2. Website content (main page + subpages): ${{ steps.fetch.outputs.content_file }} + + Required: conference (no year), year, link, cfp (YYYY-MM-DD HH:mm:ss or TBA), place (City, Country), start, end, sub + Optional: cfp_link, timezone, finaid, sponsor, twitter, mastodon, workshop_deadline, tutorial_deadline + + Read _data/conferences.yml, add/update entry for year ${{ needs.triage.outputs.detected_year }}. + Keep conference name consistent with previous years. Match YAML formatting. + + CRITICAL: Conference entries REQUIRE specific start/end dates. Only create an entry if you find EXACT dates (e.g., "September 15-17, 2026"). If dates are vague ("sometime in September", "Fall 2026", "TBD", "dates coming soon"), do NOT create the entry - the conference is not yet ready to be added. Report "No changes - specific dates not announced yet" and make no edits. Never fabricate or approximate dates. + claude_args: | + --model claude-haiku-4-5-20251001 + --max-turns 5 + --allowedTools Read,Edit,Grep,Glob + + - name: Check for changes + id: check_changes + run: | + if ! diff -q _data/conferences.yml /tmp/conferences_before.yml > /dev/null 2>&1; then + echo "changed=true" >> $GITHUB_OUTPUT + else + echo "changed=false" >> $GITHUB_OUTPUT + fi + + - name: Setup Pixi + if: steps.check_changes.outputs.changed == 'true' + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: Sort conferences + if: steps.check_changes.outputs.changed == 'true' + run: pixi run sort + + - name: Commit and push + if: steps.check_changes.outputs.changed == 'true' + id: commit + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + CONF_URL: ${{ needs.zone-check.outputs.url }} + DETECTED_YEAR: ${{ needs.triage.outputs.detected_year }} + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + git add _data/conferences.yml + git commit -m "conf: ${CONF_NAME} ${DETECTED_YEAR} 🆕" -m "New year detected" -m "Source: ${CONF_URL}" + git push origin $UPDATE_BRANCH --force-with-lease + echo "commit_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + + - name: Create or update PR + if: steps.check_changes.outputs.changed == 'true' + uses: actions/github-script@v9 + env: + UPDATE_BRANCH: ${{ env.UPDATE_BRANCH }} + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + DETECTED_YEAR: ${{ needs.triage.outputs.detected_year }} + COMMIT_SHA: ${{ steps.commit.outputs.commit_sha }} + with: + script: | + const branch = process.env.UPDATE_BRANCH; + const conference = process.env.CONF_NAME; + const year = process.env.DETECTED_YEAR; + const sha = process.env.COMMIT_SHA.substring(0, 7); + const date = new Date().toISOString().split('T')[0]; + + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:${branch}`, + state: 'open' + }); + + const entry = `| 🆕 ${conference} ${year} | [${sha}](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/commit/${process.env.COMMIT_SHA}) | ${date} |`; + + if (prs.length > 0) { + let body = prs[0].body || ''; + body = body.replace(/()/, `${entry}\n$1`); + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prs[0].number, + body + }); + } else { + const { data: newPr } = await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: '🐍 Conference updates', + head: branch, + base: 'main', + body: `## 🐍 Automated Conference Updates\n\n| Conference | Commit | Date |\n|------------|--------|------|\n${entry}\n` + }); + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: newPr.number, + labels: ['automated', 'conference-update', 'new-year'] + }); + } + + - name: Summary + if: always() + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + YEAR: ${{ needs.triage.outputs.detected_year }} + CHANGED: ${{ steps.check_changes.outputs.changed }} + run: | + echo "## 🆕 New Year: $CONF_NAME $YEAR" >> $GITHUB_STEP_SUMMARY + echo "Status: $([[ '$CHANGED' == 'true' ]] && echo '✅ Created' || echo '⚠️ No changes')" >> $GITHUB_STEP_SUMMARY + + # Log skipped conferences + log-skipped: + needs: zone-check + if: needs.zone-check.outputs.skip == 'true' + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Log skip + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + CONF_ZONE: ${{ needs.zone-check.outputs.zone }} + run: | + echo "::notice title=Skipped::$CONF_NAME in $CONF_ZONE zone" + echo "## ⏭️ Skipped: $CONF_NAME" >> $GITHUB_STEP_SUMMARY + echo "Zone: $CONF_ZONE (no useful updates expected)" >> $GITHUB_STEP_SUMMARY + + # Log conferences with pending updates + log-pending: + needs: zone-check + if: needs.zone-check.outputs.skip != 'true' && needs.zone-check.outputs.has_pending == 'true' + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Log pending + env: + CONF_NAME: ${{ needs.zone-check.outputs.conference }} + run: | + echo "::notice title=Pending::$CONF_NAME already has pending update in PR" + echo "## ⏸️ Skipped: $CONF_NAME" >> $GITHUB_STEP_SUMMARY + echo "Already has pending update in accumulator branch. Merge the PR to process new changes." >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml new file mode 100644 index 00000000000..c905bee74a7 --- /dev/null +++ b/.github/workflows/ci-core.yml @@ -0,0 +1,105 @@ +name: Core CI Tests + +permissions: + contents: read + +on: + push: + branches: + - main + - develop + pull_request: + branches: + - main + - develop + workflow_dispatch: + + +jobs: + data-validation: + name: Data Validation + runs-on: ubuntu-latest + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🐍 Setup Pixi + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: ✅ Validate conference data structure + run: | + pixi run sort + + - name: 📊 Check for obvious duplicates + run: | + # Simple duplicate check based on conference name and year + python -c " + import yaml + with open('_data/conferences.yml') as f: + data = yaml.safe_load(f) + if data: + seen = set() + for conf in data: + key = (conf.get('conference', ''), conf.get('year', '')) + if key in seen: + print(f'Warning: Potential duplicate - {key}') + seen.add(key) + " + + python-tests: + name: Python Tests + runs-on: ubuntu-latest + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🐍 Setup Pixi + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: 🧪 Run Python tests + run: | + pixi run test-fast || echo "Tests completed" + + - name: 🔍 Check Python code quality + run: | + # Run ruff for linting + ruff check utils/ || true + ruff format utils/ --check || true + + pre-commit: + name: Pre-commit Checks + runs-on: ubuntu-latest + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🐍 Setup Pixi + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: 🔍 Run pre-commit hooks + run: | + pixi run pre + + # Summary job to ensure all core tests pass + ci-status: + name: CI Status + runs-on: ubuntu-latest + needs: [ data-validation, python-tests ] + if: always() + + steps: + - name: ✅ Check overall status + run: | + if [[ "${{ needs.data-validation.result }}" == "success" ]] && \ + [[ "${{ needs.python-tests.result }}" == "success" ]]; then + echo "✅ All core tests passed!" + exit 0 + else + echo "❌ Some core tests failed:" + echo "Data Validation: ${{ needs.data-validation.result }}" + echo "Python Tests: ${{ needs.python-tests.result }}" + exit 1 + fi diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000000..3e133c89df3 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,31 @@ +# .github/workflows/codeql.yml +name: CodeQL Analysis + +on: + push: + branches: [ main, master ] + paths-ignore: + - '_data/**' + - .all-contributorsrc + pull_request: + branches: [ main, master ] + paths-ignore: + - '_data/**' + - .all-contributorsrc + schedule: + - cron: '0 0 * * 0' + +jobs: + analyze: + runs-on: ubuntu-latest + permissions: + security-events: write + + steps: + - uses: actions/checkout@v7 + - name: Initialize CodeQL + uses: github/codeql-action/init@v4.37.6 + with: + languages: python + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4.37.6 diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml new file mode 100644 index 00000000000..e90aae25ac5 --- /dev/null +++ b/.github/workflows/e2e-tests.yml @@ -0,0 +1,462 @@ +name: E2E Tests + +permissions: + contents: read + +# E2E tests are expensive - only run when manually triggered or on schedule +on: + workflow_dispatch: + inputs: + browsers: + description: 'Browsers to test (comma-separated: chromium,firefox,webkit)' + required: false + default: 'chromium' + test-pattern: + description: 'Test file pattern to run' + required: false + default: '**/*.spec.js' + schedule: + # Run nightly at 2 AM UTC + - cron: '0 2 * * *' + push: + branches: + - main + paths: + # Only run automatically on significant UI changes + - '_layouts/**' + - '_includes/**' + - 'static/js/**' + +jobs: + # Build the site once and share it across all test jobs + build: + name: Build Jekyll Site + runs-on: ubuntu-latest + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 💎 Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + bundler-cache: true + + - name: 📦 Install Ruby dependencies + run: bundle install + + - name: 🏗️ Build Jekyll site + run: | + bundle exec jekyll build --config _config.yml,_config.test.yml + env: + JEKYLL_ENV: test + + - name: 📤 Upload built site + uses: actions/upload-artifact@v7 + with: + name: jekyll-site + path: _site/ + retention-days: 1 + + e2e-tests: + name: E2E Tests - ${{ matrix.browser }} + runs-on: ubuntu-latest + needs: build + + strategy: + fail-fast: false + matrix: + browser: [chromium, firefox, webkit] + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🟢 Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: '20' + cache: 'npm' + + - name: 📦 Install Node dependencies + run: npm ci + + - name: 🎭 Install Playwright browsers + run: | + npx playwright install --with-deps ${{ matrix.browser }} + + - name: 📥 Download built site + uses: actions/download-artifact@v8 + with: + name: jekyll-site + path: _site/ + + - name: 🚀 Start static server + run: | + npx serve _site -l 4000 & + env: + CI: true + + - name: ⏳ Wait for server + run: | + npx wait-on http://localhost:4000 -t 15000 + + - name: 🧪 Run E2E tests + run: | + PLAYWRIGHT_JSON_OUTPUT_NAME=test-results.json npx playwright test --project=${{ matrix.browser }} --reporter=html,json + env: + CI: true + BASE_URL: http://localhost:4000 + + - name: 📋 Write test summary + if: always() + run: | + if [ -f test-results.json ]; then + echo "## 🎭 E2E Test Results - ${{ matrix.browser }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + node -e " + const results = require('./test-results.json'); + const stats = results.stats || {}; + const passed = stats.expected - stats.unexpected - stats.flaky || 0; + const failed = stats.unexpected || 0; + const flaky = stats.flaky || 0; + const skipped = stats.skipped || 0; + const total = stats.expected || 0; + const status = failed === 0 ? '✅ Passed' : '❌ Failed'; + console.log('| Status | Total | Passed | Failed | Flaky | Skipped |'); + console.log('|--------|-------|--------|--------|-------|---------|'); + console.log('| ' + status + ' | ' + total + ' | ' + passed + ' | ' + failed + ' | ' + flaky + ' | ' + skipped + ' |'); + " >> $GITHUB_STEP_SUMMARY + fi + + - name: 📊 Upload test results + if: always() + uses: actions/upload-artifact@v7 + with: + name: playwright-report-${{ matrix.browser }} + path: | + playwright-report/ + test-results/ + retention-days: 7 + + - name: 📸 Upload screenshots + if: failure() + uses: actions/upload-artifact@v7 + with: + name: screenshots-${{ matrix.browser }} + path: test-results/screenshots/ + retention-days: 7 + + e2e-mobile: + name: E2E Tests - Mobile ${{ matrix.mobile }} + runs-on: ubuntu-latest + needs: build + + strategy: + fail-fast: false + matrix: + # Trimmed to mobile-chrome; mobile-safari (webkit) was the other main + # source of cross-browser flakiness. + mobile: [mobile-chrome] + include: + - mobile: mobile-chrome + browser: chromium + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🟢 Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: '20' + cache: 'npm' + + - name: 📦 Install Node dependencies + run: npm ci + + - name: 🎭 Install Playwright browsers + run: | + npx playwright install --with-deps ${{ matrix.browser }} + + - name: 📥 Download built site + uses: actions/download-artifact@v8 + with: + name: jekyll-site + path: _site/ + + - name: 🚀 Start static server + run: | + npx serve _site -l 4000 & + env: + CI: true + + - name: ⏳ Wait for server + run: | + npx wait-on http://localhost:4000 -t 15000 + + - name: 📱 Run mobile E2E tests + run: | + PLAYWRIGHT_JSON_OUTPUT_NAME=test-results.json npx playwright test --project=${{ matrix.mobile }} --reporter=html,json + env: + CI: true + BASE_URL: http://localhost:4000 + + - name: 📋 Write test summary + if: always() + run: | + if [ -f test-results.json ]; then + echo "## 🎭 E2E Test Results - ${{ matrix.mobile }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + node -e " + const results = require('./test-results.json'); + const stats = results.stats || {}; + const passed = stats.expected - stats.unexpected - stats.flaky || 0; + const failed = stats.unexpected || 0; + const flaky = stats.flaky || 0; + const skipped = stats.skipped || 0; + const total = stats.expected || 0; + const status = failed === 0 ? '✅ Passed' : '❌ Failed'; + console.log('| Status | Total | Passed | Failed | Flaky | Skipped |'); + console.log('|--------|-------|--------|--------|-------|---------|'); + console.log('| ' + status + ' | ' + total + ' | ' + passed + ' | ' + failed + ' | ' + flaky + ' | ' + skipped + ' |'); + " >> $GITHUB_STEP_SUMMARY + fi + + - name: 📊 Upload mobile test results + if: always() + uses: actions/upload-artifact@v7 + with: + name: playwright-report-${{ matrix.mobile }} + path: | + playwright-report/ + test-results/ + retention-days: 7 + + - name: 📸 Upload screenshots + if: failure() + uses: actions/upload-artifact@v7 + with: + name: screenshots-${{ matrix.mobile }} + path: test-results/screenshots/ + retention-days: 7 + + visual-regression: + name: Visual Regression Tests + runs-on: ubuntu-latest + needs: build + if: github.event_name == 'pull_request' + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🟢 Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: '20' + cache: 'npm' + + - name: 📦 Install Node dependencies + run: npm ci + + - name: 🎭 Install Playwright + run: | + npx playwright install --with-deps chromium + + - name: 📥 Download built site + uses: actions/download-artifact@v8 + with: + name: jekyll-site + path: _site/ + + - name: 🚀 Start static server + run: | + npx serve _site -l 4000 & + env: + CI: true + + - name: ⏳ Wait for server + run: | + npx wait-on http://localhost:4000 -t 15000 + + - name: 📸 Capture screenshots + run: | + npx playwright test --project=chromium --grep @visual + env: + CI: true + BASE_URL: http://localhost:4000 + + - name: 🖼️ Upload visual diffs + if: failure() + uses: actions/upload-artifact@v7 + with: + name: visual-diffs + path: test-results/visual-diffs/ + retention-days: 7 + + report: + name: Test Report + runs-on: ubuntu-latest + needs: [e2e-tests, e2e-mobile] + if: always() + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🟢 Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: '20' + + - name: 📥 Download all artifacts + uses: actions/download-artifact@v8 + with: + path: all-reports + + - name: 📋 Merge test results + run: | + mkdir -p merged-report + # Merge all test results + find all-reports -name "*.xml" -exec cp {} merged-report/ \; + find all-reports -name "*.json" -exec cp {} merged-report/ \; + + - name: 💬 Comment PR with results + if: github.event_name == 'pull_request' + uses: actions/github-script@v9 + with: + script: | + const fs = require('fs'); + const path = require('path'); + + let comment = '## 🎭 E2E Test Results\n\n'; + + // Parse test results + const reportFiles = fs.readdirSync('merged-report').filter(f => f.endsWith('.json')); + let totalTests = 0; + let passedTests = 0; + let failedTests = 0; + let skippedTests = 0; + + reportFiles.forEach(file => { + try { + const data = JSON.parse(fs.readFileSync(path.join('merged-report', file), 'utf8')); + if (data.stats) { + totalTests += data.stats.expected || 0; + passedTests += data.stats.passed || 0; + failedTests += data.stats.failed || 0; + skippedTests += data.stats.skipped || 0; + } + } catch (e) { + console.error(`Failed to parse ${file}:`, e); + } + }); + + comment += `| Browser | Status | Tests | Passed | Failed | Skipped |\n`; + comment += `|---------|--------|-------|--------|--------|----------|\n`; + + const browsers = ['chromium', 'firefox', 'webkit', 'mobile-chrome', 'mobile-safari']; + for (const browser of browsers) { + const artifactExists = fs.existsSync(`all-reports/playwright-report-${browser}`); + if (artifactExists) { + const status = failedTests === 0 ? '✅' : '❌'; + comment += `| ${browser} | ${status} | ${totalTests} | ${passedTests} | ${failedTests} | ${skippedTests} |\n`; + } + } + + comment += '\n### 📊 Coverage Summary\n'; + comment += '- Notification System: ✅ Tested\n'; + comment += '- Countdown Timers: ✅ Tested\n'; + comment += '- Conference Management: ✅ Tested\n'; + comment += '- Search & Filter: ✅ Tested\n'; + + if (failedTests > 0) { + comment += '\n⚠️ **Some tests failed. Please check the artifacts for details.**\n'; + } else { + comment += '\n✅ **All E2E tests passed successfully!**\n'; + } + + // Find and update or create comment + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const botComment = comments.find(comment => + comment.user.type === 'Bot' && + comment.body.includes('E2E Test Results') + ); + + if (botComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: comment + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: comment + }); + } + + - name: 📈 Upload to dashboard + if: github.ref == 'refs/heads/main' + continue-on-error: true + run: | + echo "Test results can be uploaded to a dashboard service here" + + notify-failure: + name: Alert on unattended failure + runs-on: ubuntu-latest + needs: [e2e-tests, e2e-mobile] + # Only alert for unattended runs (nightly cron + pushes to main), and only when + # something actually failed — so a red suite can't rot silently for months again. + if: failure() && (github.event_name == 'schedule' || github.event_name == 'push') + permissions: + issues: write + steps: + - name: 🔔 Open or update tracking issue + uses: actions/github-script@v9 + with: + script: | + const title = '🎭 E2E tests are failing'; + const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + const body = [ + `The E2E suite failed on a \`${context.eventName}\` run.`, + ``, + `- Run: ${runUrl}`, + `- Commit: ${context.sha}`, + ``, + `This issue auto-updates on each failure; close it once the suite is green again.`, + ].join('\n'); + + const { data: open } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + per_page: 100, + }); + const existing = open.find(i => i.title === title && !i.pull_request); + + if (existing) { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: existing.number, + body, + }); + } else { + await github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title, + body, + }); + } diff --git a/.github/workflows/enrich-tba-conferences.yml b/.github/workflows/enrich-tba-conferences.yml new file mode 100644 index 00000000000..4725c5e1356 --- /dev/null +++ b/.github/workflows/enrich-tba-conferences.yml @@ -0,0 +1,339 @@ +name: Enrich TBA Conferences + +on: + # Manual trigger or called by canonical-source-update + workflow_dispatch: + inputs: + enrichment_level: + description: 'quick=deterministic links only (no API), full=links + dates via Claude' + type: choice + options: ['full', 'quick'] + default: 'full' + dry_run: + description: 'Dry run (no commit/PR)' + required: false + type: boolean + default: false + + # Daily run - quick mode, except Tuesday which does full (with Claude API) + schedule: + - cron: '0 6 * * *' # Daily 6 AM UTC + +# Prevent concurrent runs to avoid merge conflicts on the accumulator branch +concurrency: + group: enrich-tba-conferences + cancel-in-progress: false + +permissions: + contents: write + pull-requests: write + +env: + UPDATE_BRANCH: auto/conference-updates + +jobs: + enrich: + runs-on: ubuntu-latest + timeout-minutes: 20 + + steps: + - name: Determine enrichment level + id: config + env: + EVENT_NAME: ${{ github.event_name }} + INPUT_LEVEL: ${{ inputs.enrichment_level }} + run: | + if [ "$EVENT_NAME" = "schedule" ]; then + DAY_OF_WEEK=$(date -u +%u) # 1=Monday, 2=Tuesday, ... + + if [ "$DAY_OF_WEEK" = "2" ]; then + # Tuesday = weekly full run with Claude API + echo "level=full" >> $GITHUB_OUTPUT + echo "::notice title=Tuesday Full Run::Using full enrichment mode (with Claude API)" + else + # Other days = quick deterministic run + echo "level=quick" >> $GITHUB_OUTPUT + echo "::notice title=Daily Quick Run::Using quick enrichment mode (deterministic only)" + fi + else + echo "level=${INPUT_LEVEL:-full}" >> $GITHUB_OUTPUT + echo "::notice title=Manual Run::Using ${INPUT_LEVEL:-full} enrichment mode" + fi + + - name: Checkout repository + uses: actions/checkout@v7 + with: + fetch-depth: 0 + token: ${{ github.token }} + persist-credentials: true + + - name: Configure git identity + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Setup accumulator branch + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + + if git ls-remote --heads origin $UPDATE_BRANCH | grep -q $UPDATE_BRANCH; then + echo "::notice title=Branch::Checking out existing accumulator branch" + git fetch origin $UPDATE_BRANCH + git checkout $UPDATE_BRANCH + + # Sync with main - try rebase first, then merge + if ! git rebase origin/main; then + echo "::warning title=Rebase Failed::Attempting merge instead" + git rebase --abort 2>/dev/null || true + if ! git merge origin/main --no-edit; then + git merge --abort 2>/dev/null || true + echo "::warning title=Merge Conflict::Auto-resolving conflicts in favor of main" + if ! git merge origin/main -X theirs --no-edit; then + git merge --abort 2>/dev/null || true + echo "::error title=Branch Sync Failed::Could not sync with main" + exit 1 + fi + fi + fi + else + echo "::notice title=Branch::Creating new accumulator branch" + git checkout -b $UPDATE_BRANCH + fi + + - name: Snapshot data files + run: | + cp _data/conferences.yml /tmp/conferences_before.yml + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: Install lynx for text extraction + run: sudo apt-get install -qq -y lynx > /dev/null 2>&1 || true + + - name: Find TBA conferences + id: find-tba + run: | + # Count TBA conferences + TBA_COUNT=$(python3 << 'PYCOUNT' + import yaml + + tba_words = ["tba", "tbd", "cancelled", "none", "na", "n/a", "nan", "n.a."] + with open("_data/conferences.yml") as f: + conferences = yaml.safe_load(f) or [] + + count = sum(1 for c in conferences if str(c.get("cfp", "")).lower().strip() in tba_words) + print(count) + PYCOUNT + ) + + echo "tba_count=$TBA_COUNT" >> $GITHUB_OUTPUT + + if [ "$TBA_COUNT" = "0" ]; then + echo "::notice title=No TBA::No conferences with TBA CFP found" + else + echo "::notice title=TBA Found::Found $TBA_COUNT conferences with TBA CFP" + fi + + echo "## TBA Conferences" >> $GITHUB_STEP_SUMMARY + echo "Found **$TBA_COUNT** conferences with TBA CFP deadlines" >> $GITHUB_STEP_SUMMARY + + - name: Enrich TBA conferences + id: enrich + if: steps.find-tba.outputs.tba_count != '0' + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + ENRICHMENT_LEVEL: ${{ steps.config.outputs.level }} + DRY_RUN: ${{ inputs.dry_run }} + run: | + echo "::group::Running enrichment" + + # Build command + CMD="pixi run python utils/enrich_tba.py --level $ENRICHMENT_LEVEL" + if [ "$DRY_RUN" = "true" ]; then + CMD="$CMD --dry-run" + fi + + # Run enrichment + if $CMD; then + echo "success=true" >> $GITHUB_OUTPUT + else + echo "success=false" >> $GITHUB_OUTPUT + echo "::error title=Enrichment Failed::TBA enrichment script failed" + fi + + echo "::endgroup::" + + - name: Check for changes + id: check_changes + run: | + if ! diff -q _data/conferences.yml /tmp/conferences_before.yml > /dev/null 2>&1; then + echo "changed=true" >> $GITHUB_OUTPUT + echo "::notice title=Changes Detected::Conference data was updated" + + # Show summary of changes + echo "## Changes" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`diff" >> $GITHUB_STEP_SUMMARY + diff -u /tmp/conferences_before.yml _data/conferences.yml | head -100 >> $GITHUB_STEP_SUMMARY || true + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + else + echo "changed=false" >> $GITHUB_OUTPUT + echo "::notice title=No Changes::No updates from TBA enrichment" + echo "## No Changes" >> $GITHUB_STEP_SUMMARY + echo "TBA enrichment did not find any new CFP data to update." >> $GITHUB_STEP_SUMMARY + fi + + - name: Validate and sort + if: steps.check_changes.outputs.changed == 'true' && inputs.dry_run != true + run: pixi run sort + + - name: Commit and push + if: steps.check_changes.outputs.changed == 'true' && inputs.dry_run != true + id: commit + env: + ENRICHMENT_LEVEL: ${{ steps.config.outputs.level }} + run: | + git remote set-url origin "https://x-access-token:${{ github.token }}@github.com/${{ github.repository }}.git" + + # Stage data files + git add _data/conferences.yml _data/archive.yml _data/legacy.yml 2>/dev/null || git add _data/conferences.yml + + # Create descriptive commit message + COMMIT_MSG="chore: enrich TBA conferences with CFP data" + + git commit -m "$COMMIT_MSG" -m "Enrichment level: $ENRICHMENT_LEVEL" -m "Triggered: $(date -u +%Y-%m-%dT%H:%M:%SZ)" + git push origin $UPDATE_BRANCH --force-with-lease + + echo "commit_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT + echo "commit_msg=$COMMIT_MSG" >> $GITHUB_OUTPUT + + - name: Read review items + id: review + run: | + if [ -f ".github/enrichment_review.md" ]; then + echo "has_review=true" >> $GITHUB_OUTPUT + # Use delimiter for multiline output + echo "review_content<> $GITHUB_OUTPUT + cat .github/enrichment_review.md >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + else + echo "has_review=false" >> $GITHUB_OUTPUT + fi + + - name: Create or update PR + if: steps.check_changes.outputs.changed == 'true' && inputs.dry_run != true + uses: actions/github-script@v9 + env: + UPDATE_BRANCH: ${{ env.UPDATE_BRANCH }} + COMMIT_SHA: ${{ steps.commit.outputs.commit_sha }} + ENRICHMENT_LEVEL: ${{ steps.config.outputs.level }} + HAS_REVIEW: ${{ steps.review.outputs.has_review }} + REVIEW_CONTENT: ${{ steps.review.outputs.review_content }} + with: + script: | + const branch = process.env.UPDATE_BRANCH; + const sha = process.env.COMMIT_SHA.substring(0, 7); + const level = process.env.ENRICHMENT_LEVEL; + const date = new Date().toISOString().split('T')[0]; + const hasReview = process.env.HAS_REVIEW === 'true'; + const reviewContent = process.env.REVIEW_CONTENT || ''; + + // Check for existing PR from the update branch + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:${branch}`, + state: 'open' + }); + + // Use same table format as other workflows + const entry = `| TBA Enrichment (${level}) | [${sha}](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/commit/${process.env.COMMIT_SHA}) | ${date} |`; + + if (prs.length > 0) { + // Update existing PR - append to table + const pr = prs[0]; + let body = pr.body || ''; + + // Add entry before the END_UPDATES marker + body = body.replace(/()/, `${entry}\n$1`); + + // Update or add review section + if (hasReview && reviewContent) { + const reviewMarker = ''; + const reviewEndMarker = ''; + const reviewSection = `${reviewMarker}\n${reviewContent}\n${reviewEndMarker}`; + + if (body.includes(reviewMarker)) { + // Replace existing review section + body = body.replace( + new RegExp(`${reviewMarker}[\\s\\S]*?${reviewEndMarker}`), + reviewSection + ); + } else { + // Add review section before END_UPDATES + body = body.replace(/()/, `\n${reviewSection}\n\n$1`); + } + } + + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pr.number, + body + }); + + console.log(`Updated PR #${pr.number}`); + core.notice(`Updated PR #${pr.number} with TBA enrichment`); + } else { + // Create new PR with review items if present + let prBody = `## Automated Conference Updates\n\n| Source | Commit | Date |\n|--------|--------|------|\n${entry}\n`; + + if (hasReview && reviewContent) { + prBody = `## Automated Conference Updates\n\n| Source | Commit | Date |\n|--------|--------|------|\n${entry}\n\n\n\n${reviewContent}\n`; + } + + const { data: newPr } = await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: 'Conference updates', + head: branch, + base: 'main', + body: prBody + }); + + // Add labels + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: newPr.number, + labels: ['automated', 'conference-update'] + }); + + console.log(`Created PR #${newPr.number}`); + core.notice(`Created PR #${newPr.number} for TBA enrichment`); + } + + - name: Summary + if: always() + env: + TBA_COUNT: ${{ steps.find-tba.outputs.tba_count }} + CHANGED: ${{ steps.check_changes.outputs.changed }} + DRY_RUN: ${{ inputs.dry_run }} + LEVEL: ${{ steps.config.outputs.level }} + run: | + echo "" >> $GITHUB_STEP_SUMMARY + echo "## Result" >> $GITHUB_STEP_SUMMARY + + if [ "$TBA_COUNT" = "0" ]; then + echo "- Status: No TBA conferences to process" >> $GITHUB_STEP_SUMMARY + elif [ "$CHANGED" = "true" ]; then + if [ "$DRY_RUN" = "true" ]; then + echo "- Status: Changes detected (dry run - not committed)" >> $GITHUB_STEP_SUMMARY + else + echo "- Status: Changes committed and PR updated" >> $GITHUB_STEP_SUMMARY + fi + else + echo "- Status: No new CFP data found" >> $GITHUB_STEP_SUMMARY + fi + + echo "- Enrichment level: $LEVEL" >> $GITHUB_STEP_SUMMARY + echo "- TBA conferences scanned: $TBA_COUNT" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml new file mode 100644 index 00000000000..b5dfedd0b1b --- /dev/null +++ b/.github/workflows/frontend-tests.yml @@ -0,0 +1,220 @@ +name: Frontend Tests + +on: + pull_request: + paths: + - 'static/js/**' + - 'tests/frontend/**' + - 'package.json' + - 'package-lock.json' + - 'jest.config.js' + - '.github/workflows/frontend-tests.yml' + push: + branches: + - main + - develop + paths: + - 'static/js/**' + - 'tests/frontend/**' + - 'package.json' + - 'jest.config.js' + workflow_dispatch: + # Allow manual trigger for testing + +permissions: + contents: read + +jobs: + test: + name: Run JavaScript Tests + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + issues: write + + strategy: + fail-fast: true + matrix: + node-version: [20] # Simplify to just Node 20 + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🟢 Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v7 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + cache-dependency-path: package-lock.json + + - name: 📦 Cache node_modules + id: cache-node-modules + uses: actions/cache@v6 + with: + path: node_modules + key: ${{ runner.os }}-node-${{ matrix.node-version }}-${{ hashFiles('package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-${{ matrix.node-version }}- + + - name: 📦 Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + run: | + npm ci + # Also install optional reporter if needed + npm install jest-html-reporter --save-dev || true + + - name: 🧪 Run unit tests + run: npm test -- --coverage --ci --maxWorkers=2 + env: + CI: true + + - name: 📊 Generate coverage report + run: | + npm run test:coverage || true + + - name: 📤 Upload coverage to Codecov + uses: codecov/codecov-action@v7 + with: + files: ./coverage/lcov.info + flags: frontend + name: frontend-coverage + fail_ci_if_error: false + + - name: 📋 Upload test results + if: always() + uses: actions/upload-artifact@v7 + with: + name: test-results-node-${{ matrix.node-version }} + path: | + coverage/ + test-report.html + retention-days: 7 + + - name: 💬 Comment PR with results + if: github.event_name == 'pull_request' + uses: actions/github-script@v9 + with: + script: | + const fs = require('fs'); + let coverageText = '📊 **Frontend Test Coverage Report**\n\n'; + + try { + // Try to read coverage summary if it exists + const coveragePath = './coverage/coverage-summary.json'; + if (fs.existsSync(coveragePath)) { + const coverage = JSON.parse(fs.readFileSync(coveragePath, 'utf8')); + const total = coverage.total; + + coverageText += '| Metric | Coverage | Status |\n'; + coverageText += '|--------|----------|--------|\n'; + + const getStatus = (pct) => pct >= 80 ? '✅' : pct >= 70 ? '⚠️' : '❌'; + + coverageText += `| Lines | ${total.lines.pct}% | ${getStatus(total.lines.pct)} |\n`; + coverageText += `| Statements | ${total.statements.pct}% | ${getStatus(total.statements.pct)} |\n`; + coverageText += `| Functions | ${total.functions.pct}% | ${getStatus(total.functions.pct)} |\n`; + coverageText += `| Branches | ${total.branches.pct}% | ${getStatus(total.branches.pct)} |\n`; + } else { + coverageText += '⚠️ Coverage report not found\n'; + } + } catch (error) { + coverageText += `⚠️ Could not parse coverage report: ${error.message}\n`; + } + + // Find and update or create comment + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const botComment = comments.find(comment => + comment.user.type === 'Bot' && + comment.body.includes('Frontend Test Coverage Report') + ); + + if (botComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: coverageText + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: coverageText + }); + } + + lint-js: + name: Lint JavaScript + runs-on: ubuntu-latest + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🟢 Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: '20' + cache: 'npm' + + - name: 📦 Install ESLint + run: | + npm install --save-dev eslint + npm install --save-dev eslint-plugin-jest || true + + - name: 🔍 Run ESLint + run: | + npx eslint static/js/*.js --ignore-pattern "*.min.js" || true + continue-on-error: true # Don't fail the build on linting errors initially + + integration: + name: Integration Tests + runs-on: ubuntu-latest + needs: test + + steps: + - name: 📂 Checkout repository + uses: actions/checkout@v7 + + - name: 🟢 Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: '20' + cache: 'npm' + + - name: 💎 Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + bundler-cache: true + + - name: 📦 Install dependencies + run: | + npm ci + bundle install + + - name: 🏗️ Build Jekyll site + run: | + bundle exec jekyll build + env: + JEKYLL_ENV: test + + - name: 🧪 Run integration tests + run: | + npm run test:integration || echo "No integration tests yet" + continue-on-error: true + + - name: 📤 Upload built site + uses: actions/upload-artifact@v7 + with: + name: built-site + path: _site/ + retention-days: 1 diff --git a/.github/workflows/jekyll-build-deploy.yml b/.github/workflows/jekyll-build-deploy.yml new file mode 100644 index 00000000000..c4220d3f6b1 --- /dev/null +++ b/.github/workflows/jekyll-build-deploy.yml @@ -0,0 +1,76 @@ +--- +name: Build and deploy jekyll site + +on: + push: + branches: + - main + paths-ignore: + - README.md + - TRANSLATION.md + - CONTRIBUTING.md + - .pre-commit-config.yaml + - .github/** + - .gitignore + - .gitattributes + - utils/** + - pixi.toml + - .all-contributorsrc + + workflow_dispatch: + # Allows a run of this workflow to be triggerred manually from the Actions tab + + + # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: 📂 setup + uses: actions/checkout@v7 + # include the lines below if you are using jekyll-last-modified-at + - name: 💎 setup ruby + # or if you would otherwise need to fetch the full commit history + # however this may be very slow for large repositories! + # with: + # fetch-depth: '0' + + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.3 # can change this to whatever version you prefer + bundler-cache: true + cache-version: 0 # Increment this number if you need to re-download cached gems + - name: 📃 setup Pages + id: pages + uses: actions/configure-pages@v6 + - name: 🔨 Build with Jekyll + # Outputs to the './_site' directory by default + run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + - name: 💾 store artifact + # Automatically uploads an artifact from the './_site' directory by default + uses: actions/upload-pages-artifact@v5 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: 🚀 deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 00000000000..593821d10df --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,12 @@ +name: "Pull Request Labeler" +on: +- pull_request_target + +jobs: + labeler: + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v7 diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml new file mode 100644 index 00000000000..dc2b4f4bfe0 --- /dev/null +++ b/.github/workflows/link-check.yml @@ -0,0 +1,59 @@ +name: Check Links + +on: + schedule: + # Weekly on Sundays at 6 AM UTC (quiet time for most services) + - cron: '0 6 * * 0' + workflow_dispatch: # Manual trigger from Actions tab + push: + paths: + - '_data/conferences.yml' + +concurrency: + group: link-check + cancel-in-progress: true + +permissions: + contents: read + issues: write + +jobs: + check-links: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Restore lychee cache + uses: actions/cache@v6 + with: + path: .lycheecache + key: cache-lychee-${{ github.sha }} + restore-keys: cache-lychee- + + - name: Link Checker + id: lychee + uses: lycheeverse/lychee-action@v2 + with: + args: --config .lychee.toml _data/conferences.yml + fail: false # Don't fail workflow on broken links + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Find existing broken links issue + if: steps.lychee.outputs.exit_code != 0 + id: find_issue + env: + GH_TOKEN: ${{ github.token }} + run: | + ISSUE=$(gh issue list --label broken-links --state open --json number -q '.[0].number' 2>/dev/null || echo "") + echo "number=${ISSUE}" >> $GITHUB_OUTPUT + + - name: Create or update broken links issue + if: steps.lychee.outputs.exit_code != 0 + uses: peter-evans/create-issue-from-file@v6 + with: + title: "🔗 Broken links detected" + content-filepath: ./lychee/out.md + labels: automated,broken-links + issue-number: ${{ steps.find_issue.outputs.number }} diff --git a/.github/workflows/pr-sort.yml b/.github/workflows/pr-sort.yml new file mode 100644 index 00000000000..266f1b29898 --- /dev/null +++ b/.github/workflows/pr-sort.yml @@ -0,0 +1,147 @@ +name: Pull Request Conference Sort & All-contrib + +on: + pull_request_target: + paths: + - '_data/conferences.yml' + types: + - closed + branches: + - main + workflow_dispatch: + inputs: + pr_number: + description: 'PR number to reference (leave empty for sort-only)' + required: false + type: string + contributor: + description: 'GitHub username to add as contributor (leave empty to skip)' + required: false + type: string + +# Add permissions block here +permissions: + contents: write + pull-requests: write + +jobs: + process-changes: + runs-on: ubuntu-latest + # Only check for merged PR when triggered by a pull_request event + # And skip if PR was merged by a bot + if: >- + (github.event_name == 'workflow_dispatch' || (github.event.pull_request.merged == true && !contains(github.event.pull_request.user.login, '[bot]') && !contains(github.event.pull_request.user.login, '-bot') && github.event.pull_request.user.login != 'dependabot' && github.event.pull_request.user.login != 'github-actions')) + steps: + - name: Checkout repository + uses: actions/checkout@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: Set variables + id: vars + run: | + if [[ "${{ github.event_name }}" == "pull_request" || "${{ github.event_name }}" == "pull_request_target" ]]; then + # For PR-triggered workflow + echo "pr_number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT + echo "contributor=${{ github.event.pull_request.user.login }}" >> $GITHUB_OUTPUT + echo "branch_name=automated-updates-${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT + else + # For manually triggered workflow + PR_REF="${{ github.event.inputs.pr_number }}" + CONTRIBUTOR="${{ github.event.inputs.contributor }}" + + if [[ -n "$PR_REF" ]]; then + echo "pr_number=$PR_REF" >> $GITHUB_OUTPUT + echo "branch_name=automated-updates-$PR_REF" >> $GITHUB_OUTPUT + else + # Generate a timestamp if no PR number provided + TIMESTAMP=$(date +%Y%m%d%H%M%S) + echo "pr_number=manual-$TIMESTAMP" >> $GITHUB_OUTPUT + echo "branch_name=automated-updates-$TIMESTAMP" >> $GITHUB_OUTPUT + fi + + if [[ -n "$CONTRIBUTOR" ]]; then + echo "contributor=$CONTRIBUTOR" >> $GITHUB_OUTPUT + else + echo "contributor=" >> $GITHUB_OUTPUT + fi + fi + + - name: Create branch and make changes + id: changes + run: | + # Create a new branch + BRANCH_NAME="${{ steps.vars.outputs.branch_name }}" + git checkout -b $BRANCH_NAME + + # Run sort command + pixi run sort + + # Add contributor if specified and they don't already have the "conference" contribution + # This check avoids a bug in all-contributors-cli (issue #371) where + # adding an existing contribution type replaces all existing contributions + if [[ -n "${{ steps.vars.outputs.contributor }}" ]]; then + CONTRIBUTOR="${{ steps.vars.outputs.contributor }}" + # Check if contributor already has "conference" contribution (the overlap triggers the bug). + # IMPORTANT: there must be NO unconditional `all-contributors add` before this guard. + # all-contributors-cli replaces a contributor's whole contributions array when re-adding an + # existing type, so re-adding "conference" to someone who already has it strips their other + # contributions. The guard below is the ONLY add path: skip when "conference" is already present. + if ! jq -e --arg login "$CONTRIBUTOR" '.contributors[] | select(.login == $login) | .contributions | index("conference")' .all-contributorsrc > /dev/null 2>&1; then + echo "Adding conference contribution for: $CONTRIBUTOR" + pixi run install + pixi run add "$CONTRIBUTOR" conference + else + echo "Contributor $CONTRIBUTOR already has conference contribution, skipping to avoid contribution loss (all-contributors-cli bug #371)" + fi + fi + + # Check if there are changes + git status + if git diff --exit-code --quiet; then + echo "No changes detected in working directory" + echo "has_changes=false" >> $GITHUB_OUTPUT + else + echo "has_changes=true" >> $GITHUB_OUTPUT + + # Stage and commit changes + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git add _data/* .all-contributorsrc README.md CONTRIBUTING.md || true + + # Create commit message + COMMIT_MSG="chore: updates" + git commit -m "$COMMIT_MSG" + + # Push the branch to the remote repository + git push -u origin $BRANCH_NAME + fi + + - name: Manual PR creation + if: steps.changes.outputs.has_changes == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH_NAME: ${{ steps.vars.outputs.branch_name }} + run: | + # Check if PR already exists + PR_EXISTS=$(gh pr list --head $BRANCH_NAME --json number | jq 'length') + + if [[ "$PR_EXISTS" == "0" ]]; then + # Create a new PR + gh pr create \ + --title "chore: sort & add contributor" \ + --body "Automated workflow update + + Changes include: + - Sorted conferences + - Added contributor + + Please review and merge these automated updates." \ + --base main \ + --head $BRANCH_NAME + else + echo "Pull request from branch $BRANCH_NAME already exists." + fi diff --git a/.github/workflows/recurring-sort.yml b/.github/workflows/recurring-sort.yml new file mode 100644 index 00000000000..22a7ce76e41 --- /dev/null +++ b/.github/workflows/recurring-sort.yml @@ -0,0 +1,52 @@ +name: Weekly Conference Sort Update + +on: + schedule: + # Runs at 00:00 UTC on Friday + # https://crontab.guru/#0_0_*_*_6 + - cron: '0 0 * * 6' + # Optional: Allow manual triggering + workflow_dispatch: + + +jobs: + update-links: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@v0.10.1 + + - name: Run links command + run: pixi run sort + + - name: Check for changes + id: git-check + run: | + git diff --exit-code || echo "changes=true" >> $GITHUB_OUTPUT + + - name: Create Pull Request + id: create_pr + if: steps.git-check.outputs.changes == 'true' + uses: peter-evans/create-pull-request@v8 + with: + commit-message: 'chore: sort conferences' + title: 'chore: sort conferences' + body: | + Automated PR to update conference. + + This PR was automatically generated by the Update workflow. + branch: automated/sort-conferences + delete-branch: true + + - name: Auto merge + if: steps.create_pr.outputs.pull-request-operation == 'created' + run: gh pr merge --merge --auto "${{ steps.create_pr.outputs.pull-request-number }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/scheduled-extension-checker.yml b/.github/workflows/scheduled-extension-checker.yml new file mode 100644 index 00000000000..7d1959af48a --- /dev/null +++ b/.github/workflows/scheduled-extension-checker.yml @@ -0,0 +1,242 @@ +name: Scheduled Extension Checker + +on: + # Run daily at 6 AM UTC + schedule: + - cron: '0 6 * * *' + + # Manual trigger for testing + workflow_dispatch: + inputs: + days_ahead: + description: 'Check CFPs closing within N days' + required: false + type: number + default: 3 + dry_run: + description: 'Dry run (show what would be checked without triggering)' + required: false + type: boolean + default: false + +permissions: + contents: read + +jobs: + find-closing-cfps: + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + conferences: ${{ steps.find.outputs.conferences }} + count: ${{ steps.find.outputs.count }} + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Find CFPs closing soon + id: find + env: + # Pass inputs via env to prevent injection + DAYS_AHEAD: ${{ inputs.days_ahead || 3 }} + run: | + TODAY=$(date +%Y-%m-%d) + + # Use env vars safely in Python + python3 << 'FINDER' + import yaml + import json + import os + import sys + from datetime import datetime, timedelta + + days_ahead = int(os.environ.get('DAYS_AHEAD', '3')) + today = datetime.now().date() + check_until = today + timedelta(days=days_ahead) + + try: + with open("_data/conferences.yml") as f: + confs = yaml.safe_load(f) or [] + except Exception as e: + print(f"ERROR: Could not load conferences.yml: {e}", file=sys.stderr) + confs = [] + + closing_soon = [] + + for conf in confs: + name = conf.get("conference", "Unknown") + + # Get the effective CFP deadline + cfp_str = conf.get("cfp_ext") or conf.get("cfp", "TBA") + has_extension = conf.get("cfp_ext") is not None + + if cfp_str in ("TBA", "Cancelled", "None"): + continue + + try: + cfp_date = datetime.strptime(cfp_str[:10], "%Y-%m-%d").date() + except ValueError: + continue + + # Include CFPs closing within window or just closed (extension check) + extension_window_start = today - timedelta(days=3) + + if extension_window_start <= cfp_date <= check_until: + url = str(conf.get("link", "")) + + if cfp_date < today: + check_type = "extension_check" + reason = f"CFP closed {cfp_date}, checking for extension" + elif cfp_date == today: + check_type = "closing_today" + reason = "CFP closes today!" + else: + days_left = (cfp_date - today).days + check_type = "closing_soon" + reason = f"CFP closes in {days_left} days ({cfp_date})" + + # Skip if already has extension and past deadline + if has_extension and cfp_date < today: + print(f"Skip: {name} - already extended, past deadline", file=sys.stderr) + continue + + cfp_link = str(conf.get("cfp_link", "")) + closing_soon.append({ + "conference": name, + "url": url, + "cfp_link": cfp_link, + "cfp_date": str(cfp_date), + "has_extension": has_extension, + "check_type": check_type, + "reason": reason + }) + print(f"✓ {name}: {reason}") + + print(f"\nFound {len(closing_soon)} conferences to check") + + with open("/tmp/closing_cfps.json", "w") as f: + json.dump(closing_soon, f) + FINDER + + # Read results safely + CONFERENCES=$(cat /tmp/closing_cfps.json) + COUNT=$(echo "$CONFERENCES" | jq 'length') + + echo "conferences=$(echo "$CONFERENCES" | jq -c '.')" >> $GITHUB_OUTPUT + echo "count=$COUNT" >> $GITHUB_OUTPUT + + # Summary + echo "## CFPs Closing Soon" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Checking CFPs closing within **$DAYS_AHEAD days**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + if [ "$COUNT" -gt 0 ]; then + echo "| Conference | CFP Date | Status |" >> $GITHUB_STEP_SUMMARY + echo "|------------|----------|--------|" >> $GITHUB_STEP_SUMMARY + echo "$CONFERENCES" | jq -r '.[] | "| \(.conference) | \(.cfp_date) | \(.reason) |"' >> $GITHUB_STEP_SUMMARY + else + echo "No CFPs closing soon ✅" >> $GITHUB_STEP_SUMMARY + fi + + # Trigger checks for each conference + trigger-checks: + needs: find-closing-cfps + if: needs.find-closing-cfps.outputs.count != '0' && inputs.dry_run != true + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + strategy: + matrix: + conference: ${{ fromJson(needs.find-closing-cfps.outputs.conferences) }} + max-parallel: 1 # Conservative to avoid rate limits + fail-fast: false + + steps: + - name: Install lynx + run: sudo apt-get update && sudo apt-get install -y lynx + + - name: Fetch website content and trigger check + env: + # Pass matrix values via env for safety + CONF_NAME: ${{ matrix.conference.conference }} + CONF_URL: ${{ matrix.conference.url }} + CONF_CFP_LINK: ${{ matrix.conference.cfp_link }} + CONF_REASON: ${{ matrix.conference.reason }} + CONF_CFP_DATE: ${{ matrix.conference.cfp_date }} + CONF_CHECK_TYPE: ${{ matrix.conference.check_type }} + CONF_HAS_EXT: ${{ matrix.conference.has_extension }} + GH_TOKEN: ${{ github.token }} + run: | + echo "Triggering check for: $CONF_NAME" + echo "Main URL: $CONF_URL" + echo "CFP Link: $CONF_CFP_LINK" + echo "Reason: $CONF_REASON" + echo "CFP Date: $CONF_CFP_DATE" + echo "Check Type: $CONF_CHECK_TYPE" + + # Fetch main website content + echo "Fetching main website content..." + MAIN_CONTENT="" + if [ -n "$CONF_URL" ]; then + MAIN_CONTENT=$(lynx -dump -nolist "$CONF_URL" 2>/dev/null | head -500 || echo "Failed to fetch main website") + fi + + # Fetch CFP link content + echo "Fetching CFP link content..." + CFP_CONTENT="" + if [ -n "$CONF_CFP_LINK" ] && [ "$CONF_CFP_LINK" != "$CONF_URL" ]; then + CFP_CONTENT=$(lynx -dump -nolist "$CONF_CFP_LINK" 2>/dev/null | head -500 || echo "Failed to fetch CFP page") + fi + + # Combine content for analysis (use printf to avoid YAML parsing issues) + COMBINED_CONTENT=$(printf '%s\n\n%s\n%s\n\n%s\n%s' \ + "=== EXTENSION CHECK: $CONF_REASON ===" \ + "=== MAIN WEBSITE ($CONF_URL) ===" \ + "$MAIN_CONTENT" \ + "=== CFP PAGE ($CONF_CFP_LINK) ===" \ + "$CFP_CONTENT") + + # Truncate if too long (GitHub has payload limits) + COMBINED_CONTENT=$(echo "$COMBINED_CONTENT" | head -c 60000) + + # Use gh CLI for safe API call + # Pass trigger context so triage workflow can adjust prompt accordingly + gh api repos/${{ github.repository }}/dispatches \ + -f event_type=conference-change \ + -f "client_payload[url]=$CONF_URL" \ + -f "client_payload[title]=$CONF_NAME" \ + -f "client_payload[watch_uuid]=" \ + -f "client_payload[diff]=$COMBINED_CONTENT" \ + -f "client_payload[source]=scheduled-checker" \ + -f "client_payload[trigger_reason]=$CONF_CHECK_TYPE" \ + -f "client_payload[original_cfp_deadline]=$CONF_CFP_DATE" \ + -f "client_payload[has_extension]=$CONF_HAS_EXT" + + echo "✓ Triggered with website content" + + - name: Rate limit pause + run: sleep 10 # Generous pause between triggers + + # Summary + summary: + needs: [find-closing-cfps, trigger-checks] + if: always() + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Final summary + env: + COUNT: ${{ needs.find-closing-cfps.outputs.count }} + DRY_RUN: ${{ inputs.dry_run }} + run: | + echo "## Extension Checker Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + if [ "$COUNT" = "0" ]; then + echo "✅ No CFPs closing soon" >> $GITHUB_STEP_SUMMARY + elif [ "$DRY_RUN" = "true" ]; then + echo "🔍 **Dry run** - found $COUNT conferences (not triggered)" >> $GITHUB_STEP_SUMMARY + else + echo "🚀 Triggered checks for **$COUNT** conferences" >> $GITHUB_STEP_SUMMARY + fi diff --git a/.github/workflows/sync-changedetection.yaml b/.github/workflows/sync-changedetection.yaml new file mode 100644 index 00000000000..1e93ddac5ce --- /dev/null +++ b/.github/workflows/sync-changedetection.yaml @@ -0,0 +1,744 @@ +name: Sync New URLs to Changedetection.io + +on: + push: + branches: [main, master] + paths: + - '_data/**' + workflow_dispatch: + inputs: + dry_run: + description: 'Dry run (log actions without making API calls)' + type: boolean + default: false + force_recheck: + description: 'Check all URLs, not just new ones' + type: boolean + default: false + +permissions: + contents: read + +concurrency: + group: sync-changedetection + cancel-in-progress: false + +jobs: + sync-urls: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v7 + with: + python-version: '3.12' + + - name: Install dependencies + run: pip install pyyaml + + - name: Find last successful run commit + id: last-run + run: | + last_sha=$(gh run list --workflow="Sync New URLs to Changedetection.io" --json conclusion,headSha --jq '.[] | select(.conclusion=="success") | .headSha' | head -n1) + if [ -n "$last_sha" ] && [ "${{ inputs.force_recheck }}" != "true" ]; then + echo "sha=$last_sha" >> $GITHUB_OUTPUT + echo "Found last successful run at $last_sha" + else + echo "sha=$(git rev-list --max-parents=0 HEAD)" >> $GITHUB_OUTPUT + echo "Using initial commit (full scan mode)" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check changedetection.io configuration + id: check_cd + run: | + if [ -z "${{ vars.CHANGEDETECTION_URL }}" ]; then + echo "::error::CHANGEDETECTION_URL variable not set" + exit 1 + fi + if [ -z "${{ secrets.CHANGEDETECTION_KEY }}" ]; then + echo "::error::CHANGEDETECTION_KEY secret not set" + exit 1 + fi + + # Check if CF Access is required (common for changedetection.io instances) + if [ -z "${{ secrets.CF_ACCESS_CLIENT_ID }}" ] || [ -z "${{ secrets.CF_ACCESS_CLIENT_SECRET }}" ]; then + echo "::warning::Cloudflare Access credentials not configured" + echo "::warning::If your instance requires CF Access, set CF_ACCESS_CLIENT_ID and CF_ACCESS_CLIENT_SECRET secrets" + echo "::warning::Proceeding without CF Access headers - may cause HTTP 302 errors" + else + echo "::notice::Cloudflare Access credentials configured" + fi + + echo "configured=true" >> $GITHUB_OUTPUT + + - name: Test API connectivity + id: test-api + if: inputs.dry_run != true + run: | + API_URL="${{ vars.CHANGEDETECTION_URL }}/api/v1/systeminfo" + + echo "Testing API connectivity..." + + # Debug: Verify secrets are being read (show length, first 4 chars) + if [ -n "${{ secrets.CF_ACCESS_CLIENT_ID }}" ]; then + CLIENT_ID="${{ secrets.CF_ACCESS_CLIENT_ID }}" + CLIENT_SECRET="${{ secrets.CF_ACCESS_CLIENT_SECRET }}" + echo "Debug: CF Access Client ID length: ${#CLIENT_ID} chars, starts with: ${CLIENT_ID:0:4}..." + echo "Debug: CF Access Client Secret length: ${#CLIENT_SECRET} chars, starts with: ${CLIENT_SECRET:0:4}..." + fi + + CURL_OUTPUT=$(mktemp) + CURL_HEADERS=$(mktemp) + + # Test with systeminfo endpoint + if [ -n "${{ secrets.CF_ACCESS_CLIENT_ID }}" ]; then + HTTP_CODE=$(curl -w '%{http_code}' -s -D "$CURL_HEADERS" \ + -H "x-api-key: ${{ secrets.CHANGEDETECTION_KEY }}" \ + -H "CF-Access-Client-Id: ${{ secrets.CF_ACCESS_CLIENT_ID }}" \ + -H "CF-Access-Client-Secret: ${{ secrets.CF_ACCESS_CLIENT_SECRET }}" \ + "$API_URL" -o "$CURL_OUTPUT") + else + HTTP_CODE=$(curl -w '%{http_code}' -s -D "$CURL_HEADERS" \ + -H "x-api-key: ${{ secrets.CHANGEDETECTION_KEY }}" \ + "$API_URL" -o "$CURL_OUTPUT") + fi + + echo "HTTP status code: $HTTP_CODE" + + if [ "$HTTP_CODE" = "302" ] || [ "$HTTP_CODE" = "301" ]; then + echo "::error::❌ API connectivity test failed - HTTP $HTTP_CODE redirect" + echo "::error::Redirect location:" + grep -i "location:" "$CURL_HEADERS" || echo "No Location header found" + echo "::error::This means CF Access credentials are not working" + rm -f "$CURL_OUTPUT" "$CURL_HEADERS" + exit 1 + fi + + if [ "$HTTP_CODE" != "200" ]; then + echo "::error::❌ API connectivity test failed - HTTP $HTTP_CODE" + echo "::error::Response body:" + cat "$CURL_OUTPUT" | head -c 500 + rm -f "$CURL_OUTPUT" "$CURL_HEADERS" + exit 1 + fi + + RESPONSE=$(cat "$CURL_OUTPUT") + rm -f "$CURL_OUTPUT" "$CURL_HEADERS" + + # Validate response is valid JSON + if ! echo "$RESPONSE" | jq empty 2>/dev/null; then + echo "::error::❌ API returned invalid JSON (HTML login page)" + echo "::error::Response preview:" + echo "$RESPONSE" | head -c 500 + exit 1 + fi + + echo "✅ API connectivity test passed" + echo "API version: $(echo "$RESPONSE" | jq -r '.version // "unknown"')" + + - name: Fetch existing watches from changedetection.io + id: fetch-watches + if: inputs.dry_run != true + run: | + API_URL="${{ vars.CHANGEDETECTION_URL }}/api/v1/watch" + + echo "Fetching existing watches from changedetection.io..." + echo "Debug: API URL: $API_URL" + + # Debug: Show if CF Access credentials are being used + if [ -n "${{ secrets.CF_ACCESS_CLIENT_ID }}" ]; then + echo "Debug: CF Access credentials ARE configured" + else + echo "Debug: CF Access credentials NOT configured" + fi + + # Test curl with verbose output to see what's happening + echo "Debug: Testing curl with verbose output..." + CURL_OUTPUT=$(mktemp) + CURL_HEADERS=$(mktemp) + + # Build curl command with proper headers (no eval needed) + if [ -n "${{ secrets.CF_ACCESS_CLIENT_ID }}" ]; then + HTTP_CODE=$(curl -w '%{http_code}' -s -D "$CURL_HEADERS" \ + -H "x-api-key: ${{ secrets.CHANGEDETECTION_KEY }}" \ + -H "CF-Access-Client-Id: ${{ secrets.CF_ACCESS_CLIENT_ID }}" \ + -H "CF-Access-Client-Secret: ${{ secrets.CF_ACCESS_CLIENT_SECRET }}" \ + "$API_URL" -o "$CURL_OUTPUT") + else + HTTP_CODE=$(curl -w '%{http_code}' -s -D "$CURL_HEADERS" \ + -H "x-api-key: ${{ secrets.CHANGEDETECTION_KEY }}" \ + "$API_URL" -o "$CURL_OUTPUT") + fi + + echo "Debug: HTTP status code: $HTTP_CODE" + echo "Debug: Response size: $(wc -c < "$CURL_OUTPUT") bytes" + + # Show redirect location if present + if [ "$HTTP_CODE" = "302" ] || [ "$HTTP_CODE" = "301" ]; then + echo "Debug: Redirect detected - response headers:" + grep -i "location:" "$CURL_HEADERS" || echo "No Location header found" + echo "Debug: All response headers:" + cat "$CURL_HEADERS" + fi + + if [ "$HTTP_CODE" != "200" ]; then + echo "::error::Failed to fetch existing watches from changedetection.io" + echo "::error::HTTP status code: $HTTP_CODE" + echo "::error::Response body:" + cat "$CURL_OUTPUT" | head -c 500 + echo "" + echo "::error::" + echo "::error::This usually indicates:" + echo "::error:: 1. Cloudflare Access credentials are missing or incorrect (HTTP 302)" + echo "::error:: 2. CHANGEDETECTION_KEY is invalid (HTTP 401/403)" + echo "::error:: 3. CHANGEDETECTION_URL is incorrect (HTTP 404)" + rm -f "$CURL_OUTPUT" "$CURL_HEADERS" + exit 1 + fi + + RESPONSE=$(cat "$CURL_OUTPUT") + rm -f "$CURL_OUTPUT" "$CURL_HEADERS" + + # Validate response is valid JSON (not a CF Access login page) + if ! echo "$RESPONSE" | jq empty 2>/dev/null; then + echo "::error::API returned invalid JSON (possibly a Cloudflare Access login page)" + echo "::error::Response preview:" + echo "$RESPONSE" | head -c 500 + echo "::error::" + echo "::error::This indicates Cloudflare Access authentication failed." + echo "::error::Verify CF_ACCESS_CLIENT_ID and CF_ACCESS_CLIENT_SECRET secrets are set correctly." + exit 1 + fi + + # Debug: Show response structure + RESPONSE_TYPE=$(echo "$RESPONSE" | jq -r 'type') + echo "Response type: $RESPONSE_TYPE" + + if [ "$RESPONSE_TYPE" = "object" ]; then + # API returns object format: {"uuid": {watch_data}, ...} + WATCH_COUNT=$(echo "$RESPONSE" | jq 'length') + echo "API returned $WATCH_COUNT watches (object format)" + + if [ "$WATCH_COUNT" -gt 0 ]; then + echo "First watch structure:" + echo "$RESPONSE" | jq 'to_entries | .[0]' + else + echo "::warning::API returned empty object - no existing watches found" + fi + + # Extract URLs from object format: convert to array of values, then get URLs + echo "$RESPONSE" | jq -r 'to_entries[] | .value.url' | tr '[:upper:]' '[:lower:]' | sed 's:/*$::' > existing_urls.txt + elif [ "$RESPONSE_TYPE" = "array" ]; then + # Legacy: handle array format + WATCH_COUNT=$(echo "$RESPONSE" | jq 'length') + echo "API returned $WATCH_COUNT watches (array format)" + + if [ "$WATCH_COUNT" -gt 0 ]; then + echo "First watch structure:" + echo "$RESPONSE" | jq '.[0]' + fi + + echo "$RESPONSE" | jq -r '.[] | .url' | tr '[:upper:]' '[:lower:]' | sed 's:/*$::' > existing_urls.txt + else + echo "::error::Unexpected response type: $RESPONSE_TYPE" + echo "::error::Response preview:" + echo "$RESPONSE" | head -c 500 + exit 1 + fi + URL_COUNT=$(wc -l < existing_urls.txt) + echo "Successfully fetched $URL_COUNT existing watch URLs" + echo "count=$URL_COUNT" >> $GITHUB_OUTPUT + + - name: Create empty existing URLs file (dry run) + if: inputs.dry_run == true + run: touch existing_urls.txt + + - name: Process conference URLs + id: process + env: + LAST_SHA: ${{ steps.last-run.outputs.sha }} + run: | + python3 << 'PYTHON_SCRIPT' + import os + import re + import json + import subprocess + import sys + import yaml + from urllib.parse import urlparse + from typing import Optional + + LAST_SHA = os.environ.get('LAST_SHA', '') + + # Tag UUIDs + BASE_TAGS = [ + "1ad0fbdf-482a-4296-b983-45311ccf2352", + "aa19ce68-9d8f-4e86-8df2-342faccbccc8", + ] + + CONTINENT_TAGS = { + "africa": "70a6a80d-c13d-450f-b36e-cfa6cbd3fbd4", + "europe": "23a96495-26fc-4fa6-bdda-78c3051748e5", + "america": "b44ef3c3-7280-49bc-b71f-4d7c0ca62fb7", + "asia": "b488faec-899a-4578-9560-7154999b8c9e", + "oceania": "11742b59-eb4e-42b3-8069-64dfc1bced4e", + } + + SUB_TO_TAG = { + "WEB": "7054a0fb-69db-47fd-9c2e-3ee6c638bac7", + "SCIPY": "571f57a6-258d-4101-9136-cd1643365e55", + "DATA": "8e55732c-4d04-4457-bff8-2c0c851590db", + } + + CFP_TAG = "5799f798-2b44-452e-aefa-43874f6c3e1e" + + URL_FIELDS = {'link': 'Main', 'cfp_link': 'CFP'} + YEAR_PATTERN = re.compile(r'/(20(?:2[4-9]|3[0-5]))/') + + def get_continent(lat: float, lon: float) -> Optional[str]: + if lat is None or lon is None: + return None + if lon < -30: + return "america" + if lat < 0 and lon > 100: + return "oceania" + if lat < 35 and lon < 55: + return "africa" + if lon > 40: + return "asia" + return "europe" + + def get_location_coords(conf: dict) -> tuple[Optional[float], Optional[float]]: + location = conf.get('location', []) + if location and isinstance(location, list) and len(location) > 0: + loc = location[0] + return loc.get('latitude'), loc.get('longitude') + return None, None + + def get_start_month(conf: dict) -> Optional[int]: + start = conf.get('start') + if not start: + return None + if hasattr(start, 'month'): + return start.month + try: + parts = str(start).split('-') + if len(parts) >= 2: + return int(parts[1]) + except (ValueError, IndexError): + pass + return None + + def template_url(url: str, start_month: Optional[int]) -> str: + """Template years in URL (subdomain or path) with Jinja expressions. + + Examples: + Subdomains: + https://2026.pycon.de -> https://{% now ... %}.pycon.de + https://ep2026.europython.eu -> https://ep{% now ... %}.europython.eu + https://scipy2026.scipy.org -> https://scipy{% now ... %}.scipy.org + Paths: + https://pycon.de/2026/ -> https://pycon.de/{% now ... %}/ + https://pretalx.com/conference-2026/ -> https://pretalx.com/conference-{% now ... %}/ + https://pydata.org/london2026/ -> https://pydata.org/london{% now ... %}/ + """ + if not start_month: + return url + + template = f"{{% now 'utc' + 'months={start_month}', '%Y' %}}" + parsed = urlparse(url) + netloc_parts = parsed.netloc.split('.') + + # Check subdomain for year patterns + if len(netloc_parts) >= 2: + # Handle www.prefix2026.domain.com by checking both first and second part + for idx in [0, 1]: + if idx >= len(netloc_parts): + break + + subdomain = netloc_parts[idx] + + # Pattern 1: Pure year (2026) + if re.match(r'^20(?:2[4-9]|3[0-5])$', subdomain): + netloc_parts[idx] = template + new_netloc = '.'.join(netloc_parts) + return f"{parsed.scheme}://{new_netloc}{parsed.path or ''}" + + # Pattern 2: Prefix + year (ep2026, scipy2026) + match = re.match(r'^([a-z]+)(20(?:2[4-9]|3[0-5]))$', subdomain, re.IGNORECASE) + if match: + prefix = match.group(1) + netloc_parts[idx] = f"{prefix}{template}" + new_netloc = '.'.join(netloc_parts) + return f"{parsed.scheme}://{new_netloc}{parsed.path or ''}" + + # Only check second part if first part is 'www' + if idx == 0 and subdomain.lower() != 'www': + break + + # Check path for year patterns + path = parsed.path or '' + + # Pattern 1: Standalone year in path (/2026/ or /2026) + new_path = re.sub( + r'/(20(?:2[4-9]|3[0-5]))(/|$)', + rf'/{template}\2', + path + ) + if new_path != path: + return f"{parsed.scheme}://{parsed.netloc}{new_path}" + + # Pattern 2: Word(s) + hyphen + year (/conference-2026/ or /conference-2026) + new_path = re.sub( + r'/([a-z0-9-]+)-(20(?:2[4-9]|3[0-5]))(/|$)', + rf'/\1-{template}\3', + path, + flags=re.IGNORECASE + ) + if new_path != path: + return f"{parsed.scheme}://{parsed.netloc}{new_path}" + + # Pattern 3: Word + year no hyphen (/london2026/ or /london2026) + new_path = re.sub( + r'/([a-z]+)(20(?:2[4-9]|3[0-5]))(/|$)', + rf'/\1{template}\3', + path, + flags=re.IGNORECASE + ) + if new_path != path: + return f"{parsed.scheme}://{parsed.netloc}{new_path}" + + # No year found, return original + return url + + def build_tags(conf: dict, field: str = 'link') -> list[str]: + tags = list(BASE_TAGS) + lat, lon = get_location_coords(conf) + continent = get_continent(lat, lon) + if continent and continent in CONTINENT_TAGS: + tags.append(CONTINENT_TAGS[continent]) + sub = conf.get('sub', '').upper() + if sub in SUB_TO_TAG: + tags.append(SUB_TO_TAG[sub]) + if field == 'cfp_link': + tags.append(CFP_TAG) + return tags + + def normalize_url(url: str) -> str: + return url.rstrip('/').lower() if url else '' + + def get_base_url(url: str) -> str: + if not url: + return '' + parsed = urlparse(url) + return f"{parsed.scheme}://{parsed.netloc}" + + def get_root_domain(url: str) -> str: + """Extract root domain, stripping year-based subdomains, templates, and 'www'. + + Year subdomains (2024-2035), Jinja templates, and 'www' are stripped. + Meaningful subdomains are kept. + + Examples: + https://2026.pycon.de/cfp -> https://pycon.de (year subdomain stripped) + https://ep2026.europython.eu -> https://europython.eu (prefix+year stripped) + https://{% now ... %}.pycon.de -> https://pycon.de (template stripped) + https://ep{% now ... %}.europython.eu -> https://europython.eu (prefix+template stripped) + https://www.pycon.de -> https://pycon.de (www stripped) + https://us.pycon.org -> https://us.pycon.org (meaningful subdomain kept) + """ + if not url: + return '' + parsed = urlparse(url) + netloc = parsed.netloc.lower() + + # Split by dots + parts = netloc.split('.') + + # Strip 'www' if present + if len(parts) >= 3 and parts[0] == 'www': + parts = parts[1:] + + # Strip year subdomain if present (2024-2035) + if len(parts) >= 3 and re.match(r'^20(?:2[4-9]|3[0-5])$', parts[0]): + parts = parts[1:] + + # Strip prefix+year subdomain (ep2026, scipy2026) + if len(parts) >= 3 and re.match(r'^[a-z]+20(?:2[4-9]|3[0-5])$', parts[0], re.IGNORECASE): + parts = parts[1:] + + # Strip Jinja template subdomain (starts with {%) + if len(parts) >= 3 and parts[0].startswith('{%'): + parts = parts[1:] + + # Strip prefix+template subdomain (ep{% now ... %}) + if len(parts) >= 3 and re.search(r'{%.*%}', parts[0]): + parts = parts[1:] + + # Reconstruct domain + root = '.'.join(parts) + return f"{parsed.scheme}://{root}" + + def get_url_prefix_before_year(url: str) -> Optional[str]: + match = YEAR_PATTERN.search(url) + if not match: + return None + return url[:match.start() + 1] + + # Load existing URLs + existing_urls = set() + existing_root_domains = set() + try: + with open('existing_urls.txt', 'r') as f: + for line in f: + url = line.strip() + if url: + existing_urls.add(url) + base = get_base_url(url) + if base: + existing_urls.add(base.lower()) + # Also track root domains for subdomain matching + root = get_root_domain(url) + if root: + existing_root_domains.add(root.lower()) + except FileNotFoundError: + print("::error::existing_urls.txt not found") + sys.exit(1) + + print(f"Loaded {len(existing_urls)} existing URLs from changedetection.io") + print(f"Tracking {len(existing_root_domains)} unique root domains") + + def url_exists(url: str, use_base_url: bool = True) -> tuple[bool, str]: + if url.lower() in existing_urls: + return True, "exact URL match" + if use_base_url: + base = get_base_url(url) + if base and base.lower() in existing_urls: + return True, "base URL match" + # Check root domain to catch subdomain variations (2026.pycon.de vs pycon.de) + root = get_root_domain(url) + if root and root.lower() in existing_root_domains: + return True, "root domain match (subdomain variation)" + url_prefix = get_url_prefix_before_year(url) + if url_prefix: + prefix_lower = url_prefix.lower() + for cached_url in existing_urls: + if cached_url.startswith(prefix_lower): + return True, "templated version exists" + return False, "" + + # Load old conferences from git + try: + result = subprocess.run( + ['git', 'show', f'{LAST_SHA}:_data/conferences.yml'], + capture_output=True, text=True, check=True + ) + old_conferences = yaml.safe_load(result.stdout) or [] + except subprocess.CalledProcessError: + print(f"Warning: Could not load conferences from {LAST_SHA[:8]}") + old_conferences = [] + except Exception as e: + print(f"::error::Failed to load old conferences: {e}") + sys.exit(1) + + # Load current conferences + try: + with open('_data/conferences.yml', 'r') as f: + new_conferences = yaml.safe_load(f) or [] + except Exception as e: + print(f"::error::Failed to load current conferences: {e}") + sys.exit(1) + + print(f"Old conferences: {len(old_conferences)}") + print(f"Current conferences: {len(new_conferences)}") + + # Build set of old URLs + old_urls = set() + for conf in old_conferences: + for field in URL_FIELDS.keys(): + url = conf.get(field) + if url: + old_urls.add(normalize_url(url)) + print(f"URLs in previous version: {len(old_urls)}") + + # Find new URLs + watches_to_add = [] + skipped = [] + + for conf in new_conferences: + conf_name = f"{conf.get('conference', 'Unknown')} {conf.get('year', '')}".strip() + start_month = get_start_month(conf) + + for field, label in URL_FIELDS.items(): + url = conf.get(field) + if not url: + continue + + title = f"{conf_name} - {label}" + + if normalize_url(url) in old_urls: + skipped.append(f"{title}: existed in previous version") + continue + + use_base_url = (field == 'link') + exists, reason = url_exists(url, use_base_url=use_base_url) + if exists: + skipped.append(f"{title}: {reason}") + continue + + final_url = template_url(url, start_month) + watches_to_add.append({ + 'url': final_url, + 'original_url': url if final_url != url else None, + 'title': title, + 'tags': build_tags(conf, field), + 'fetch_backend': 'html_requests', # CRITICAL: Required by changedetection.io API + }) + + print(f"\nTo add: {len(watches_to_add)}") + print(f"Skipped: {len(skipped)}") + + # Write outputs + with open('watches_to_add.json', 'w') as f: + json.dump(watches_to_add, f) + with open('skipped.json', 'w') as f: + json.dump(skipped, f) + + # Write to GITHUB_OUTPUT + with open(os.environ.get('GITHUB_OUTPUT', '/dev/null'), 'a') as f: + f.write(f"count={len(watches_to_add)}\n") + + for watch in watches_to_add: + print(f" ADD: {watch['title']}") + if watch['original_url']: + print(f" Templated: {watch['url']}") + PYTHON_SCRIPT + + - name: Add watches to changedetection.io + id: add-watches + if: inputs.dry_run != true && steps.process.outputs.count != '0' + run: | + API_URL="${{ vars.CHANGEDETECTION_URL }}/api/v1/watch" + + ADDED=0 + FAILED=0 + TOTAL=$(jq length watches_to_add.json) + + echo "Adding $TOTAL watches to changedetection.io..." + + while read -r watch; do + TITLE=$(echo "$watch" | jq -r '.title') + + # Use complete payload from Python (includes fetch_backend) + PAYLOAD=$(echo "$watch" | jq -c '{url, title, tags, fetch_backend}') + + echo "Adding: $TITLE" + + # Build curl command with proper headers (no eval needed) + if [ -n "${{ secrets.CF_ACCESS_CLIENT_ID }}" ]; then + RESPONSE=$(curl -sf -X POST \ + -H "x-api-key: ${{ secrets.CHANGEDETECTION_KEY }}" \ + -H "CF-Access-Client-Id: ${{ secrets.CF_ACCESS_CLIENT_ID }}" \ + -H "CF-Access-Client-Secret: ${{ secrets.CF_ACCESS_CLIENT_SECRET }}" \ + -H "Content-Type: application/json" \ + -d "$PAYLOAD" \ + "$API_URL") + else + RESPONSE=$(curl -sf -X POST \ + -H "x-api-key: ${{ secrets.CHANGEDETECTION_KEY }}" \ + -H "Content-Type: application/json" \ + -d "$PAYLOAD" \ + "$API_URL") + fi + + if [ $? -eq 0 ]; then + # Validate response has UUID + UUID=$(echo "$RESPONSE" | jq -r '.uuid // empty') + if [ -n "$UUID" ]; then + echo " ✅ Added successfully (UUID: $UUID)" + ADDED=$((ADDED + 1)) + else + echo " ❌ No UUID in response" + echo " Response length: ${#RESPONSE}" + echo " Response: $RESPONSE" + if [ -z "$RESPONSE" ]; then + echo " Likely cause: Missing fetch_backend field in payload" + fi + FAILED=$((FAILED + 1)) + fi + else + echo " ❌ Failed to add (check CF Access credentials)" + FAILED=$((FAILED + 1)) + fi + + sleep 1 + done < <(jq -c '.[]' watches_to_add.json) + + echo "" + echo "Results: $ADDED added, $FAILED failed out of $TOTAL" + + # Output results + echo "added=$ADDED" >> $GITHUB_OUTPUT + echo "failed=$FAILED" >> $GITHUB_OUTPUT + + # Fail the step if any additions failed + if [ "$FAILED" -gt 0 ]; then + echo "::error::$FAILED out of $TOTAL watches failed to add" + echo "::error::Common causes:" + echo "::error:: - Cloudflare Access authentication failed" + echo "::error:: - API key is invalid or expired" + echo "::error:: - Network connectivity issues" + exit 1 + fi + + - name: Generate summary + if: always() + run: | + echo "## Changedetection.io Sync Results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + if [ "${{ inputs.dry_run }}" = "true" ]; then + echo "### 🔍 Dry Run Mode" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + if [ -f watches_to_add.json ]; then + COUNT=$(jq length watches_to_add.json) + echo "Would add **$COUNT** watches:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + jq -r '.[] | "- \(.title): \(.url)"' watches_to_add.json >> $GITHUB_STEP_SUMMARY + fi + elif [ -f watches_to_add.json ]; then + TOTAL=$(jq length watches_to_add.json) + ADDED="${{ steps.add-watches.outputs.added }}" + FAILED="${{ steps.add-watches.outputs.failed }}" + + if [ "$TOTAL" = "0" ]; then + echo "No new watches to add." >> $GITHUB_STEP_SUMMARY + elif [ -n "$ADDED" ]; then + echo "### Results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "- ✅ Added: **$ADDED**" >> $GITHUB_STEP_SUMMARY + echo "- ❌ Failed: **$FAILED**" >> $GITHUB_STEP_SUMMARY + echo "- Total: **$TOTAL**" >> $GITHUB_STEP_SUMMARY + fi + fi + + echo "" >> $GITHUB_STEP_SUMMARY + + if [ -f skipped.json ] && [ "$(jq length skipped.json)" -gt 0 ]; then + echo "
" >> $GITHUB_STEP_SUMMARY + echo "Skipped ($(jq length skipped.json) URLs)" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + jq -r '.[]' skipped.json | while read -r item; do + echo "- $item" >> $GITHUB_STEP_SUMMARY + done + echo "
" >> $GITHUB_STEP_SUMMARY + fi + + echo "" >> $GITHUB_STEP_SUMMARY + echo "---" >> $GITHUB_STEP_SUMMARY + echo "**Commit range:** \`${{ steps.last-run.outputs.sha }}\`..HEAD" >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index bf330ca1265..1113a5eac10 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,191 @@ _site vendor .vscode .DS_Store -.idea \ No newline at end of file +.idea +.tmp +.jekyll-metadata +.playwright-mcp/ + +# Claude Code configuration +.claude/ +CLAUDE.md + +# Temporary workflow files +.github/enrichment_review.md + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +coverage/ +test-results/ + +# Test files +test-*.html +*.test.html +static/test-*.html + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site +/playwright-report + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +utils/tidy_conf/data/.tmp/ +# pixi environments +.pixi +*.egg-info + +# Node modules +node_modules/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..1f20fab17cc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "python-organizers"] + path = utils/conferences + url = https://github.com/python-organizers/conferences/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000000..19a839e47aa --- /dev/null +++ b/.htaccess @@ -0,0 +1,10 @@ +RewriteEngine on +RewriteBase / +RewriteRule ^.well-known/(host-meta|webfinger).* https://fed.brid.gy/$0 [redirect=302,last] + +# Security Headers + + Header set X-Frame-Options "SAMEORIGIN" + Header set X-Content-Type-Options "nosniff" + Header set Referrer-Policy "strict-origin-when-cross-origin" + diff --git a/.lychee.toml b/.lychee.toml new file mode 100644 index 00000000000..fe77efbb47d --- /dev/null +++ b/.lychee.toml @@ -0,0 +1,29 @@ +# Lychee link checker configuration +# https://lychee.cli.rs/ + +# Exclude patterns - URLs that often rate-limit or are unreliable +exclude = [ + "^https://twitter.com", # Often rate-limited + "^https://x.com", # Twitter rebrand, same issues + "archive.org", # Skip archive links (handled by archive-new-urls.yml) + "^https://crowdin.com", # Translation service, may require auth +] + +# Cache results to speed up repeated checks +cache = true +max_cache_age = "1d" + +# Request settings +timeout = 20 +max_retries = 2 + +# Accept these HTTP status codes as valid +# 200: OK, 204: No Content, 301/302: Redirects, 429: Rate limited +accept = ["200", "204", "301", "302", "429"] + +# User agent to avoid bot detection +user_agent = "Mozilla/5.0 (compatible; lychee/0.15; +https://github.com/lycheeverse/lychee)" + +# Output format +output = "lychee/out.md" +format = "markdown" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000000..0f0fa0fb603 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,72 @@ +--- +exclude: '.*[\\/]pretty_.*\.html$' +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-yaml # Check YAML files for syntax errors + - id: debug-statements # Check for debugger imports and py37+ breakpoint() + - id: end-of-file-fixer # Ensure files end in a newline + exclude: '^pretty_.*\.html$' + - id: trailing-whitespace # Trailing whitespace checker + exclude: '^pretty_.*\.html$' + - id: check-added-large-files # Check for large files added to git + - id: check-merge-conflict # Check for files that contain merge conflict strings +- repo: https://github.com/pre-commit/pygrep-hooks + rev: v1.10.0 # Use the ref you want to point at + hooks: + - id: python-use-type-annotations # Check for missing type annotations + - id: python-check-blanket-noqa # Check for # noqa: all + - id: python-no-log-warn # Check for log.warn +- repo: https://github.com/pycqa/isort + rev: 5.13.2 + hooks: + - id: isort + args: + - -l 120 + - --force-single-line-imports + - --profile black +- repo: https://github.com/asottile/pyupgrade # Upgrade Python syntax + rev: v3.21.2 + hooks: + - id: pyupgrade + args: + - --py310-plus +- repo: https://github.com/psf/black # Format Python code + rev: 24.4.2 + hooks: + - id: black + args: + - --line-length=120 +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.4 + hooks: + - id: ruff + args: + - --line-length=120 + - --fix + - --exit-non-zero-on-fix + - --preview +- repo: https://github.com/jshwi/docsig # Check docstrings against function sig + rev: v0.53.2 + hooks: + - id: docsig + args: + - --ignore-no-params # Allow docstrings without parameters + - --check-dunders # Check dunder methods + - --check-overridden # Check overridden methods + - --check-protected # Check protected methods + - --check-class # Check class docstrings + - --disable=E113 # Disable empty docstrings + - --summary # Print a summary + +ci: + autofix_commit_msg: | + [pre-commit.ci] auto fixes from pre-commit.com hooks + + for more information, see https://pre-commit.ci + autofix_prs: true + autoupdate_branch: 'automated/pre-commit-autoupdate' + autoupdate_commit_msg: '[pre-commit.ci] pre-commit autoupdate' + autoupdate_schedule: monthly + submodules: false diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 368f7cc173a..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: ruby -rvm: - - 2.4 -script: - - bundle exec jekyll build --future - - bundle exec htmlproofer ./_site --only-4xx --check-favicon --check-html --url-ignore "/#.*/" --http-status-ignore "400,441" -env: - global: - - NOKOGIRI_USE_SYSTEM_LIBRARIES=true -branches: - only: - - gh-pages - - /.*/ -notifications: - on_success: never - on_failure: always diff --git a/CNAME b/CNAME index a6bc6680fbb..372d1005264 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -pythondeadlin.es \ No newline at end of file +pythondeadlin.es diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000000..306a1422d4c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,244 @@ +# Contributing to Python Deadlines + +[![pages-build-deployment](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment/badge.svg?branch=gh-pages)](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment) ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/jesperdramsch/python-deadlines) ![GitHub Repo stars](https://img.shields.io/github/stars/jesperdramsch/python-deadlines) [![All Contributors](https://img.shields.io/github/all-contributors/jesperdramsch/python-deadlines?color=ee8449)](#contributors) + +Thank you for your interest in contributing to Python Deadlines! This guide will help you get started with making contributions to the project. + +## Table of Contents + +- [Contributing to Python Deadlines](#contributing-to-python-deadlines) + - [Table of Contents](#table-of-contents) + - [Ways to Contribute](#ways-to-contribute) + - [Adding or Updating Conference Information](#adding-or-updating-conference-information) + - [Optional Fields](#optional-fields) + - [Development Setup](#development-setup) + - [Making Changes](#making-changes) + - [Pull Request Guidelines](#pull-request-guidelines) + - [Using All-Contributors Bot](#using-all-contributors-bot) + - [Contributors](#contributors) + - [Code Quality](#code-quality) + - [Getting Help](#getting-help) + - [Code of Conduct](#code-of-conduct) + - [License](#license) + +## Ways to Contribute + +You can contribute in several ways: + +- Adding or updating conference information +- Improving documentation +- Fixing bugs +- Adding new features +- Reviewing pull requests + +## Adding or Updating Conference Information + +1. Fork the repository +2. Edit `_data/conferences.yml` +3. Follow this format for conference entries: + +```yaml +- conference: BestConf # Title of conference + year: 2024 # Year + link: https://example.com # Conference website URL + cfp: '2024-06-01 23:59:59' # Submission deadline + place: Berlin, Germany # Location + start: 2024-09-15 # Conference start date + end: 2024-09-18 # Conference end date + sub: PY # Conference type (see below) +``` + +Required fields: + +- `conference`: Conference name +- `year`: Conference year +- `link`: Conference website URL +- `cfp`: Call for Proposals deadline +- `place`: Location +- `start`: Conference start date +- `end`: Conference end date +- `sub`: Conference type + +Conference types (`sub`): + +- `PY`: General Python +- `SCIPY`: Scientific Python +- `DATA`: Python for Data +- `WEB`: Python for Web +- `BIZ`: Python for Business +- `GEO`: Python for Earth + +### Optional Fields + +You can enhance your entry with these optional fields: + +- `alt_name`: Alternative conference name +- `cfp_link`: Specific CFP page URL +- `cfp_ext`: Extended deadline +- `workshop_deadline`: Workshop submission deadline +- `tutorial_deadline`: Tutorial submission deadline +- `timezone`: IANA timezone (defaults to AoE if omitted) +- `sponsor`: Sponsorship page URL +- `finaid`: Financial aid information URL +- `twitter`: Conference Twitter handle +- `mastodon`: Conference Mastodon URL +- `note`: Additional important information +- `location`: Venue coordinates for the map + +## Development Setup + +1. Install Jekyll (requires Ruby): + +```bash +gem install bundler jekyll +``` + +2. Clone your fork: + +```bash +git clone https://github.com/YOUR-USERNAME/python-deadlines.git +cd python-deadlines +``` + +3. Install dependencies: + +```bash +bundle install +``` + +4. Start the local server: + +```bash +bundle exec jekyll serve +``` + +## Making Changes + +1. Create a new branch: + +```bash +git checkout -b add-conference-name +``` + +2. Make your changes +3. Test locally +4. Commit with a descriptive message: + +```bash +git commit -m "Add ConferenceName 2024" +``` + +5. Push to your fork: + +```bash +git push origin add-conference-name +``` + +6. Create a Pull Request + +## Pull Request Guidelines + +- Use a clear, descriptive title +- Reference any related issues +- Include screenshots for UI changes +- Update documentation if needed +- Verify all tests pass + +## Using All-Contributors Bot + +We use the All-Contributors bot to recognize all contributors, not just code contributors. Here's how to use it: + +1. Comment on an issue or PR with: + +``` +@all-contributors please add @username for doc,code,content +``` + +Available contribution types: + +- `code`: Code or tests +- `doc`: Documentation +- `content`: Conference data +- `review`: Pull Request reviews +- `bug`: Bug reports +- `ideas`: Ideas and feedback +- `tool`: Tools and utilities + +2. The bot will create a PR to add the contributor +3. Once merged, they'll appear in the README 🎉 + +Example: + +``` +@all-contributors please add @janedoe for content,doc +``` + +### Contributors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jesper Dramsch
Jesper Dramsch

️️️️♿️ 🐛 📝 💻 📆 🖋 📖 🎨 💵 🤔 🚇 📣 👀 🛡️ 🔧 🌍 📢
Abhishek Das
Abhishek Das

💻
John Sandall
John Sandall

📆 🐛
Thibaud Colas
Thibaud Colas

📆
Tankala Ashok
Tankala Ashok

📆
Rob de Wit
Rob de Wit

📆
Takanori Suzuki
Takanori Suzuki

📆
Alexander CS Hendorf
Alexander CS Hendorf

📆
Radu
Radu

🐛
Isabel Zimmerman
Isabel Zimmerman

🐛
Jeroen Janssens
Jeroen Janssens

📆
David Horvath
David Horvath

📆
Olivier Grisel
Olivier Grisel

📆
Mateusz Sokół
Mateusz Sokół

📆
Theodore Meynard
Theodore Meynard

📆
Konrad Gawda
Konrad Gawda

📆
Ege Akman
Ege Akman

🐛 📆 💻
Ravi Selker
Ravi Selker

📆
Bardi Harborow
Bardi Harborow

📆
Ricky
Ricky

📆
Florian Bruhin
Florian Bruhin

📆
jungmir
jungmir

📆
Neil Muller
Neil Muller

📆
Ferran Jovell
Ferran Jovell

📆
Agriya Khetarpal
Agriya Khetarpal

📆
+ + + + + + +## Code Quality + +- Follow PEP 8 for Python code +- Use meaningful variable names +- Add comments for complex logic +- Include docstrings for functions +- Validate YAML files before committing + +## Getting Help + +- Open an issue for questions +- Join discussions in existing issues +- Contact maintainers for guidance + +## Code of Conduct + +Please follow our Code of Conduct in all project interactions. Report violations to the project maintainers. + +## License + +By contributing, you agree that your contributions will be licensed under the MIT License. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 00000000000..f198fa8288a --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,126 @@ +# Development Guide for Python Deadlines + +## Quick Development Builds + +The full site build with all languages and historical data can take a long time. We provide several development configurations for faster iteration: + +### Available Commands + +```bash +# Full production build (all languages, all data) - SLOW +pixi run serve + +# Development build (English + German, no archive/legacy) - FAST +pixi run serve-dev + +# Minimal build (English only, minimal plugins) - FASTEST +pixi run serve-minimal + +# Fast incremental build (skips initial build) +pixi run serve-fast +``` + +### Build Time Comparison + +| Command | Languages | Archive/Legacy | Plugins | Build Time | +|---------|-----------|----------------|---------|------------| +| `serve` | All 9 | Yes | All | ~3-5 minutes | +| `serve-dev` | EN, DE | No | Most | ~30-45 seconds | +| `serve-minimal` | EN only | No | Minimal | ~15-20 seconds | +| `serve-fast` | EN, DE | No | Most | ~10 seconds (incremental) | + +### Configuration Files + +- **`_config.yml`** - Main production configuration +- **`_config.dev.yml`** - Development config (EN+DE, no historical data) +- **`_config.minimal.yml`** - Minimal config (EN only, bare essentials) + +### How It Works + +Jekyll allows layering configurations using the `--config` flag: +```bash +jekyll serve --config _config.yml,_config.dev.yml +``` + +Later configs override earlier ones, so `_config.dev.yml` overrides specific settings from `_config.yml`. + +### What Gets Excluded in Dev Mode + +**Development Mode (`serve-dev`):** +- Languages: Only English and German +- Archive data: Not processed +- Legacy data: Not processed +- Some plugins: Sitemap disabled +- Analytics: Disabled + +**Minimal Mode (`serve-minimal`):** +- Languages: Only English +- Only current conferences processed +- Minimal plugins (no SEO, maps, sitemap) +- All other languages excluded from file watching +- Maximum speed optimizations + +### When to Use Each Mode + +- **`serve`** - Final testing before deployment, checking all languages +- **`serve-dev`** - General development, testing features +- **`serve-minimal`** - Quick iterations, CSS/JS development +- **`serve-fast`** - Continuous development with auto-reload + +### Tips for Faster Development + +1. **Use minimal mode for CSS/JS work:** + ```bash + pixi run serve-minimal + ``` + +2. **Skip link checking when sorting:** + ```bash + pixi run sort # Uses --skip_links by default + ``` + +3. **Use incremental builds:** + ```bash + pixi run serve-fast + ``` + +4. **Exclude files from watch:** + Add large files or directories to `exclude:` in dev configs + +5. **Clear Jekyll cache if builds are slow:** + ```bash + rm -rf _site .jekyll-cache + ``` + +### Custom Development Configuration + +You can create your own config for specific needs: + +```yaml +# _config.custom.yml +languages: [ "en", "es" ] # Your preferred languages +page_gen: + # Your custom page generation rules +``` + +Then use it: +```bash +bundler exec jekyll serve --config _config.yml,_config.custom.yml +``` + +### Troubleshooting + +**Build still slow?** +- Clear cache: `rm -rf _site .jekyll-cache` +- Check for large files in `_data/` +- Use `--profile` flag to identify bottlenecks + +**Missing content in dev mode?** +- Check which config you're using +- Archive/legacy conferences won't appear in dev mode +- Some languages are excluded + +**Changes not appearing?** +- Restart Jekyll if you modify `_config*.yml` +- Check if files are excluded in the config +- Try without `--incremental` flag diff --git a/Gemfile b/Gemfile index ea9bb27bb3e..7763ff6b338 100644 --- a/Gemfile +++ b/Gemfile @@ -1,8 +1,24 @@ source 'https://rubygems.org' -gem "github-pages", group: :jekyll_plugins -gem 'html-proofer' -gem 'jekyll-maps' -gem 'jekyll-geocode' +gem 'jekyll' +gem 'kramdown-parser-gfm' +gem "webrick", "~> 1.8" -gem "webrick", "~> 1.7" +group :jekyll_plugins do + gem 'jekyll-sitemap' + gem 'jekyll-seo-tag' + gem 'jekyll-datapage-generator' + gem 'jekyll-maps' +end + +gem "jekyll-multiple-languages-plugin", "~> 1.8" + +gem "jekyll-include-cache", "~> 0.2.1" + +gem "execjs", "~> 2.9" + +gem "nokogiri", "~> 1.19" + +gem "tzinfo", "~> 2.0" + +gem "tzinfo-data", "~> 1.2024" diff --git a/Gemfile.lock b/Gemfile.lock index 09ea81dc019..46f30066685 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,297 +1,126 @@ GEM remote: https://rubygems.org/ specs: - activesupport (6.0.4.8) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + bigdecimal (3.1.8) colorator (1.1.0) - commonmarker (0.23.4) - concurrent-ruby (1.1.10) - dnsruby (1.61.9) - simpleidn (~> 0.1) + concurrent-ruby (1.3.7) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) - ethon (0.15.0) - ffi (>= 1.15.0) eventmachine (1.2.7) - execjs (2.8.1) - faraday (1.10.0) - faraday-em_http (~> 1.0) - faraday-em_synchrony (~> 1.0) - faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0) - faraday-multipart (~> 1.0) - faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.0) - faraday-patron (~> 1.0) - faraday-rack (~> 1.0) - faraday-retry (~> 1.0) - ruby2_keywords (>= 0.0.4) - faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) - faraday-excon (1.1.0) - faraday-httpclient (1.0.1) - faraday-multipart (1.0.3) - multipart-post (>= 1.2, < 3) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.2.0) - faraday-patron (1.0.0) - faraday-rack (1.0.0) - faraday-retry (1.0.3) - ffi (1.15.5) + execjs (2.9.1) + ffi (1.17.0) + ffi (1.17.0-x64-mingw-ucrt) + ffi (1.17.0-x86_64-linux-gnu) forwardable-extended (2.6.0) - gemoji (3.0.1) - github-pages (226) - github-pages-health-check (= 1.17.9) - jekyll (= 3.9.2) - jekyll-avatar (= 0.7.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.2.0) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.15.1) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.13.0) - jekyll-include-cache (= 0.2.1) - jekyll-mentions (= 1.6.0) - jekyll-optional-front-matter (= 0.3.2) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.3.0) - jekyll-redirect-from (= 0.16.0) - jekyll-relative-links (= 0.6.1) - jekyll-remote-theme (= 0.4.3) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.8.0) - jekyll-sitemap (= 1.4.0) - jekyll-swiss (= 1.0.0) - jekyll-theme-architect (= 0.2.0) - jekyll-theme-cayman (= 0.2.0) - jekyll-theme-dinky (= 0.2.0) - jekyll-theme-hacker (= 0.2.0) - jekyll-theme-leap-day (= 0.2.0) - jekyll-theme-merlot (= 0.2.0) - jekyll-theme-midnight (= 0.2.0) - jekyll-theme-minimal (= 0.2.0) - jekyll-theme-modernist (= 0.2.0) - jekyll-theme-primer (= 0.6.0) - jekyll-theme-slate (= 0.2.0) - jekyll-theme-tactile (= 0.2.0) - jekyll-theme-time-machine (= 0.2.0) - jekyll-titles-from-headings (= 0.5.3) - jemoji (= 0.12.0) - kramdown (= 2.3.2) - kramdown-parser-gfm (= 1.1.0) - liquid (= 4.0.3) - mercenary (~> 0.3) - minima (= 2.5.1) - nokogiri (>= 1.13.4, < 2.0) - rouge (= 3.26.0) - terminal-table (~> 1.4) - github-pages-health-check (1.17.9) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (>= 3.0, < 5.0) - typhoeus (~> 1.3) - html-pipeline (2.14.1) - activesupport (>= 2) - nokogiri (>= 1.4) - html-proofer (3.19.3) - addressable (~> 2.3) - mercenary (~> 0.3) - nokogiri (~> 1.12) - parallel (~> 1.3) - rainbow (~> 3.0) - typhoeus (~> 1.3) - yell (~> 2.0) + google-protobuf (4.27.5) + bigdecimal + rake (>= 13) + google-protobuf (4.27.5-x64-mingw-ucrt) + bigdecimal + rake (>= 13) + google-protobuf (4.27.5-x86_64-linux) + bigdecimal + rake (>= 13) http_parser.rb (0.8.0) - i18n (0.9.5) + i18n (1.14.4) concurrent-ruby (~> 1.0) - jekyll (3.9.2) + jekyll (4.3.3) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) jekyll-watch (~> 2.0) - kramdown (>= 1.17, < 3) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) - mercenary (~> 0.3.3) + mercenary (>= 0.3.6, < 0.5) pathutil (~> 0.9) - rouge (>= 1.7, < 4) + rouge (>= 3.0, < 5.0) safe_yaml (~> 1.0) - jekyll-avatar (0.7.0) - jekyll (>= 3.0, < 5.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.4.0) - commonmarker (~> 0.22) - jekyll-commonmark-ghpages (0.2.0) - commonmarker (~> 0.23.4) - jekyll (~> 3.9.0) - jekyll-commonmark (~> 1.4.0) - rouge (>= 2.0, < 4.0) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.15.1) - jekyll (>= 3.7, < 5.0) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.13.0) - jekyll (>= 3.4, < 5.0) - octokit (~> 4.0, != 4.4.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-datapage-generator (1.4.0) jekyll-include-cache (0.2.1) jekyll (>= 3.7, < 5.0) - jekyll-mentions (1.6.0) - html-pipeline (~> 2.3) - jekyll (>= 3.7, < 5.0) - jekyll-optional-front-matter (0.3.2) - jekyll (>= 3.0, < 5.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.3.0) + jekyll-maps (2.4.0) jekyll (>= 3.0, < 5.0) - jekyll-redirect-from (0.16.0) - jekyll (>= 3.3, < 5.0) - jekyll-relative-links (0.6.1) - jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.3) - addressable (~> 2.0) - jekyll (>= 3.5, < 5.0) - jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) - rubyzip (>= 1.3.0, < 3.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) + jekyll-multiple-languages-plugin (1.8.0) + jekyll (>= 2.0, < 5.0) + jekyll-sass-converter (3.0.0) + sass-embedded (~> 1.54) jekyll-seo-tag (2.8.0) jekyll (>= 3.8, < 5.0) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) - jekyll-swiss (1.0.0) - jekyll-theme-architect (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.6.0) - jekyll (> 3.5, < 5.0) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.2.0) - jekyll (> 3.5, < 5.0) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.3) - jekyll (>= 3.3, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - jemoji (0.12.0) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (>= 3.0, < 5.0) - kramdown (2.3.2) + kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) + liquid (4.0.4) + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) - mini_portile2 (2.8.0) - minima (2.5.1) - jekyll (>= 3.5, < 5.0) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minitest (5.15.0) - multipart-post (2.1.1) - nokogiri (1.13.5) - mini_portile2 (~> 2.8.0) + mercenary (0.4.0) + mini_portile2 (2.8.9) + nokogiri (1.19.4) + mini_portile2 (~> 2.8.2) + racc (~> 1.4) + nokogiri (1.19.4-x64-mingw-ucrt) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - octokit (4.22.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) - parallel (1.22.1) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (4.0.7) - racc (1.6.0) - rainbow (3.1.1) - rb-fsevent (0.11.1) + public_suffix (7.0.5) + racc (1.8.1) + rake (13.2.1) + rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.5) - rouge (3.26.0) - ruby2_keywords (0.0.5) - rubyzip (2.3.2) + rexml (3.4.2) + rouge (4.2.0) safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.2) - addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) - simpleidn (0.2.1) - unf (~> 0.1.4) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (1.2.9) - thread_safe (~> 0.1) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.1) - unicode-display_width (1.8.0) - webrick (1.7.0) - yell (2.2.2) - zeitwerk (2.5.4) + sass-embedded (1.72.0) + google-protobuf (>= 3.25, < 5.0) + rake (>= 13.0.0) + sass-embedded (1.72.0-x64-mingw-ucrt) + google-protobuf (>= 3.25, < 5.0) + sass-embedded (1.72.0-x86_64-linux-gnu) + google-protobuf (>= 3.25, < 5.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2024.2) + tzinfo (>= 1.0.0) + unicode-display_width (2.5.0) + webrick (1.8.2) PLATFORMS - ruby + x64-mingw-ucrt + x64-mswin64-140 + x86_64-linux DEPENDENCIES - github-pages - html-proofer - webrick (~> 1.7) + execjs (~> 2.9) + jekyll + jekyll-datapage-generator + jekyll-include-cache (~> 0.2.1) + jekyll-maps + jekyll-multiple-languages-plugin (~> 1.8) + jekyll-seo-tag + jekyll-sitemap + kramdown-parser-gfm + nokogiri (~> 1.19) + tzinfo (~> 2.0) + tzinfo-data (~> 1.2024) + webrick (~> 1.8) BUNDLED WITH - 2.3.13 + 2.4.9 diff --git a/LICENSE b/LICENSE index 3c6d63ef529..b14e6d283c0 100644 --- a/LICENSE +++ b/LICENSE @@ -2,6 +2,9 @@ MIT License Copyright (c) 2021 Abhishek Das +Modifications by +Copyright (c) 2022 Jesper Dramsch + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/README.md b/README.md index 6435f7b5371..e57764ec4b5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -## Python Deadlines [![pages-build-deployment](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment/badge.svg?branch=gh-pages)](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment) +## Python Deadlines + +[![pages-build-deployment](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment/badge.svg?branch=gh-pages)](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment) ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/jesperdramsch/python-deadlines) [![All Contributors](https://img.shields.io/github/all-contributors/jesperdramsch/python-deadlines?color=ee8449)](#contributors) ![GitHub Repo stars](https://img.shields.io/github/stars/jesperdramsch/python-deadlines) [![Crowdin](https://badges.crowdin.net/python-deadlines/localized.svg)](https://crowdin.com/project/python-deadlines) Countdown timers to keep track of a bunch of Python conference deadlines. @@ -6,46 +8,275 @@ Countdown timers to keep track of a bunch of Python conference deadlines. Contributions are very welcome! +![GIF of adding a conference to pythondeadlin.es](static/img/pythondeadlines-edit.gif) + To add or update a deadline: -- Fork the repository -- Update `_data/conferences.yml` -- Make sure it has the `title`, `year`, `id`, `link`, `cfp`, `timezone`, `date`, `place`, `sub` attributes - + This [online web app](https://timezonefinder.michelfe.it/) makes it easy to find timezones – just click! - (Based on [timezonefinder](https://github.com/jannikmi/timezonefinder) library) - + Alternatively, see available timezone strings [here](https://momentjs.com/timezone/). -- Optionally add a `note` -- Example: - ```yaml - - title: BestConf # Title of conference without year - year: 2022 # Year - id: bestconf22 # title as lower case + last two digits of year - full_name: Best Conference for Anything # Full conference name (Optional) - link: link-to-website.com # URL to conference - cfp: 'YYYY-MM-DD HH:mm:ss' # Deadline for Call for Participation / Proposals - workshop_deadline: 'YYYY-MM-DD HH:mm:ss' # Workshop deadline if different from cfp (Optional) - tutorial_deadline: 'YYYY-MM-DD HH:mm:ss' # Tutorial deadline if different from cfp (Optional) - timezone: Asia/Seoul # Standard IANA Timezones (Omit for AoE) - place: Incheon, South Korea # City, Country - date: September, 18-22, 2022 # Nicely written dates of conference - start: YYYY-MM-DD # Start date of conference for calendar - end: YYYY-MM-DD # End date of conference for calendar - sub: PY # Type of conference (see or add _data/types.yml) - note: Important # In case there are extra notes about the conference (Optional) - ``` -- Send a pull request + +- Fork the repository +- Update `_data/conferences.yml` +- Make sure it has the `conference`, `year`, `link`, `cfp`, `place`, `sub` attributes + - This [online web app](https://timezonefinder.michelfe.it/) makes it easy to find timezones – just click! + (Based on [timezonefinder](https://github.com/jannikmi/timezonefinder) library) + - Alternatively, see available timezone strings [here](https://momentjs.com/timezone/). +- Optionally add a `note` +- Send a [pull request](_data/conferences.yml) + +### Examples + +#### Minimal Submission + +```yaml +- conference: BestConf # Title of conference + year: 2022 # Year + link: link-to-website.com # URL to conference + cfp: 'YYYY-MM-DD HH:mm:ss' # Deadline for Call for Participation / Proposals + place: Incheon, South Korea # City, Country# Nicely written dates of conference + start: YYYY-MM-DD # Start date of conference for calendar + end: YYYY-MM-DD # End date of conference for calendar + sub: PY # Type of conference (see or add _data/types.yml) +``` + +#### Full Data + +```yaml +- conference: BestConf # Title of conference + alt_name: Bestest Conf # Names change, keep track of Alternate names here + year: 2022 # Year + link: link-to-website.com # URL to conference + cfp_link: link-to-cfp.com # URL to call for proposals (Optional) + cfp: 'YYYY-MM-DD HH:mm:ss' # Deadline for Call for Participation / Proposals + cfp_ext: 'YYYY-MM-DD HH:mm:ss' # Extension of Deadline for Call for Participation / Proposals + workshop_deadline: 'YYYY-MM-DD HH:mm:ss' # Workshop deadline if different from cfp (Optional) + tutorial_deadline: 'YYYY-MM-DD HH:mm:ss' # Tutorial deadline if different from cfp (Optional) + timezone: Asia/Seoul # Standard IANA Timezones (Omit for AoE) + place: Incheon, South Korea # City, Country# Nicely written dates of conference + start: YYYY-MM-DD # Start date of conference for calendar + end: YYYY-MM-DD # End date of conference for calendar + sponsor: link-to-sponsor.page # URL to Sponsorship page (Optional) + finaid: link-to-finaid.page # URL to Financial Aid page (Optional) + twitter: BestConfEver # Twitter handle of conference (Optional) + mastodon: https://mastodon.social/@bconf # Mastodon handle of conference (Optional) + sub: PY # Type of conference (see or add _data/types.yml) + note: Important # In case there are extra notes about the conference (Optional) + location: # Geolocation for inclusion in map + latitude: 0.00 + longitude: 0.00 +``` + +### Description of entries + +| `sub` | Description | Type | Required | +| ------------------- | ----------------------------------------------------------------------------- | ------- | -------- | +| `conference` | Title of the conference | `str` | ✔ | +| `alt_name` | Alternative Name of conference | `str` | | +| `year` | Year of this conference | `int` | ✔ | +| `link` | URL to conference | `str` | ✔ | +| `cfp_link` | URL to call for proposals | `str` | | +| `cfp` | Deadline for Call for Participation / Proposals | `str` | ✔ | +| `cfp_ext` | Extension for Call for Participation / Proposals | `str` | | +| `workshop_deadline` | Workshop deadline if different from cfp | `str` | | +| `tutorial_deadline` | Tutorial deadline if different from cfp | `str` | | +| `timezone` | Standard [IANA Timezones](https://timezonefinder.michelfe.it/) (Omit for AoE) | `str` | | +| `place` | City, Country | `str` | ✔ | +| `start` | Start date of conference for calendar | `date` | ✔ | +| `end` | End date of conference for calendar | `date` | ✔ | +| `finaid` | URL to financial aid information | `str` | | +| `sponsor` | URL to sponsorship opportunities | `str` | | +| `twitter` | Twitter handle of conference | `str` | | +| `mastodon` | Mastodon handle of conference | `str` | | +| `sub` | Type of conference | `str` | ✔ | +| `note` | Extra notes about the conference | `str` | | +| `location` | Geolocation for inclusion in map | `str` | | +| `latitude` | Latitude of venue | `float` | | +| `longitude` | Longitude of venue | `float` | | + +### Conference types for `sub` + +| `sub` | Category name | +| ------- | ------------------- | +| `PY` | General Python | +| `SCIPY` | Scientific Python | +| `DATA` | Python for Data | +| `WEB` | Python for Web | +| `BIZ` | Python for Business | +| `GEO` | Python for Earth | + +### Utils + +I have created extensive scripts to import data from other sources and tidy up entries. + +Check out the utils folder for those. + +I mainly run the `main.py` and `sort_yaml.py` to get new entries and move old entries into the archive. ## Forks & other useful listings -- [aideadlines][2] the original -- [geodeadlin.es][3] by @LukasMosser -- [neuro-deadlines][4] by @tbryn -- [ai-challenge-deadlines][5] by @dieg0as -- [CV-oriented ai-deadlines (with an emphasis on medical images)][8] by @duducheng -- [es-deadlines (Embedded Systems, Computer Architecture, and Cyber-physical Systems)][9] by @AlexVonB and @k0nze -- [2019-2020 International Conferences in AI, CV, DM, NLP and Robotics][10] by @JackieTseng -- [ccf-deadlines][11] by @ccfddl -- [netdeadlines.com][12] by @albertgranalcoz -- [ad-deadlines.com][13] by @daniel-bogdoll +- [aideadlines][2] the original +- [geodeadlin.es][3] by @LukasMosser +- [neuro-deadlines][4] by @tbryn +- [ai-challenge-deadlines][5] by @dieg0as +- [CV-oriented ai-deadlines (with an emphasis on medical images)][8] by @duducheng +- [es-deadlines (Embedded Systems, Computer Architecture, and Cyber-physical Systems)][9] by @AlexVonB and @k0nze +- [2019-2020 International Conferences in AI, CV, DM, NLP and Robotics][10] by @JackieTseng +- [ccf-deadlines][11] by @ccfddl +- [networking-deadlines (Computer Networking, Measurement)][12] by @andrewcchu +- [ad-deadlines.com][13] by @daniel-bogdoll +- [sec-deadlines.github.io/ (Security and Privacy)][14] by @clementfung +- [pythondeadlin.es][15] by @jesperdramsch +- [deadlines.openlifescience.ai (Healthcare domain conferences and workshops)][16] by @monk1337 +- [hci-deadlines.github.io (Human-Computer Interaction conferences)][17] by @makinteract +- [ds-deadlines.github.io (Distributed Systems, Event-based Systems, Performance, and Software Engineering conferences)][18] by @ds-deadlines +- [https://deadlines.cpusec.org/ (Computer Architecture-Security conferences)][19] by @hoseinyavarzadeh +- [se-deadlines.github.io (Software engineering conferences)][20] by @sivanahamer and @imranur-rahman +- [awesome-mlss (Machine Learning Summer Schools)][21] by @sshkhr and @gmberton + +## Testing + +### Frontend JavaScript Tests + +```bash +# Run all frontend tests +npm test + +# Run with coverage report +npm run test:coverage + +# Run tests in watch mode (for development) +npm run test:watch + +# Debug tests +npm run test:debug +``` + +### End-to-End Tests + +```bash +# Install Playwright browsers (first time only) +npm run playwright:install-all + +# Run E2E tests +npm run e2e + +# Run E2E tests with UI (for debugging) +npm run e2e:ui + +# Run E2E tests for specific browser +npm run e2e:fast # Chromium only +npm run e2e:all # All browsers +npm run e2e:mobile # Mobile viewports + +# Generate E2E test code +npm run e2e:codegen +``` + +### Python Tests + +```bash +# Using pixi (recommended) +pixi run test +pixi run test-cov # With coverage +pixi run test-fast # Stop on first failure + +# Or using pytest directly +python -m pytest tests/ +python -m pytest tests/ --cov=utils --cov-report=html +``` + +### Jekyll Build Test + +```bash +# Test Jekyll build +bundle exec jekyll build + +# Serve for local testing +pixi run serve +# Or with test configuration +npm run serve:test +``` + +### Continuous Integration + +The project uses GitHub Actions for automated testing: + +- **Smart Test Runner**: Intelligently skips tests for data-only changes +- **Frontend Tests**: Run on JavaScript changes +- **E2E Tests**: Run on frontend/template changes +- **Python Tests**: Run on utility changes +- **Data Validation**: Always runs to ensure conference data integrity + +See [CI Optimization Documentation](.claude/docs/ci-optimization.md) for details on how we save CI costs. + +## Translations + +Python Deadlines is available in multiple languages to make Python conference information accessible to a global audience. We use [Crowdin](https://crowdin.com) to manage our translations. + +### Currently Supported Languages + +- English (en) +- Spanish (es) +- German (de) +- French (fr) +- Portuguese (Brazilian) (pt-br) +- Chinese (Simplified) (zh-cn) +- Russian (ru) +- Indonesian (id) +- Hindi (hi) + +### Contributing to Translations + +We welcome contributions to translate Python Deadlines into more languages! You don't need to be a developer or understand Git to help with translations. + +For detailed instructions on how to contribute translations, please see our [Translation Guide (TRANSLATION.md)](TRANSLATION.md). + +If you'd like to add support for a new language, please open an issue. + +## Contributors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jesper Dramsch
Jesper Dramsch

️️️️♿️ 🐛 📝 💻 📆 🖋 📖 🎨 💵 🤔 🚇 📣 👀 🛡️ 🔧 🌍 📢
Abhishek Das
Abhishek Das

💻
John Sandall
John Sandall

📆 🐛
Thibaud Colas
Thibaud Colas

📆
Tankala Ashok
Tankala Ashok

📆
Rob de Wit
Rob de Wit

📆
Takanori Suzuki
Takanori Suzuki

📆
Alexander CS Hendorf
Alexander CS Hendorf

📆
Radu
Radu

🐛
Isabel Zimmerman
Isabel Zimmerman

🐛
Jeroen Janssens
Jeroen Janssens

📆
David Horvath
David Horvath

📆
Olivier Grisel
Olivier Grisel

📆
Mateusz Sokół
Mateusz Sokół

📆
Theodore Meynard
Theodore Meynard

📆
Konrad Gawda
Konrad Gawda

📆
Ege Akman
Ege Akman

🐛 📆 💻
Ravi Selker
Ravi Selker

📆
Bardi Harborow
Bardi Harborow

📆
Ricky
Ricky

📆
Florian Bruhin
Florian Bruhin

📆
jungmir
jungmir

📆
Neil Muller
Neil Muller

📆
Ferran Jovell
Ferran Jovell

📆
Agriya Khetarpal
Agriya Khetarpal

📆
+ + + + + ## License @@ -53,7 +284,7 @@ This project is licensed under [MIT][1]. It uses: -- [IcoMoon Icons](https://icomoon.io/#icons-icomoon): [GPL](http://www.gnu.org/licenses/gpl.html) / [CC BY4.0](http://creativecommons.org/licenses/by/4.0/) +- [IcoMoon Icons](https://icomoon.io/#icons-icomoon): [GPL](http://www.gnu.org/licenses/gpl.html) / [CC BY4.0](http://creativecommons.org/licenses/by/4.0/) [1]: https://abhshkdz.mit-license.org/ [2]: http://aideadlin.es/ @@ -65,5 +296,13 @@ It uses: [9]: https://ekut-es.github.io/es-deadlines/ [10]: https://jackietseng.github.io/conference_call_for_paper/conferences.html [11]: https://ccfddl.github.io/ -[12]: https://netdeadlines.com/ +[12]: https://noise-lab.net/networking-deadlines/ [13]: https://ad-deadlines.com/ +[14]: https://sec-deadlines.github.io/ +[15]: https://pythondeadlin.es/ +[16]: https://deadlines.openlifescience.ai/ +[17]: https://hci-deadlines.github.io/ +[18]: https://ds-deadlines.github.io +[19]: https://deadlines.cpusec.org/ +[20]: https://se-deadlines.github.io/ +[21]: https://awesome-mlss.com/ diff --git a/TRANSLATION.md b/TRANSLATION.md new file mode 100644 index 00000000000..e150270bcef --- /dev/null +++ b/TRANSLATION.md @@ -0,0 +1,87 @@ +# Translation Guide for Python Deadlines + +[![Crowdin](https://badges.crowdin.net/python-deadlines/localized.svg)](https://crowdin.com/project/python-deadlines) + +Thank you for your interest in helping translate the Python Deadlines website! This document explains how to contribute translations using Crowdin. + +## What is Crowdin? + +[Crowdin](https://crowdin.com) is a localization management platform that helps us manage translations for the Python Deadlines website. It provides a user-friendly interface for translators to contribute without needing to understand Git or the technical structure of the project. + +## How to Join as a Translator + +1. Visit our Crowdin project at [https://crowdin.com/project/python-deadlines](https://crowdin.com/project/python-deadlines) (Note: Update this URL with your actual project link) +2. Create a Crowdin account or sign in if you already have one +3. Select the language you want to translate to +4. Start translating! + +## Project Structure + +The Python Deadlines website uses Jekyll's internationalization features. Here's how the translation files are structured: + +- `_i18n/en.yml`: Main language file containing UI strings +- `_i18n/en/*.md`: Markdown files for specific sections +- `_i18n/en/_posts/`: Blog post content +- `_i18n/en/search`, `_i18n/en/footer`, etc.: Section-specific content + +## Translation Guidelines + +### General Tips + +1. **Maintain the same formatting**: Preserve Markdown formatting, HTML tags, and variables (like `{% t ... %}` or `{{ ... }}`) +2. **Be consistent**: Use consistent terminology throughout your translations +3. **Keep the same meaning**: Focus on conveying the same meaning rather than translating word-for-word +4. **Respect context**: Pay attention to the context in which a string appears +5. **Test your translations**: If possible, test how your translations look on the site + +### Variables and Special Syntax + +When translating, be careful with: + +- **Jekyll Liquid tags**: Tags like `{% t ... %}`, `{{ ... }}`, `{% include ... %}` should remain unchanged +- **HTML tags**: Keep all HTML tags (e.g., `
`, ``, ``) intact +- **Pluralization**: Some languages have different forms based on count; Crowdin supports handling these cases + +### Date and Time Formats + +Pay attention to date and time formats that may be different in your language. The website uses Luxon for date/time formatting. + +## Translation Workflow + +1. **String Translation**: Translate strings in the Crowdin interface +2. **Review**: Translations are reviewed by language moderators +3. **Integration**: Approved translations are automatically synced to the GitHub repository +4. **Deployment**: Once merged into the main branch, translations are deployed to the live site + +## Testing Your Translations + +If you would like to test your translations locally before submitting: + +1. Clone the repository: `git clone https://github.com/JesperDramsch/python-deadlines.git` +2. Install Jekyll and dependencies: `bundle install` +3. Run the site locally: `bundle exec jekyll serve` +4. Visit `http://localhost:4000/{language-code}/` to see the site in your language + +## Supported Languages + +Currently, Python Deadlines is being translated into: + +- English (source language) +- Spanish (es) +- German (de) +- French (fr) +- Portuguese (Brazilian) (pt-br) +- Chinese (Simplified) (zh-cn) +- Russian (ru) +- Indonesian (id) +- Hindi (hi) + +If you would like to add a new language, please contact the project maintainers. + +## Contact + +If you have any questions or issues related to translation, please: + +- Open an issue on GitHub + +Thank you for helping make Python Deadlines accessible to a wider audience! diff --git a/_config.dev.yml b/_config.dev.yml new file mode 100644 index 00000000000..4267cf67b33 --- /dev/null +++ b/_config.dev.yml @@ -0,0 +1,91 @@ +# Development Configuration for Python Deadlines +# Fast build config - only English and German, no archive/legacy processing +# Usage: bundle exec jekyll serve --config _config.yml,_config.dev.yml + +# Override languages for faster builds +languages: [ "en", "de" ] + +# Exclude archive and legacy from page generation for faster builds +page_gen: +# Only process active conferences, skip archive and legacy +- data: 'conferences' + template: 'summary' + dir: 'series' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-') + title_expr: record['conference']+" "+"Conference Series Overview" +- data: 'conferences' + template: 'conference' + dir: 'conference' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s + title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" +# Archive and legacy are commented out for dev builds +# - data: 'archive' +# template: 'summary' +# dir: 'series' +# name_expr: record['conference'].downcase.gsub(/[^\p{L}]+/, ' ').strip.gsub(' ', '-') +# title_expr: record['conference']+" "+"Conference Series Overview" +# filter_condition: site.pages.none? { |page| page.relative_path.include?('/' + record['conference'].downcase.gsub(/[^\p{L}]+/, ' ').strip.gsub(' ', '-') + '/') } +# - data: 'legacy' +# template: 'summary' +# dir: 'series' +# name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-') +# title_expr: record['conference']+" "+"Conference Series Overview" +# filter_condition: site.pages.none? { |page| page.relative_path.include?('/' + record['conference'].downcase.gsub(/[^\p{L}]+/, ' ').strip.gsub(' ', '-') + '/') } +# - data: 'archive' +# template: 'conference' +# dir: 'conference' +# name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s +# title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" +# - data: 'legacy' +# template: 'conference' +# dir: 'conference' +# name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s +# title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" + +# Additional optimizations for development +# Disable some plugins that aren't needed during development +plugins: +- jekyll-include-cache +# - jekyll-seo-tag # Can disable for even faster builds +- jekyll-datapage-generator +# - jekyll-maps # Can disable if not testing maps +- jekyll-multiple-languages-plugin +# - jekyll-sitemap # Not needed for dev + +# Faster regeneration +incremental: true +profile: false + +# Disable analytics for dev +ga_id: +adsense_id: + +# Show build time info +show_drafts: true +strict_front_matter: false + +# Exclude more files from processing +exclude: + - Gemfile + - Gemfile.lock + - node_modules + - vendor/bundle/ + - vendor/cache/ + - vendor/gems/ + - vendor/ruby/ + - utils/ + - tests/ + - "*.pyc" + - "*.pyo" + - ".pytest_cache" + - "__pycache__" + - ".coverage" + - "htmlcov/" + - ".git" + - ".github" + - "*.log" + - "*.tmp" + - ".DS_Store" + - "Thumbs.db" + - "_data/archive.yml" # Exclude archive data from watch + - "_data/legacy.yml" # Exclude legacy data from watch diff --git a/_config.minimal.yml b/_config.minimal.yml new file mode 100644 index 00000000000..0ee145cc162 --- /dev/null +++ b/_config.minimal.yml @@ -0,0 +1,83 @@ +# Minimal Configuration for Python Deadlines +# Ultra-fast build config - English only, no archive/legacy, minimal plugins +# Usage: bundle exec jekyll serve --config _config.yml,_config.minimal.yml + +# Only English for fastest possible builds +languages: [ "en" ] + +# Only process current conferences +page_gen: +- data: 'conferences' + template: 'conference' + dir: 'conference' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s + title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" + +# Minimal plugins - only essentials +plugins: +- jekyll-datapage-generator +- jekyll-multiple-languages-plugin +- jekyll-include-cache + +# Maximum speed optimizations +incremental: true +profile: false +safe: false +liquid: + error_mode: lax + strict_filters: false + strict_variables: false + +# Disable all external services +ga_id: +adsense_id: +maps: + google: + api_key: + +# Don't process these at all +keep_files: ['.git', '.svn'] +skip_config_files: false + +# File watching +watch: true +force_polling: false + +# Exclude everything non-essential +exclude: + - Gemfile + - Gemfile.lock + - node_modules + - vendor/ + - utils/ + - tests/ + - "*.pyc" + - "*.pyo" + - ".pytest_cache" + - "__pycache__" + - ".coverage" + - "htmlcov/" + - ".git" + - ".github" + - "*.log" + - "*.tmp" + - ".DS_Store" + - "Thumbs.db" + - "_data/archive.yml" + - "_data/legacy.yml" + - "_i18n/es*" + - "_i18n/fr*" + - "_i18n/pt-br*" + - "_i18n/zh-cn*" + - "_i18n/hi*" + - "_i18n/id*" + - "_i18n/ru*" + - "_site/es" + - "_site/fr" + - "_site/pt-br" + - "_site/zh-cn" + - "_site/hi" + - "_site/id" + - "_site/ru" + - "crowdin.yml" + - "TRANSLATION.md" diff --git a/_config.test.yml b/_config.test.yml new file mode 100644 index 00000000000..6b9de8cd9e3 --- /dev/null +++ b/_config.test.yml @@ -0,0 +1,101 @@ +# Test Configuration for Python Deadlines +# Optimized for E2E testing - fast builds with essential features +# Usage: bundle exec jekyll serve --config _config.yml,_config.test.yml + +# English only for fast builds during testing +languages: [ "en" ] + +# Only process active conferences for testing +page_gen: +- data: 'conferences' + template: 'conference' + dir: 'conference' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s + title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" +- data: 'conferences' + template: 'summary' + dir: 'series' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-') + title_expr: record['conference']+" "+"Conference Series Overview" + +# Essential plugins only +plugins: +- jekyll-datapage-generator +- jekyll-multiple-languages-plugin +- jekyll-include-cache + +# Speed optimizations +incremental: true +profile: false +safe: false +liquid: + error_mode: lax + strict_filters: false + strict_variables: false + +# Faster regeneration +regeneration: true +show_drafts: false +strict_front_matter: false +future: true # Show future conferences for testing + +# Disable external services during tests +ga_id: +adsense_id: +maps: + google: + api_key: + +# Test environment settings +environment: test +url: "http://localhost:4000" +baseurl: "" + +# Limit posts/pages processed +limit_posts: 0 # Don't process blog posts if any + +# Exclude non-essential files +exclude: + - Gemfile + - Gemfile.lock + - node_modules + - vendor/ + - utils/ + - tests/ + - "*.pyc" + - "*.pyo" + - ".pytest_cache" + - "__pycache__" + - ".coverage" + - "htmlcov/" + - ".git" + - ".github" + - "*.log" + - "*.tmp" + - ".DS_Store" + - "Thumbs.db" + - "_data/archive.yml" + - "_data/legacy.yml" + - "playwright.config.js" + - "jest.config.js" + - "package*.json" + - "playwright-report/" + - "test-results/" + - "coverage/" + - "README.md" + - "CONTRIBUTING.md" + - "TRANSLATION.md" + - "crowdin.yml" + - ".claude/" + - "pixi.toml" + - ".pre-commit-config.yaml" + +# Disable file watching (not needed for CI builds) +watch: false +force_polling: false + +# Test-specific settings +# Ensure JavaScript files are always fresh +sass: + style: expanded # Easier to debug + sourcemap: never # Don't generate sourcemaps diff --git a/_config.yml b/_config.yml index 8f1c35d4a2c..ca32c526469 100644 --- a/_config.yml +++ b/_config.yml @@ -1,17 +1,184 @@ +--- title: Python Conference Deadlines # (Maintained by @jesperdramsch) -description: Countdowns to your favourite Python conferences -author: Jesper Dramsch +description: Countdowns to your favourite Python conferences with calls for participation and resources to submit awesome talks! +tagline: Countdowns to your favourite Python conferences -domain: "pythondeadlin.es" -baseurl: "/" +url: 'https://pythondeadlin.es' +domain: 'pythondeadlin.es' +baseurl: '' -twitter_username: jesperdramsch twitter_hashtag: python github_username: jesperdramsch github_repo: python-deadlines markdown: kramdown -ga_id: G-X95YZPWV05 -adsense_id: ca-pub-2158291969836277 +ga_id: +adsense_id: -include: ['_pages'] +include: [ '_pages', '\.htaccess' ] + +defaults: +- scope: + path: "" + values: + seo_description_max_words: 200 + image: /static/img/python-deadlines-social-preview.png + author: Jesper Dramsch +- scope: + path: "_year" + values: + layout: "year" + +collections: + posts: + output: true + permalink: /resources/:title/index:output_ext + years: + output: true + permalink: /archive/:title/index:output_ext + +plugins: +- jekyll-include-cache +- jekyll-seo-tag +- jekyll-datapage-generator +- jekyll-maps +- jekyll-multiple-languages-plugin +- jekyll-sitemap + +author: + name: Jesper Dramsch + url: https://dramsch.net + +social: + name: Jesper Dramsch + links: + - https://www.dramsch.net/linkedin + - https://www.dramsch.net/mastodon + - https://www.dramsch.net/threads + - https://www.dramsch.net/github + - https://www.dramsch.net/youtube + +languages: [ "en", "es", "de", "fr", "pt-br", "zh-cn", "hi", "id", "ru" ] +languages_available: + en: + name: English + status: native + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: native + es: + name: Español + status: non-native + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: non-native + de: + name: Deutsch + status: native + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: native + fr: + name: Français + status: ai + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: ai + pt-br: + name: Português Brasileiro + status: ai + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: ai + zh-cn: + name: 简体中文 + status: ai + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: ai + ru: + name: Русский + status: ai + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: ai + hi: + name: हिन्दी + status: ai + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: ai + id: + name: Bahasa Indonesia + status: ai + translators: + - name: Jesper Dramsch + url: https://dramsch.net + level: ai + +exclude_from_localizations: +- 'static' + +twitter: + card: summary + +maps: + google: + api_key: AIzaSyCEJ_S3OFxqrOfgx5WdSEMl8hxzgTFEw20 + +page_gen-dirs: true + +page_gen: +- data: 'conferences' + template: 'summary' + dir: 'series' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-') + title_expr: record['conference']+" "+"Conference Series Overview" +- data: 'archive' + template: 'summary' + dir: 'series' + name_expr: record['conference'].downcase.gsub(/[^\p{L}]+/, ' ').strip.gsub(' ', '-') + title_expr: record['conference']+" "+"Conference Series Overview" + filter_condition: site.pages.none? { |page| page.relative_path.include?('/' + record['conference'].downcase.gsub(/[^\p{L}]+/, ' ').strip.gsub(' ', '-') + '/') } +- data: 'legacy' + template: 'summary' + dir: 'series' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-') + title_expr: record['conference']+" "+"Conference Series Overview" + filter_condition: site.pages.none? { |page| page.relative_path.include?('/' + record['conference'].downcase.gsub(/[^\p{L}]+/, ' ').strip.gsub(' ', '-') + '/') } +- data: 'conferences' + template: 'conference' + dir: 'conference' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s + title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" +- data: 'archive' + template: 'conference' + dir: 'conference' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s + title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" +- data: 'legacy' + template: 'conference' + dir: 'conference' + name_expr: record['conference'].downcase.strip.gsub(' ', '-').gsub(/[^\p{L}]+/, '-')+"-"+record['year'].to_s + title_expr: record['conference']+" "+record['year'].to_s+" Conference Deadlines" + +lunr_search: + index_dir: assets/search + index_name: search_index + fields: + title: 10 + content: 1 + url: 1 + date: 1 + place: 1 + alt_name: 10 + subs: 1 + link: 1 diff --git a/_config_dev.yml b/_config_dev.yml new file mode 100644 index 00000000000..6e3fcdc55f6 --- /dev/null +++ b/_config_dev.yml @@ -0,0 +1,2 @@ +# Development configuration - single language only +languages: ["en"] diff --git a/_data/archive.yml b/_data/archive.yml index 07ae686abac..fcc348b2b9e 100644 --- a/_data/archive.yml +++ b/_data/archive.yml @@ -1,71 +1,8602 @@ --- -- title: euroSciPy +- conference: Python Norte + year: 2026 + link: https://pythonnorte.org/ + cfp: TBA + timezone: America/Sao_Paulo + place: Ananindeua, Brazil + start: 2026-07-03 + end: 2026-07-05 + sub: PY + location: + - title: Python Norte 2026 + latitude: -1.374035 + longitude: -48.4016623 + +- conference: Web Summer Camp + year: 2026 + link: https://websummercamp.com/ + cfp_link: https://sessionize.com/web-summer-camp-2026/ + cfp: '2026-02-28 23:59:59' + place: Opatija, Croatia + start: 2026-07-02 + end: 2026-07-04 + sub: WEB + location: + - title: Web Summer Camp 2026 + latitude: 45.3349238 + longitude: 14.3067834 + +- conference: PyCon Singapore + year: 2026 + link: http://pycon.sg/ + cfp: TBA + place: Singapore, Singapore + start: 2026-06-19 + end: 2026-06-21 + sponsor: http://pycon.sg/index.html#sponsors + sub: PY + location: + - title: PyCon Singapore 2026 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: GeoPython + year: 2026 + link: https://2026.geopython.net/ + cfp_link: https://submit.geopython.net/geopython-2026/cfp + cfp: '2026-02-15 23:59:00' + cfp_ext: '2026-03-31 23:59:00' + tutorial_deadline: '2026-03-31 23:59:00' + place: Basel, Switzerland + start: 2026-06-08 + end: 2026-06-10 + sponsor: https://2026.geopython.net/app/sponsors + finaid: https://2026.geopython.net/app/finaid + sub: GEO + location: + - title: GeoPython 2026 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: PyData London + year: 2026 + link: https://pydata.org/london2026 + cfp_link: https://pydata.org/london2026/cfp#submit + cfp: '2026-02-16 23:59:00' + timezone: Europe/London + place: London, UK + start: 2026-06-05 + end: 2026-06-07 + sponsor: https://pydata.org/london2026/sponsor + sub: DATA + location: + - title: PyData London 2025 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2026 + link: https://2026.pycon.it/en + cfp_link: https://pycon.it/cfp + cfp: '2026-01-06 23:59:59' + place: Bologna, Italy + start: 2026-05-27 + end: 2026-05-30 + sponsor: https://2026.pycon.it/sponsor/ + mastodon: https://social.python.it/@pycon + sub: PY + location: + - title: PyCon Italy 2026 + latitude: 44.4938203 + longitude: 11.3426327 + +- conference: PyCon US + year: 2026 + link: https://us.pycon.org/2026/ + cfp_link: https://us.pycon.org/2026/speaking/talks/ + cfp: '2025-12-19 23:59:00' + place: Long Beach, USA + start: 2026-05-13 + end: 2026-05-19 + sponsor: https://us.pycon.org/2026/sponsorship/why-sponsor/ + mastodon: https://fosstodon.org/@pycon + sub: PY + location: + - title: PyCon US 2026 + latitude: 33.7690164 + longitude: -118.191604 + +- conference: Warsaw Python Pizza + year: 2026 + link: https://warsaw.python.pizza/ + cfp_link: https://forms.gle/5pqj68ES9ENaGPBf6 + cfp: '2026-04-14 23:59:00' + place: Warsaw, Poland + start: 2026-05-09 + end: 2026-05-09 + sponsor: https://warsaw.python.pizza/#sponsors + sub: PY + location: + - title: Warsaw Python Pizza 2026 + latitude: 52.2319581 + longitude: 21.0067249 + +- conference: PyGrunn + year: 2026 + link: https://pygrunn.org/ + cfp_link: https://forms.gle/5qAYUczPptmGVCY58 + cfp: TBA + place: Groningen, Netherlands + start: 2026-05-08 + end: 2026-05-08 + sub: PY + location: + - title: PyGrunn 2026 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: Python Sul + alt_name: Python Sul (Brazil) + year: 2026 + link: https://sul.python.org.br/ + cfp: TBA + timezone: America/Sao_Paulo + place: Londrina, Brazil + start: 2026-05-01 + end: 2026-05-03 + sub: PY + location: + - title: Python Sul 2026 + latitude: -23.4761271 + longitude: -51.1179013 + +- conference: North Bay Python + year: 2026 + link: https://northbaypython.org/ + cfp_link: https://pretalx.northbaypython.org/nbpy-2026/cfp + cfp: '2026-02-14 09:00:00' + timezone: America/Los_Angeles + place: Petaluma, USA + start: 2026-04-25 + end: 2026-04-26 + mastodon: https://bsky.app/profile/NorthBayPython.org + sub: PY + location: + - title: North Bay Python 2026 + latitude: 38.2325829 + longitude: -122.636465 + +- conference: PyCon Austria + year: 2026 + link: https://pycon.at/ + cfp_link: https://sessionize.com/pycon-austria-2026/ + cfp: '2026-03-06 23:59:00' + timezone: Europe/Vienna + place: Eisenstadt, Austria + start: 2026-04-19 + end: 2026-04-20 + sub: PY + location: + - title: PyCon Austria 2026 + latitude: 47.8454821 + longitude: 16.5249288 + +- conference: PyTexas + year: 2026 + link: https://www.pytexas.org/2026/ + cfp_link: https://pretalx.com/pytexas-2026/cfp + cfp: '2025-12-07 23:59:00' + timezone: America/Chicago + place: Austin, USA + start: 2026-04-17 + end: 2026-04-19 + sponsor: https://www.pytexas.org/2026/sponsors/sponsor-us/ + sub: PY + location: + - title: PyTexas 2026 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: DjangoCon Europe + year: 2026 + link: https://djangocon.eu/ + cfp_link: https://pretalx.evolutio.pt/djangocon-europe-2026/cfp + cfp: '2026-02-08 23:59:59' + cfp_ext: '2026-02-15 23:59:00' + timezone: Europe/Athens + place: Athens, Greece + start: 2026-04-15 + end: 2026-04-19 + sponsor: https://djangocon.eu/call-for-sponsors/ + sub: WEB + location: + - title: DjangoCon Europe 2026 + latitude: 37.9755648 + longitude: 23.7348324 + +- conference: PyCon Germany & PyData Conference + alt_name: PyCon Germany + year: 2026 + link: https://2026.pycon.de/ + cfp_link: https://pretalx.com/pyconde-pydata-2026/cfp + cfp: '2025-12-21 23:59:59' + cfp_ext: '2026-01-18 23:59:59' + tutorial_deadline: '2026-01-11 23:59:00' + timezone: Europe/Berlin + place: Darmstadt, Germany + start: 2026-04-14 + end: 2026-04-17 + sponsor: https://2026.pycon.de/sponsoring/ + sub: PY,DATA + location: + - title: PyCon Germany & PyData Conference 2026 + latitude: 49.872775 + longitude: 8.651177 + +- conference: PyCon Lithuania + alt_name: PyCon LT + year: 2026 + link: https://pycon.lt/2026 + cfp_link: https://pycon.lt/2026/call-for-proposals + cfp: '2026-01-15 23:59:00' + cfp_ext: '2026-01-31 23:59:00' + timezone: Europe/Vilnius + place: Vilnius, Lithuania + start: 2026-04-08 + end: 2026-04-10 + sponsor: https://pycon.lt/2026/partnership + sub: PY + location: + - title: PyCon Lithuania 2026 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: PyCascades + year: 2026 + link: https://2026.pycascades.com/ + cfp_link: https://pretalx.com/pycascades-2026/cfp + cfp: '2025-10-27 23:59:00' + cfp_ext: '2025-11-04 23:59:00' + place: Vancouver, Canada + start: 2026-03-21 + end: 2026-03-22 + sponsor: https://2026.pycascades.com/sponsors/become-a-sponsor/ + mastodon: https://fosstodon.org/@pycascades + sub: PY + location: + - title: PyCascades 2026 + latitude: 49.27213705 + longitude: -123.13439461006233 + +- conference: PythonAsia + alt_name: PyCon APAC + year: 2026 + link: https://2026.pythonasia.org/ + cfp_link: https://pretalx.com/python-asia-2026 + cfp: '2025-11-30 23:59:00' + timezone: Asia/Manila + place: Malate, Philippines + start: 2026-03-21 + end: 2026-03-23 + sponsor: https://bit.ly/PythonAsia2026-CallForSponsors + sub: PY + location: + - title: PythonAsia 2026 + latitude: 14.5700388 + longitude: 120.9915263 + +- conference: PyConf Hyderabad + year: 2026 + link: https://2026.pyconfhyd.org/ + cfp_link: https://www.papercall.io/pyconfhyd2026 + cfp: '2026-01-15 23:59:00' + place: Hyderabad, India + start: 2026-03-14 + end: 2026-03-15 + sponsor: https://2026.pyconfhyd.org/#sponsors + sub: PY + location: + - title: PyConf Hyderabad 2026 + latitude: 17.4454957 + longitude: 78.34854697544472 + +- conference: Python Unplugged on PyTV + year: 2026 + link: https://lp.jetbrains.com/python-unplugged/ + cfp: None + timezone: Europe/Berlin + place: Online + start: 2026-03-04 + end: 2026-03-04 + mastodon: https://fosstodon.org/@t_redactyl + bluesky: https://bsky.app/profile/pycharm.dev + sub: PY + +- conference: Python BarCamp Karlsruhe + year: 2026 + link: https://barcamps.eu/pythonbarcamp-2026/ + cfp: None + timezone: Europe/Berlin + place: Karlsruhe, Germany + start: 2026-02-21 + end: 2026-02-22 + sponsor: https://barcamps.eu/pythonbarcamp-2026/sponsoren + sub: CAMP + location: + - title: Python BarCamp Karlsruhe 2026 + latitude: 49.0068705 + longitude: 8.4034195 + +- conference: Python Pizza Ostrava + year: 2026 + link: https://ostrava.python.pizza/ + cfp: '2026-01-07 23:59:00' + timezone: Europe/Prague + place: Ostrava, Czechia + start: 2026-02-21 + end: 2026-02-21 + twitter: pythonpizzaconf + mastodon: https://fosstodon.org/@pythonpizza + sub: PY + location: + - title: Python Pizza Ostrava 2026 + latitude: 49.8349139 + longitude: 18.2820084 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2026 + link: https://na.pycon.org/ + cfp_link: https://pretalx.com/pycon-namibia-2026/cfp + cfp: '2025-12-01 23:59:00' + cfp_ext: '2026-02-05 23:59:00' + timezone: Africa/Windhoek + place: Windhoek, Namibia + start: 2026-02-20 + end: 2026-02-26 + sponsor: https://na.pycon.org/sponsor/ + twitter: PyConNA + sub: PY + location: + - title: PyCon Namibia 2026 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: Pytorch Day + year: 2026 + link: https://events.linuxfoundation.org/pytorch-day-india/ + cfp: TBA + place: Bengaluru, India + start: 2026-02-07 + end: 2026-02-07 + sub: DATA,DAY + location: + - title: Pytorch Day 2026 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: FOSDEM + year: 2026 + link: https://fosdem.org/2026/ + cfp: TBA + place: Brussels, Belgium + start: 2026-01-31 + end: 2026-01-31 + sponsor: https://fosdem.org/2026/about/sponsors/ + sub: PY + location: + - title: FOSDEM 2026 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: SciPyData Japan + year: 2026 + link: https://scipydata.connpass.com/event/364718/ + cfp: None + timezone: Asia/Tokyo + place: Tokyo, Japan + start: 2026-01-24 + end: 2026-01-24 + sub: SCIPY,DATA + location: + - title: SciPyData Japan 2026 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyData Global + year: 2025 + link: https://pydata.org/global2025/ + cfp_link: https://cfp.pydata.org/pydataglobal2025/cfp + cfp: '2025-08-06 23:59:00' + cfp_ext: '2025-08-06 23:59:00' + place: Online + start: 2025-12-09 + end: 2025-12-11 + sponsor: https://pydata.org/global2025/sponsor + sub: DATA + +- conference: PyData Eindhoven + year: 2025 + link: https://pydata.org/eindhoven2025 + cfp_link: https://pydata.org/eindhoven2025/call-for-proposals + cfp: '2025-10-12 16:54:00' + timezone: UTC + place: Eindhoven, Netherlands + start: 2025-12-09 + end: 2025-12-09 + sponsor: https://pydata.org/eindhoven2025/sponsorship-opportunities + sub: DATA + location: + - title: PyData Eindhoven 2025 + latitude: 51.4383999131 + longitude: 5.46712979814 + +- conference: PyData Boston + year: 2025 + link: https://pydata.org/boston2025 + cfp_link: https://pretalx.com/pydata-boston-2025/cfp + cfp: '2025-10-12 23:59:59' + timezone: America/New_York + place: Boston, USA + start: 2025-12-08 + end: 2025-12-10 + sponsor: https://pydata.org/boston2025/sponsorship-opportunities + sub: DATA + location: + - title: PyData Boston 2025 + latitude: 42.3554334 + longitude: -71.060511 + +- conference: PyLadiesCon + year: 2025 + link: https://2025.conference.pyladies.com/en/ + cfp_link: https://pretalx.com/pyladiescon-2025/cfp + cfp: '2025-08-23 12:59:00' + timezone: UTC + place: Online + start: 2025-12-05 + end: 2025-12-07 + sponsor: https://2025.conference.pyladies.com/en/sponsors/ + sub: PY + +- conference: PyCon Senegambia + year: 2025 + link: https://www.pyconsenegambia.org/en + cfp_link: https://sessionize.com/pycon-senegambia + cfp: '2025-09-04 23:59:00' + timezone: UTC + place: Banjul, Gambia + start: 2025-11-28 + end: 2025-11-29 + sub: PY + location: + - title: PyCon Senegambia 2025 + latitude: 13.45535 + longitude: -16.575646 + +- conference: Python Sul + alt_name: Python Sul (Brazil) + year: 2025 + link: https://sul.python.org.br/ + cfp_link: https://talks.python.org.br/pysul2025/cfp + cfp: '2025-10-05 23:59:00' + place: Porto Alegre, Brazil + start: 2025-11-21 + end: 2025-11-23 + sub: PY + location: + - title: Python Sul 2025 + latitude: -30.0324999 + longitude: -51.2303767 + +- conference: Kiwi PyCon + year: 2025 + link: https://kiwipycon.nz/ + cfp_link: https://kiwipycon.nz/present/submitting-a-talk + cfp: '2025-08-21 23:59:00' + timezone: Pacific/Auckland + place: Te Whanganui-a-Tara Wellington, New Zealand + start: 2025-11-21 + end: 2025-11-23 + sponsor: https://kiwipycon.nz/sponsors/become-a-sponsor + finaid: https://kiwipycon.nz/attend/financial-aid + mastodon: https://mastodon.social/@kiwipycon + bluesky: https://bsky.app/profile/kiwipycon.nz + sub: PY + location: + - title: Kiwi PyCon 2025 + latitude: -41.2887953 + longitude: 174.7772114 + +- conference: Xtreme Python + year: 2025 + link: https://xtremepython.dev/2025/ + cfp: '2025-09-20 23:59:00' + place: Online + start: 2025-11-18 + end: 2025-11-18 + sponsor: https://xtremepython.dev/2025/sponsors/ + sub: PY + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2025 + link: https://python.ie/pycon-2025/ + cfp_link: https://sessionize.com/pycon-ireland-2025 + cfp: '2025-08-02 23:59:00' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2025-11-15 + end: 2025-11-16 + sponsor: https://python.ie/pycon-2025/call-for-sponsors/ + finaid: https://python.ie/pycon-2025/financial-aid-2025/ + sub: PY + location: + - title: PyCon Ireland 2025 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Wroclaw + year: 2025 + link: https://www.pyconwroclaw.com/ + cfp_link: https://www.papercall.io/pyconwroclaw2025 + cfp: '2025-10-05 19:54:00' + timezone: UTC + place: Wroclaw, Poland + start: 2025-11-15 + end: 2025-11-15 + finaid: https://forms.gle/jQVrF3sXSQKBCHcM7 + twitter: pyconwroclaw + sub: PY + location: + - title: PyCon Wroclaw 2025 + latitude: 51.1089776 + longitude: 17.0326689 + +- conference: PyCon mini Tokai + year: 2025 + link: https://tokai.pycon.jp/2025/ + cfp: None + timezone: Asia/Tokyo + place: Nagoya, Japan + start: 2025-11-08 + end: 2025-11-08 + sub: PY + location: + - title: PyCon mini Tokai 2025 + latitude: 35.1851045 + longitude: 136.8998438 + +- conference: Django Day India + year: 2025 + link: https://djangoday.in/ + cfp_link: https://cfp.djangoday.in/django-day-india-2025/cfp + cfp: '2025-10-20 23:59:00' + timezone: Asia/Kolkata + place: Bangalore, India + start: 2025-11-08 + end: 2025-11-08 + sub: WEB + location: + - title: Django Day India 2025 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon Chile + year: 2025 + link: https://pycon.cl/ + cfp_link: https://sessionize.com/pycon-chile-2025 + cfp: '2025-09-29 23:59:00' + timezone: America/Santiago + place: Viña del Mar, Chile + start: 2025-11-08 + end: 2025-11-09 + sub: PY + location: + - title: PyCon Chile 2025 + latitude: -33.0244535 + longitude: -71.5517636 + +- conference: PyData Seattle + year: 2025 + link: https://pydata.org/seattle2025/ + cfp_link: https://cfp.pydata.org/seattle2025/ + cfp: '2025-09-01 23:59:00' + place: Bellevue, USA + start: 2025-11-07 + end: 2025-11-09 + sponsor: https://pydata.org/seattle2025/sponsorship-opportunities + sub: DATA + location: + - title: PyData Seattle 2025 + latitude: 47.6144219 + longitude: -122.192337 + +- conference: PyData Tel Aviv + year: 2025 + link: https://pydata.org/telaviv2025/ + cfp_link: https://cfp.pydata.org/pydata-tel-aviv-2025/cfp + cfp: '2025-07-13 23:59:00' + place: Tel Aviv, Israel + start: 2025-11-05 + end: 2025-11-05 + sponsor: https://pydata.org/telaviv2025/sponsor + sub: DATA + location: + - title: PyData Tel Aviv 2025 + latitude: 32.10050375 + longitude: 34.826677554304695 + +- conference: JupyterCon + year: 2025 + link: https://events.linuxfoundation.org/jupytercon/ + cfp_link: https://sessionize.com/jupytercon25/ + cfp: '2025-07-13 23:59:00' + timezone: America/Los_Angeles + place: San Diego, USA + start: 2025-11-03 + end: 2025-11-05 + sponsor: https://events.linuxfoundation.org/jupytercon/sponsor/ + twitter: jupyterCon + sub: DATA + location: + - title: JupyterCon 2025 + latitude: 32.7174202 + longitude: -117.1627728 + +- conference: PyCon Malaysia + alt_name: PyCon MY + year: 2025 + link: https://www.pycon.my/ + cfp_link: https://cfp.pycon.my/pyconmy-2025/cfp + cfp: '2025-09-15 00:00:00' + timezone: Asia/Kuala_Lumpur + place: Petaling Jaya, Malaysia + start: 2025-11-01 + end: 2025-11-02 + twitter: pyconmy + sub: PY + location: + - title: PyCon Malaysia 2025 + latitude: 3.0988792 + longitude: 101.6454202 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2025 + link: https://pycon.se/ + cfp_link: https://pretalx.com/pycon-sweden-2025/ + cfp: '2025-08-31 23:59:00' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2025-10-30 + end: 2025-10-31 + sponsor: https://pycon.se/#sponsorship + mastodon: https://fosstodon.org/@pyconsweden + sub: PY + location: + - title: PyCon Sweden 2025 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon France + alt_name: PyCon FR + year: 2025 + link: https://pycon.fr/2025/ + cfp_link: https://cfp.pycon.fr/pyconfr-2025/cfp + cfp: '2025-07-20 23:59:00' + timezone: Europe/Paris + place: Lyon, France + start: 2025-10-30 + end: 2025-11-02 + sponsor: https://www.pycon.fr/2025/en/sponsors.html + mastodon: https://mamot.fr/@AFPy + sub: PY + location: + - title: PyCon France 2025 + latitude: 45.7578137 + longitude: 4.8320114 + +- conference: PyHEP + year: 2025 + link: https://indico.cern.ch/event/1566263/ + cfp: '2025-10-13 23:59:00' + timezone: Europe/Zurich + place: CERN, Switzerland + start: 2025-10-27 + end: 2025-10-30 + sub: SCIPY + note: Hybrid event + location: + - title: PyHEP 2025 + latitude: 46.2333936 + longitude: 6.0556169 + +- conference: PyCon Davao + year: 2025 + link: https://pycon-davao.durianpy.org/ + cfp: '2025-08-30 23:59:00' + place: Davao City, Philippines + start: 2025-10-25 + end: 2025-10-26 + sponsor: https://pycon-davao.durianpy.org/sponsorship-prospectus + sub: PY + location: + - title: PyCon Davao 2025 + latitude: 7.0648306 + longitude: 125.6080623 + +- conference: PyTorch Conference + year: 2025 + link: https://events.linuxfoundation.org/pytorch-conference-2025/ + cfp_link: https://events.linuxfoundation.org/pytorch-conference/program/cfp/ + cfp: '2025-06-01 23:59:00' + timezone: America/Los_Angeles + place: San Francisco, USA + start: 2025-10-22 + end: 2025-10-23 + sponsor: https://events.linuxfoundation.org/sponsor-pytorch-25 + sub: DATA + location: + - title: PyTorch Conference 2025 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: Python Brasil + alt_name: PythonBrasil + year: 2025 + link: https://2025.pythonbrasil.org.br/ + cfp_link: https://talks.python.org.br/pythonbrasil-2025/cfp + cfp: '2025-04-27 23:59:00' + timezone: America/Sao_Paulo + place: Sao Paulo, Brazil + start: 2025-10-21 + end: 2025-10-27 + sponsor: https://www.canva.com/design/DAGe_yZ0SdI/myPIGUAEQAnrwKhJE_7Bag/view?utm_content=DAGe_yZ0SdI&utm_campaign=designshare&utm_medium=link2&utm_source=uniquelinks&utlId=h7f3e8c2330 + mastodon: https://pynews.com.br/@pythonbrasil + sub: PY + location: + - title: Python Brasil 2025 + latitude: -23.5506507 + longitude: -46.6333824 + +- conference: PyData Vermont + year: 2025 + link: https://pydata.org/vermont2025/ + cfp_link: https://cfp.pydata.org/pydata-vermont-2025/cfp + cfp: '2025-08-28 23:59:00' + timezone: America/New_York + place: Burlington, USA + start: 2025-10-21 + end: 2025-10-22 + sponsor: https://pydata.org/vermont2025/sponsorship-opportunities + sub: DATA + location: + - title: PyData Vermont 2025 + latitude: 43.3248924 + longitude: -79.7966835 + +- conference: PyBay + year: 2025 + link: https://pybay.org/ + cfp_link: https://pybay.org/speaking/ + cfp: '2025-07-31 23:59:00' + timezone: America/Los_Angeles + place: San Francisco, USA + start: 2025-10-18 + end: 2025-10-18 + sponsor: https://pybay.org/sponsors/sponsor-us/ + twitter: py_bay + mastodon: https://fosstodon.org/@pybay + sub: PY + location: + - title: PyBay 2025 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyCon Finland + alt_name: PyCon FI + year: 2025 + link: https://2025.ploneconf.org/pyconfi-2025 + cfp_link: https://2025.ploneconf.org/call-for-papers + cfp: '2025-07-31 23:59:00' + place: Jyväskylä, Finland + start: 2025-10-17 + end: 2025-10-17 + sponsor: https://2025.ploneconf.org/sponsors + sub: PY + note: Part of Plone Conf + location: + - title: PyCon Finland 2025 + latitude: 60.1674881 + longitude: 24.9427473 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2025 + link: https://2025.es.pycon.org/ + cfp_link: https://pretalx.com/pycones-2025/cfp + cfp: '2025-06-23 23:59:00' + timezone: Europe/Madrid + place: Sevilla, Spain + start: 2025-10-17 + end: 2025-10-19 + sponsor: https://2025.es.pycon.org/sponsorship.html + mastodon: https://fosstodon.org/@pycones + sub: PY + location: + - title: PyCon Spain 2025 + latitude: 41.6147605 + longitude: 0.6267842 + +- conference: PyCon Thailand + year: 2025 + link: https://th.pycon.org/ + cfp_link: https://sessionize.com/pycon-thailand-2025 + cfp: '2025-06-14 23:59:00' + place: Bangkok, Thailand + start: 2025-10-17 + end: 2025-10-18 + sponsor: https://www.canva.com/design/DAGaN7XThGo/UlApQVOhDU5j0U2hXk9Q7g/view + twitter: pyconthailand + sub: PY + location: + - title: PyCon Thailand 2025 + latitude: 13.7524938 + longitude: 100.4935089 + +- conference: PyCon Netherlands + alt_name: PyCon NL + year: 2025 + link: https://pycon-nl.org/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSdv-shKzLId7WMwxmVNfSsWZjCd4eNuB7ExKvu_B3s4yONR-Q/viewform + cfp: '2025-08-01 23:59:00' + cfp_ext: '2025-08-17 23:59:00' + place: Utrecht, Netherlands + start: 2025-10-16 + end: 2025-10-16 + sub: PY + location: + - title: PyCon Netherlands 2025 + latitude: 52.090833 + longitude: 5.121667 + +- conference: Swiss Python Summit + year: 2025 + link: https://python-summit.ch/ + cfp_link: https://talks.python-summit.ch/sps25/cfp + cfp: '2025-05-31 23:59:00' + cfp_ext: '2025-06-15 23:59:00' + timezone: Europe/Zurich + place: Rapperswil, Switzerland + start: 2025-10-16 + end: 2025-10-17 + sponsor: https://www.python-summit.ch/sponsoring/ + twitter: pythonsummit + sub: PY,DATA + note: 'Day 1: General Language Topics; Day 2: Data Science Topics' + location: + - title: Swiss Python Summit 2025 + latitude: 47.223987 + longitude: 8.8173 + +- conference: EARL + year: 2025 + link: https://earl-conference.com/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSdF0OHmG6UH4OcQLPkLTGyR7aOCxoYkiw1kzlewh1pxKHmIgA/closedform + cfp: '2025-02-28 23:59:00' + timezone: Europe/London + place: Brighton, UK + start: 2025-10-14 + end: 2025-10-16 + sub: BIZ + location: + - title: EARL 2025 + latitude: 50.8214626 + longitude: -0.1400561 + +- conference: Plone Conference + alt_name: Plone Conference & PyCon Finland + year: 2025 + link: https://2025.ploneconf.org/ + cfp_link: https://2025.ploneconf.org/call-for-papers + cfp: '2025-07-31 23:59:00' + place: Jyväskylä, Finland + start: 2025-10-13 + end: 2025-10-19 + sponsor: https://2025.ploneconf.org/sponsors + twitter: ploneconf + mastodon: https://plone.social/@ploneconf + bluesky: https://bsky.app/profile/plone.org + sub: WEB + location: + - title: Plone Conference 2025 + latitude: 62.2417066 + longitude: 25.7495727 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2025 + link: https://pycon.hk/2025/ + cfp_link: https://pretalx.com/pyconhk2025/cfp + cfp: '2025-06-22 23:59:00' + timezone: Asia/Hong_Kong + place: Hong Kong, China + start: 2025-10-11 + end: 2025-10-11 + twitter: pyconhk + sub: PY + location: + - title: PyCon Hong Kong 2025 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: Wagtail Space + year: 2025 + link: https://wagtail.org/wagtail-space-2025/ + cfp_link: https://pretalx.com/wagtail-space-2025/cfp + cfp: '2025-08-15 23:59:00' + timezone: UTC + place: Online + start: 2025-10-08 + end: 2025-10-10 + sponsor: https://wagtail.org/wagtail-space-2025/sponsors/ + mastodon: https://fosstodon.org/@wagtail + sub: WEB + +- conference: PyCon Africa + year: 2025 + link: https://za.pycon.org/ + cfp: '2025-06-27 23:59:00' + timezone: Africa/Johannesburg + place: Johannesburg, South Africa + start: 2025-10-08 + end: 2025-10-12 + sponsor: https://za.pycon.org/sponsors/packages/ + mastodon: https://mastodon.social/@pyconafrica + sub: PY + location: + - title: PyCon Africa 2025 + latitude: -26.205 + longitude: 28.049722 + +- conference: PyCon Nigeria + year: 2025 + link: https://ng.pycon.org/ + cfp: '2025-08-07 23:59:00' + place: Lagos, Nigeria + start: 2025-10-02 + end: 2025-10-04 + sponsor: https://ng.pycon.org/sponsors/packages/ + sub: PY + location: + - title: PyCon Nigeria 2025 + latitude: 6.4550575 + longitude: 3.3941795 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2025 + link: https://pycon.ee/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLScn-H2turgLHVbbm6g3t6MeOBmStlgQwEay8J1qfypfERKw0A/viewform + cfp: '2025-01-15 23:59:00' + timezone: Europe/Tallinn + place: Tallinn, Estonia + start: 2025-10-02 + end: 2025-10-03 + twitter: PyConEstonia + sub: PY + location: + - title: PyCon Estonia 2025 + latitude: 59.4372155 + longitude: 24.7453688 + +- conference: PyData Paris + year: 2025 + link: https://pydata.org/paris2025 + cfp_link: https://pydata.org/paris2025/cfp + cfp: '2025-04-13 23:59:00' + cfp_ext: '2025-04-27 23:59:00' + timezone: Europe/Paris + place: Paris, France + start: 2025-09-30 + end: 2025-10-02 + sponsor: https://pydata.org/paris2025/sponsorship-opportunites#tiers + mastodon: https://mastodon.social/@PyDataParis + bluesky: https://bsky.app/profile/pydataparis.bsky.social + sub: DATA + location: + - title: PyData Paris 2025 + latitude: 48.89591923094818 + longitude: 2.388543327766867 + +- conference: PyBeach + year: 2025 + link: https://2025.pybeach.org/ + cfp_link: https://pretalx.com/pybeach2025/cfp + cfp: '2025-06-30 23:59:00' + place: Santa Monica, USA + start: 2025-09-27 + end: 2025-09-27 + sponsor: https://2025.pybeach.org/prospectus.html + sub: PY + location: + - title: PyBeach 2025 + latitude: 34.0194704 + longitude: -118.491227 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2025 + link: https://2025.pycon.jp/ + cfp_link: https://pretalx.com/pycon-jp-2025/cfp + cfp: '2025-06-30 21:00:00' + timezone: Asia/Tokyo + place: Hiroshima, Japan + start: 2025-09-26 + end: 2025-09-27 + sub: PY + location: + - title: PyCon Japan 2025 + latitude: 34.3917241 + longitude: 132.4517589 + +- conference: PyCon Ghana + year: 2025 + link: https://gh.pycon.org/2025/ + cfp_link: https://gh.pycon.org/2025/talks/proposing_a_talk/ + cfp: '2025-08-08 23:59:00' + timezone: Africa/Accra + place: Accra, Ghana + start: 2025-09-25 + end: 2025-09-27 + sponsor: https://gh.pycon.org/2025/support-us/ + sub: PY + location: + - title: PyCon Ghana 2025 + latitude: 5.5571096 + longitude: -0.2012376 + +- conference: PyData Amsterdam + year: 2025 + link: https://amsterdam.pydata.org/ + cfp_link: https://cfp.pydata.org/pydata-amsterdam-2025/cfp + cfp: '2025-05-11 23:59:59' + timezone: Europe/Amsterdam + place: Amsterdam, Netherlands + start: 2025-09-24 + end: 2025-09-26 + sub: DATA + location: + - title: PyData Amsterdam 2025 + latitude: 52.38331772938018 + longitude: 4.920446388368758 + +- conference: PyCon China + year: 2025 + link: http://cn.pycon.org/2025/ + cfp_link: https://jsj.top/f/bBjpo3 + cfp: '2025-06-30 23:59:00' + place: Shanghai, China + start: 2025-09-20 + end: 2025-09-20 + sponsor: https://cn.pycon.org/2025/en/supporter/ + twitter: PyConChina + sub: PY + location: + - title: PyCon China 2025 + latitude: 31.2323437 + longitude: 121.4691024 + +- conference: Pythoncamp Rügen + year: 2025 + link: https://barcamps.eu/pyr2025/ + cfp_link: https://barcamps.eu/pyr2025/sessions + cfp: None + place: Rügen, Germany + start: 2025-09-20 + end: 2025-09-21 + sponsor: https://barcamps.eu/pyr2025/sponsoren + sub: CAMP + location: + - title: Pythoncamp Rügen 2025 + latitude: 54.4529015 + longitude: 13.3882344 + +- conference: PyCon UK + year: 2025 + link: https://2025.pyconuk.org/ + cfp_link: https://pretalx.com/pyconuk-2025/cfp + cfp: '2025-05-11 23:59:00' + timezone: Europe/London + place: Manchester, UK + start: 2025-09-19 + end: 2025-09-22 + sponsor: https://2025.pyconuk.org/sponsorship/ + mastodon: https://fosstodon.org/@PyConUK + sub: PY + location: + - title: PyCon UK 2025 + latitude: 53.4794892 + longitude: -2.2451148 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2025 + link: https://2025.pycon.org.au/ + cfp_link: https://2025.pycon.org.au/program/ + cfp: '2025-06-23 23:59:00' + timezone: Australia/Melbourne + place: Melbourne, Australia + start: 2025-09-12 + end: 2025-09-16 + sponsor: https://2025.pycon.org.au/sponsor/ + mastodon: https://mastodon.pycon.org.au/@pyconau + sub: PY + location: + - title: PyCon Australia 2025 + latitude: -37.8142454 + longitude: 144.9631732 + +- conference: PyCon India + year: 2025 + link: https://in.pycon.org/2025/ + cfp_link: https://cfp.in.pycon.org/2025/cfp + cfp: '2025-05-18 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, India + start: 2025-09-12 + end: 2025-09-15 + sponsor: https://in.pycon.org/2025/sponsors/ + mastodon: https://fosstodon.org/@pyconindia + sub: PY + location: + - title: PyCon India 2025 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCamp Czechia + year: 2025 + link: https://pycamp.cz/ + cfp: None + place: Třeštice, Czechia + start: 2025-09-12 + end: 2025-09-14 + sub: CAMP + location: + - title: PyCamp Czechia 2025 + latitude: 49.2457818 + longitude: 15.4508988 + +- conference: PyCon Israel + year: 2025 + link: https://pycon.org.il/2025/ + cfp_link: https://cfp.pycon.org.il/pycon-2025/cfp + cfp: '2025-05-01 23:59:00' + timezone: Asia/Jerusalem + place: Cinema City, Israel + start: 2025-09-09 + end: 2025-09-09 + mastodon: https://tooot.im/@pyconil/ + sub: PY + location: + - title: PyCon Israel 2025 + latitude: 31.9838307 + longitude: 34.7699754 + +- conference: DjangoCon US + year: 2025 + link: https://2025.djangocon.us/ + cfp_link: https://pretalx.com/djangocon-us-2025/cfp + cfp: '2025-04-27 12:00:00' + timezone: America/Chicago + place: Chicago, USA + start: 2025-09-08 + end: 2025-09-12 + mastodon: https://fosstodon.org/@djangocon + sub: WEB + location: + - title: DjangoCon US 2025 + latitude: 41.8755616 + longitude: -87.6244212 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2025 + link: https://tw.pycon.org/2025/ + cfp_link: https://tw.pycon.org/2025/en-us/speaking/cfp + cfp: '2025-04-05 23:59:59' + place: Taiwan + start: 2025-09-05 + end: 2025-09-07 + sponsor: https://tw.pycon.org/2024/en-us/sponsor + finaid: https://tw.pycon.org/2024/en-us/registration/financial-aid + sub: PY + location: + - title: PyCon Taiwan 2025 + latitude: 22.6203348 + longitude: 120.3120375 + +- conference: PyData Berlin + year: 2025 + link: https://pydata.org/berlin2025/ + cfp_link: https://cfp.pydata.org/berlin2025/cfp + cfp: '2025-05-04 23:59:59' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2025-09-01 + end: 2025-09-03 + twitter: pydataberlin + sub: DATA + location: + - title: PyData Berlin 2025 + latitude: 52.520778408127605 + longitude: 13.416401868537298 + +- conference: PyCon Greece + year: 2025 + link: https://2025.pycon.gr/en/ + cfp_link: https://pretalx.com/pycongr25/cfp + cfp: '2025-04-20 23:59:00' + timezone: Europe/Athens + place: Athens, Greece + start: 2025-08-29 + end: 2025-08-30 + sub: PY + location: + - title: PyCon Greece 2025 + latitude: 37.9755648 + longitude: 23.7348324 + +- conference: PyCon Kenya + year: 2025 + link: https://www.pycon.ke/ + cfp_link: https://sessionize.com/pycon-kenya-2025/ + cfp: '2025-06-22 23:59:59' + timezone: Africa/Nairobi + place: Nairobi, Kenia + start: 2025-08-28 + end: 2025-08-30 + sponsor: https://www.pycon.ke/sponsors + twitter: pythonairobi + sub: PY + location: + - title: PyCon Kenya 2025 + latitude: -1.2832533 + longitude: 36.8172449 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2025 + link: https://pl.pycon.org/2025/ + cfp_link: https://pyconpl.confreg.pl/events/40-pycon-pl-2025 + cfp: '2025-05-15 23:59:00' + cfp_ext: '2025-05-31 23:59:00' + place: Gliwice, Poland + start: 2025-08-28 + end: 2025-08-31 + sub: PY + location: + - title: PyCon Poland 2025 + latitude: 50.294113 + longitude: 18.6657306 + +- conference: PyCon Togo + year: 2025 + link: https://pycontg.pytogo.org/ + cfp_link: https://pycontg.pytogo.org/proposal + cfp: '2025-08-01 23:59:00' + timezone: Africa/Lome + place: Lome, Togo + start: 2025-08-23 + end: 2025-08-23 + sponsor: https://pycontg.pytogo.org/sponsor + sub: PY + location: + - title: PyCon Togo 2025 + latitude: 6.130419 + longitude: 1.215829 + +- conference: PyCon Latin America + alt_name: PyCon LatAm + year: 2025 + link: https://www.pylatam.org/ + cfp: '2024-05-30 23:59:00' + place: Puntarenas, Costa Rica + start: 2025-08-21 + end: 2025-08-24 + sub: PY + location: + - title: PyCon Latin America 2025 + latitude: 9.0953279 + longitude: -84.2003038 + +- conference: EuroSciPy + year: 2025 + link: https://euroscipy.org/2025/ + cfp_link: https://euroscipy.org/2025/program.html + cfp: '2025-03-31 23:59:00' + cfp_ext: '2025-04-28 23:59:00' + timezone: Europe/Warsaw + place: Krakow, Poland + start: 2025-08-18 + end: 2025-08-22 + sponsor: https://euroscipy.org/2025/sponsoring.html + twitter: euroSciPy + sub: SCIPY + location: + - title: EuroSciPy 2025 + latitude: 50.061389 + longitude: 19.938333 + +- conference: PyCon South Korea + alt_name: PyCon KR + year: 2025 + link: https://2025.pycon.kr/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLScNJaiMQkEGS9GypzCiAF_w8Z5KhPXxmUSyAJtjASS08_H9Ag/viewform + cfp: '2025-05-11 23:59:00' + timezone: Asia/Seoul + place: Seoul, South Korea + start: 2025-08-15 + end: 2025-08-17 + sponsor: https://2025.pycon.kr/sponsor/prospectus + sub: PY + location: + - title: PyCon South Korea 2025 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: PyCon Somalia + year: 2025 + link: https://pycon.org.so/ + cfp: None + place: Mogadishu, Somalia + start: 2025-08-13 + end: 2025-08-14 + twitter: PyconSomalia + sub: PY + location: + - title: PyCon Somalia 2025 + latitude: 2.0349312 + longitude: 45.3419183 + +- conference: DjangoCon Africa + year: 2025 + link: https://2025.djangocon.africa/ + cfp_link: https://pretalx.com/djangocon-africa-2025/cfp + cfp: '2025-03-31 23:59:00' + timezone: Africa/Dar_es_Salaam + place: Arusha, Tanzania + start: 2025-08-11 + end: 2025-08-15 + sponsor: https://2025.djangocon.africa/sponsor_us + finaid: https://2025.djangocon.africa/opportunity_grants + twitter: djcafrica + sub: WEB + location: + - title: DjangoCon Africa 2025 + latitude: -6.09994425 + longitude: 39.32094431715264 + +- conference: PyCon Uganda + year: 2025 + link: https://ug.pycon.org/ + cfp_link: https://ug.pycon.org/2025/talks/proposing_a_talk/ + cfp: '2025-06-30 23:59:00' + place: Kampala, Uganda + start: 2025-08-06 + end: 2025-08-10 + sponsor: https://ug.pycon.org/2025/sponsor-us/ + finaid: https://ug.pycon.org/2025/fin-aid/ + sub: PY + location: + - title: PyCon Uganda 2025 + latitude: 0.3177137 + longitude: 32.5813539 + +- conference: PyOhio + year: 2025 + link: https://pyohio.org/2025/ + cfp_link: https://pretalx.com/pyohio-2025/cfp + cfp: '2025-04-27 23:59:00' + timezone: America/New_York + place: Cleveland, USA + start: 2025-07-26 + end: 2025-07-27 + sponsor: https://www.pyohio.org/2025/PyOhio-2025-Sponsorship-Prospectus.pdf + sub: PY + location: + - title: PyOhio 2025 + latitude: 40.2253569 + longitude: -82.6881395 + +- conference: PyCon Russia + year: 2025 + link: https://www.pycon.ru/ + cfp_link: https://www.pycon.ru/cfp + cfp: '2025-05-15 23:59:00' + place: Moscow, Russia + start: 2025-07-25 + end: 2025-07-26 + sponsor: https://pycon.ru/partneram + sub: PY + location: + - title: PyCon Russia 2025 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: PyCon Portugal + year: 2025 + link: https://2025.pycon.pt/ + cfp_link: https://pretalx.evolutio.pt/pycon-portugal-2025/cfp + cfp: '2025-03-31 11:59:00' + timezone: Europe/Lisbon + place: Cascais, Portugal + start: 2025-07-24 + end: 2025-07-26 + sponsor: https://2025.pycon.pt/sponsors/sponsorship/ + finaid: https://2025.pycon.pt/information/grants/ + twitter: PyConPT + sub: PY + location: + - title: PyCon Portugal 2024 + latitude: 38.6968919 + longitude: -9.4204495 + +- conference: EuroPython + year: 2025 + link: https://ep2025.europython.eu/ + cfp: '2025-01-27 23:59:00' + timezone: UTC + place: Prague, Czechia + start: 2025-07-14 + end: 2025-07-20 + twitter: EuroPython + mastodon: https://fosstodon.org/@europython + sub: PY + location: + - title: EuroPython 2025 + latitude: 50.0874654 + longitude: 14.4212535 + +- conference: PyHEP.dev + alt_name: PyHEP + year: 2025 + link: https://indico.cern.ch/event/1515852/ + cfp: '2025-07-08 23:59:00' + place: Seattle, USA + start: 2025-07-14 + end: 2025-07-17 + sub: SCIPY + location: + - title: PyHEP.dev 2025 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: SciPy US + alt_name: SciPy + year: 2025 + link: https://www.scipy2025.scipy.org/ + cfp_link: https://cfp.scipy.org/scipy2025/cfp + cfp: '2025-02-26 23:59:00' + timezone: UTC + place: Tacoma, USA + start: 2025-07-07 + end: 2025-07-13 + sponsor: https://www.scipy2025.scipy.org/s/SciPy-2025-Sponsorship-Prospectus.pdf + mastodon: https://mastodon.social/@SciPyConf + sub: SCIPY + location: + - title: SciPy US 2025 + latitude: 47.2455013 + longitude: -122.438329 + +- conference: PyCon Colombia + year: 2025 + link: https://2025.pycon.co/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSeXZshPp4RhPh68c8PuaZ86lRVRThTlEoMkzgzvodN7TLheaQ/viewform?pli=1 + cfp: '2025-04-06 23:59:59' + timezone: America/Bogota + place: Medellín, Colombia + start: 2025-07-04 + end: 2025-07-06 + sponsor: https://2025.pycon.co/#/sponsors + twitter: PyConColombia + sub: PY + location: + - title: PyCon Colombia 2025 + latitude: 6.2443382 + longitude: -75.573553 + +- conference: Web Summer Camp + year: 2025 + link: https://websummercamp.com/ + cfp: '2025-03-15 23:59:00' + place: Opatija, Croatia + start: 2025-07-03 + end: 2025-07-05 + sub: WEB + location: + - title: Web Summer Camp 2025 + latitude: 45.3349238 + longitude: 14.3067834 + +- conference: PyCamp Leipzig + year: 2025 + link: https://barcamps.eu/python-barcamp-leipzig-2025/ + cfp_link: https://barcamps.eu/python-barcamp-leipzig-2025/sessions + cfp: None + place: Leipzig, Germany + start: 2025-06-21 + end: 2025-06-24 + sub: CAMP + location: + - title: PyCamp Leipzig 2025 + latitude: 51.3406321 + longitude: 12.3747329 + +- conference: Python Nordeste + year: 2025 + link: https://2025.pythonnordeste.org/ + cfp_link: https://talks.python.org.br/python-nordeste-2025/cfp + cfp: '2025-03-23 10:00:00' + timezone: America/Fortaleza + place: Teresina, Brazil + start: 2025-06-20 + end: 2025-06-22 + sponsor: https://2025.pythonnordeste.org/static/docs/sponsors-plan-en.pdf + sub: PY + location: + - title: Python Nordeste 2025 + latitude: -5.0874608 + longitude: -42.8049571 + +- conference: AfroPython Conf + year: 2025 + link: https://afropythonconf.org/ + cfp: None + place: Salvador, Brazil + start: 2025-06-07 + end: 2025-06-07 + sponsor: https://docs.google.com/forms/d/e/1FAIpQLScT25fVpVkQ18lzrvclcvGWkwe2vO0Cm4YiV8gV5X9_Q5pEyQ/viewform + twitter: AfroPython + sub: PY + location: + - title: AfroPython Conf 2023 + latitude: -5.7944777 + longitude: -35.2119324 + +- conference: PyData London + year: 2025 + link: https://pydata.org/london2025 + cfp_link: https://pydata.org/london2025/cfp#submit + cfp: '2025-02-24 23:59:00' + timezone: Europe/London + place: London, UK + start: 2025-06-06 + end: 2025-06-08 + sub: DATA + location: + - title: PyData London 2025 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: Python Norte + year: 2025 + link: https://2025.pythonnorte.org/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLScA5GtsphzUrkVqvIeOwjZ2utON8LVlM3pfjMXmhBRoclDFcg/viewform + cfp: '2025-05-22 23:59:00' + timezone: America/Fortaleza + place: Belém, Brazil + start: 2025-06-04 + end: 2025-06-06 + twitter: pythonnortebr + sub: PY + location: + - title: Python Norte 2025 + latitude: -1.438875529 + longitude: -48.4782039189 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2025 + link: https://2025.pycon.it/en + cfp_link: https://2025.pycon.it/en/call-for-proposals + cfp: '2025-01-06 23:59:00' + cfp_ext: '2025-01-11 23:59:00' + place: Bologna, Italy + start: 2025-05-28 + end: 2025-05-31 + sponsor: https://2025.pycon.it/en/sponsor + finaid: https://2025.pycon.it/en/grants-info/ + twitter: PyConIT + mastodon: https://social.python.it/@pycon + sub: PY + location: + - title: PyCon Italia 2025 + latitude: 44.4938203 + longitude: 11.3426327 + +- conference: PyCaxias + year: 2025 + link: https://pycaxias.com.br/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSeywxIgGFa6okFjhAPQrcD202ll-My_UMHhDunJBzs0FxHe9Q/ + cfp: '2025-03-31 23:59:00' + place: Caxias do Sul, Brazil + start: 2025-05-17 + end: 2025-05-17 + sponsor: https://pycaxias.com.br/theme/pdf/sponsorship_package.pdf + sub: PY,WEB + note: The 18th is a DjangoGirls workshop. + location: + - title: PyCaxias 2025 + latitude: -29.1685045 + longitude: -51.1796385 + +- conference: Flask Con + year: 2025 + link: https://flaskcon.com/2025/ + cfp_link: https://www.papercall.io/flaskcon-pyconus2025 + cfp: '2025-04-24 23:59:00' + timezone: America/New_York + place: Pittsburgh, USA + start: 2025-05-16 + end: 2025-05-16 + sub: WEB + note: Alongside PyCon US + location: + - title: Flask Con 2025 + latitude: 40.4416941 + longitude: -79.9900861 + +- conference: PyGrunn + year: 2025 + link: https://pygrunn.org/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSdjbpV9Ump8dcAKkN0R0hYpxd8-L5eyekvz3NxbtJLK1g-PPA + cfp: '2025-04-16 23:59:00' + place: Groningen, Netherlands + start: 2025-05-16 + end: 2025-05-16 + sponsor: https://pygrunn.org/#sponsoring + sub: PY + location: + - title: PyGrunn 2025 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: Piter Py + alt_name: PiterPy + year: 2025 + link: https://piterpy.com/en/ + cfp_link: https://piterpy.com/en/callforpapers/ + cfp: '2025-03-12 23:59:00' + place: Saint Petersburg, Russia + start: 2025-05-16 + end: 2025-05-17 + sub: PY + location: + - title: Piter Py 2025 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: PyCon US + year: 2025 + link: https://us.pycon.org/2025/ + cfp_link: https://pretalx.com/pyconus2025/ + cfp: '2024-12-19 23:59:00' + timezone: America/New_York + place: Pittsburgh, USA + start: 2025-05-14 + end: 2025-05-22 + sponsor: https://us.pycon.org/2025/sponsorship/why-sponsor/ + mastodon: https://fosstodon.org/@pycon + sub: PY + location: + - title: PyCon US 2025 + latitude: 40.4416941 + longitude: -79.9900861 + +- conference: Pytorch Day + year: 2025 + link: https://events.linuxfoundation.org/pytorch-day-france/ + cfp: None + place: Paris, France + start: 2025-05-06 + end: 2025-05-07 + sponsor: https://paris2025.gosim.org/sponsors/ + sub: DATA,DAY + location: + - title: Pytorch Day 2025 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyCamp España + year: 2025 + link: https://pycamp.es/ + cfp_link: https://docs.google.com/forms/d/1PpI3MstjIBH2e9J21UQaTHQLKTTEuR13od3iQkfJ8Zo/viewform + cfp: '2025-04-30 23:59:00' + place: Sevilla, Spain + start: 2025-05-01 + end: 2025-05-04 + twitter: pycampes + sub: CAMP + location: + - title: PyCamp España 2025 + latitude: 41.6147605 + longitude: 0.6267842 + +- conference: North Bay Python + year: 2025 + link: https://2025.northbaypython.org/ + cfp_link: https://pretalx.northbaypython.org/nbpy-2025/cfp + cfp: '2025-02-22 23:59:00' + place: Petaluma, USA + start: 2025-04-26 + end: 2025-04-27 + sponsor: https://2025.northbaypython.org/sponsor + mastodon: https://social.northbaypython.org/@NorthBayPython + sub: PY + location: + - title: North Bay Python 2025 + latitude: 38.2325829 + longitude: -122.636465 + +- conference: DjangoCon Europe + year: 2025 + link: https://2025.djangocon.eu/ + cfp_link: https://pretalx.evolutio.pt/djangocon-europe-2025/cfp + cfp: '2025-01-12 23:59:00' + place: Dublin, Ireland + start: 2025-04-23 + end: 2025-04-27 + sponsor: https://2025.djangocon.eu/sponsors/sponsorship/ + finaid: https://2025.djangocon.eu/information/grants/ + mastodon: https://fosstodon.org/@djangoconeurope/ + sub: WEB + location: + - title: DjangoCon Europe 2025 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Lithuania + alt_name: PyCon LT + year: 2025 + link: https://pycon.lt/2025 + cfp_link: https://pretalx.com/pycon-lithuania-2025/cfp + cfp: '2025-02-11 00:00:00' + timezone: Europe/Vilnius + place: Vilnius, Lithuania + start: 2025-04-23 + end: 2025-04-25 + sponsor: https://pycon.lt/2025/partnership + twitter: pyconlt + sub: PY + location: + - title: PyCon Lithuania 2025 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: PyCon Germany & PyData Conference + alt_name: PyCon Germany + year: 2025 + link: https://2025.pycon.de/ + cfp_link: https://pretalx.com/pyconde-pydata-2025/cfp + cfp: '2024-12-22 23:59:00' + cfp_ext: '2025-01-05 23:59:59' + timezone: Europe/Berlin + place: Darmstadt, Germany + start: 2025-04-23 + end: 2025-04-25 + sponsor: https://2025.pycon.de/sponsoring/ + finaid: https://2025.pycon.de/financial-aid/ + twitter: PyConDE + sub: PY,DATA + location: + - title: PyCon Germany & PyData Conference 2025 + latitude: 49.872775 + longitude: 8.651177 + +- conference: PyData Virginia + year: 2025 + link: https://pydata.org/virginia2025/ + cfp_link: https://pydata.org/virginia2025/call-for-proposals + cfp: '2025-02-10 23:59:00' + timezone: America/New_York + place: Charlottesville, USA + start: 2025-04-18 + end: 2025-04-19 + sponsor: https://pydata.org/virginia2025/sponsorship-opportunites + sub: DATA + location: + - title: PyData Virginia 2025 + latitude: 38.029306 + longitude: -78.4766781 + +- conference: PyTexas + year: 2025 + link: https://www.pytexas.org/2025/ + cfp_link: https://pretalx.com/pytexas-2025/ + cfp: '2024-12-01 23:59:00' + timezone: America/Chicago + place: Austin, USA + start: 2025-04-11 + end: 2025-04-13 + sponsor: https://www.pytexas.org/2025/sponsors/sponsor-us/ + finaid: https://www.pytexas.org/2025/attend/in-person/#grants + sub: PY + location: + - title: PyTexas 2025 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyCon Austria + alt_name: Python Conference Austria + year: 2025 + link: https://at.pycon.org/ + cfp_link: https://www.papercall.io/pycon-austria + cfp: '2025-03-15 13:00:00' + timezone: Europe/Vienna + place: Eisenstadt, Austria + start: 2025-04-06 + end: 2025-04-07 + sponsor: https://pycon25.uber.space/en/sponsor-information/ + sub: PY + location: + - title: PyCon Austria 2025 + latitude: 47.8454821 + longitude: 16.5249288 + +- conference: PyCamp Argentina + year: 2025 + link: https://pyar.discourse.group/t/pycamp-2025/1373 + cfp_link: https://pyar.discourse.group/t/propuestas-de-actividades-pycamp-2025/1386/3 + cfp: None + place: Baradero, Argentina + start: 2025-03-21 + end: 2025-03-24 + finaid: https://docs.google.com/forms/d/e/1FAIpQLSeZUex12ZrNqBPF65eeH0Hcc2hUNjE9HHZbCu6AGSLxJLARFA/viewform + sub: CAMP + location: + - title: PyCamp Argentina 2025 + latitude: -33.8120471 + longitude: -59.5051759 + +- conference: PyCon Asia Pacific + alt_name: PyCon Philippines + year: 2025 + link: https://pycon-apac.python.ph/ + cfp_link: https://pretalx.com/pycon-apac-2025/cfp + cfp: '2024-12-15 23:59:00' + timezone: Asia/Manila + place: Quezon City, Philippines + start: 2025-03-01 + end: 2025-03-02 + sponsor: https://docs.google.com/forms/d/e/1FAIpQLScay8a44Fvgc0IDJ0IuKlNZgxQKs1kA7ginxto60gW3cIK2Eg/viewform + sub: PY + location: + - title: PyCon Asia Pacific 2025 + latitude: 14.6510546 + longitude: 121.0486254 + +- conference: GeoPython + year: 2025 + link: https://2025.geopython.net/ + cfp_link: https://submit.geopython.net/geopython-2025/cfp + cfp: '2024-11-15 23:59:00' + place: Basel, Switzerland + start: 2025-02-24 + end: 2025-02-26 + twitter: GeoPythonConf + sub: GEO + location: + - title: GeoPython 2025 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2025 + link: https://na.pycon.org/ + cfp_link: https://pretalx.com/pycon-namibia-2025/cfp + cfp: '2024-11-17 23:59:00' + timezone: Africa/Windhoek + place: Windhoek, Namibia + start: 2025-02-24 + end: 2025-02-27 + twitter: PyConNA + mastodon: https://hachyderm.io/@PyConNA + sub: PY + location: + - title: PyCon Namibia 2025 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: DjangoCongress Japan + year: 2025 + link: https://djangocongress.jp/ + cfp: None + place: Tokyo, Japan + start: 2025-02-22 + end: 2025-02-22 + sub: WEB + location: + - title: DjangoCongress Japan 2025 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyConf Hyderabad + year: 2025 + link: https://2025.pyconfhyd.org/ + cfp_link: https://www.papercall.io/pyconfhyd2025 + cfp: '2025-01-13 23:30:00' + timezone: UTC + place: Hyderabad, India + start: 2025-02-22 + end: 2025-02-23 + sub: PY + location: + - title: PyConf Hyderabad 2025 + latitude: 17.4454957 + longitude: 78.34854697544472 + +- conference: Python BarCamp Karlsruhe + year: 2024 + link: https://barcamps.eu/python-barcamp-karlsruhe-2025/ + cfp: '2024-02-14 23:59:00' + place: Karlsruhe, Germany + start: 2025-02-15 + end: 2025-02-16 + sub: CAMP + location: + - title: Python BarCamp Karlsruhe 2025 + latitude: 49.0068705 + longitude: 8.4034195 + +- conference: PyCascades + year: 2025 + link: https://2025.pycascades.com/ + cfp_link: https://pretalx.com/pycascades-2025/cfp/ + cfp: '2024-09-15 23:59:00' + cfp_ext: '2024-09-20 23:59:00' + place: Portland, USA + start: 2025-02-08 + end: 2025-02-09 + sponsor: https://2025.pycascades.com/sponsors/become-a-sponsor/ + twitter: pyCascades + mastodon: https://fosstodon.org/@pycascades + sub: PY + location: + - title: PyCascades 2025 + latitude: 45.5202471 + longitude: -122.674194 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2025 + link: https://fosdem.org/2025/schedule/track/python/ + cfp_link: https://gist.github.com/malemburg/4f2d1ceeb24d26c35740390cf712af5e + cfp: '2024-12-01 23:59:00' + timezone: Europe/Brussels + place: Brussels, Belgium + start: 2025-02-02 + end: 2025-02-02 + sponsor: https://fosdem.org/2025/about/sponsors/ + sub: PY + location: + - title: FOSDEM 2025 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: SciPyData Japan + alt_name: SciPy Japan + year: 2025 + link: https://scipydata.connpass.com/ + cfp: None + timezone: Asia/Tokyo + place: Tokyo, Japan + start: 2025-01-25 + end: 2025-01-25 + sub: SCIPY,DATA + location: + - title: SciPyData Japan 2025 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Web + year: 2025 + link: https://www.pyconweb.com/ + cfp_link: https://www.papercall.io/pyconweb2025 + cfp: '2024-12-07 12:10:00' + timezone: UTC + place: Berlin, Germany + start: 2025-01-24 + end: 2025-01-25 + sponsor: https://www.pyconweb.com/sponsorship + twitter: PyconWeb + sub: WEB + location: + - title: PyCon Web 2025 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyLadiesCon + year: 2024 + link: https://conference.pyladies.com/ + cfp_link: https://pretalx.com/pyladiescon-2024/cfp + cfp: '2024-09-16 21:32:00' + place: Online + start: 2024-12-06 + end: 2024-12-08 + sponsor: https://conference.pyladies.com/sponsors/ + sub: PY + +- conference: PyCon Tanzania + alt_name: Python Tanzania Conference + year: 2024 + link: https://pycon.or.tz/ + cfp_link: https://pycon.or.tz/speak/ + cfp: '2024-11-12 23:59:00' + place: Dar Es Salaam, Tanzania + start: 2024-12-04 + end: 2024-12-05 + sponsor: https://pycon.or.tz/sponsor/ + sub: PY + location: + - title: PyCon Tanzania 2024 + latitude: -6.8160837 + longitude: 39.2803583 + +- conference: PyData Global + year: 2024 + link: https://pydata.org/global2024/ + cfp_link: https://pydata.org/global2024/call-for-proposals + cfp: '2024-10-07 23:59:00' + cfp_ext: '2024-10-14 23:59:00' + place: Online + start: 2024-12-03 + end: 2024-12-05 + sponsor: https://pydata.org/global2024/sponsor + sub: DATA + +- conference: PyCon Wroclaw + year: 2024 + link: https://www.pyconwroclaw.com/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLScFWuW0r_CaEF34G1X3HMNPpvhAQabJTWd-SN3ZA1q7NtTNCQ/viewform + cfp: '2024-09-15 23:59:00' + timezone: Europe/Warsaw + place: Wrocław, Poland + start: 2024-11-30 + end: 2024-11-30 + sponsor: https://www.pyconwroclaw.com/741a6adeabf18f0ce15c.pdf + sub: PY + location: + - title: PyCon Wroclaw 2024 + latitude: 51.11 + longitude: 17.0325 + +- conference: PyCon Chile + year: 2024 + link: https://pycon.cl/ + cfp_link: https://sessionize.com/pycon-2024/ + cfp: '2024-09-06 23:59:00' + timezone: America/Santiago + place: Santiago, Chile + start: 2024-11-30 + end: 2024-12-01 + sub: PY + note: Postponed from 2024-10-25 + location: + - title: PyCon Chile 2024 + latitude: -33.4377756 + longitude: -70.6504502 + +- conference: Plone Conference + year: 2024 + link: https://2024.ploneconf.org/en + cfp_link: https://talks.python.org.br/ploneconf2024/cfp + cfp: '2024-08-25 23:59:00' + place: Brasilia, Brazil + start: 2024-11-25 + end: 2024-12-01 + sponsor: https://2024.ploneconf.org/en/sponsors + twitter: ploneconf + mastodon: https://plone.social/@ploneconf + sub: WEB + location: + - title: Plone Conference 2024 + latitude: -10.3333333 + longitude: -53.2 + +- conference: PyCon China + year: 2024 + link: https://cn.pycon.org/2024/ + cfp: '2023-11-30 23:59:00' + place: Shanghai, China + start: 2024-11-23 + end: 2024-11-23 + sub: PY + location: + - title: PyCon China 2024 + latitude: 31.2323437 + longitude: 121.4691024 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2024 + link: https://2024.pycon.org.au/ + cfp_link: https://pretalx.com/pycon-au-2024/cfp + cfp: '2024-07-22 22:00:00' + timezone: Australia/Melbourne + place: Melbourne, Australia + start: 2024-11-22 + end: 2024-11-26 + sub: PY + location: + - title: PyCon Australia 2024 + latitude: -37.8142454 + longitude: 144.9631732 + +- conference: Xtreme Python + year: 2024 + link: https://xtremepython.dev/2024/ + cfp: '2024-08-30 23:59:00' + cfp_ext: '2024-09-20 23:59:00' + place: Online + start: 2024-11-19 + end: 2024-11-19 + sponsor: https://xtremepython.dev/2024/sponsors/ + sub: PY + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2024 + link: https://python.ie/ + cfp_link: https://sessionize.com/pycon-ireland-2024 + cfp: '2024-08-25 23:59:00' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2024-11-16 + end: 2024-11-16 + sub: PY + location: + - title: PyCon Ireland 2024 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2024 + link: https://pycon.hk/2024/ + cfp_link: https://pretalx.com/pyconhk2024/cfp + cfp: '2024-07-01 23:59:00' + cfp_ext: '2024-07-21 23:59:00' + timezone: Asia/Hong_Kong + place: Hong Kong, China + start: 2024-11-16 + end: 2024-11-16 + twitter: pyconhk + sub: PY + location: + - title: PyCon Hong Kong 2024 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon Mini Tokai + year: 2024 + link: https://tokai.pycon.jp/2024/ + cfp: None + place: Tokai, Japan + start: 2024-11-16 + end: 2024-11-16 + sponsor: https://docs.google.com/document/d/1uPNhbdBw1P2WcUvEllZWtXnjf1zTHys5lan8FT3p0MU/ + twitter: PyConTokai + sub: PY + location: + - title: PyCon Mini Tokai 2024 + latitude: 35.044082 + longitude: 136.90902 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2024 + link: https://www.pycon.se/ + cfp_link: https://pretalx.com/pyconse-2024/cfp + cfp: '2024-08-31 23:00:00' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2024-11-14 + end: 2024-11-15 + sponsor: https://www.pycon.se/#sponsorship + sub: PY + location: + - title: PyCon Sweden 2024 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyData NYC + year: 2024 + link: https://pydata.org/nyc2024/ + cfp: '2024-09-03 23:59:00' + timezone: America/New_York + place: New York, USA + start: 2024-11-06 + end: 2024-11-08 + sponsor: https://pydata.org/nyc2024/sponsorship-opportunites + finaid: https://docs.google.com/forms/d/e/1FAIpQLSdv0gkemT9Q-4O6D0b9By6VWSz_ZFvzSfH0jBphiIyXjwNX2g/closedform + sub: DATA + location: + - title: PyData NYC 2024 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyData Tel Aviv + year: 2024 + link: https://pydata.org/telaviv2024/ + cfp_link: https://pydata.org/telaviv2024/cfp + cfp: '2023-07-14 23:59:00' + timezone: Asia/Jerusalem + place: Tel Aviv, Israel + start: 2024-11-04 + end: 2024-11-04 + sponsor: https://pydata.org/telaviv2024/sponsor + twitter: PyDataTLV + sub: DATA + note: Postponed from 2023 + location: + - title: PyData Tel Aviv 2023 + latitude: 32.0852997 + longitude: 34.7818064 + +- conference: PyCon Zimbabwe + year: 2024 + link: https://zw.pycon.org/ + cfp_link: https://www.papercall.io/pyconzim2024 + cfp: '2024-07-31 00:00:00' + timezone: UTC + place: Harare, Zimbabwe + start: 2024-10-31 + end: 2024-11-02 + sponsor: https://zw.pycon.org/#sponsor + sub: PY + location: + - title: PyCon Zimbabwe 2024 + latitude: -17.8567035 + longitude: 31.0601584 + +- conference: PyCon France + alt_name: PyCon FR + year: 2024 + link: https://pycon.fr/2024/ + cfp_link: https://cfp.pycon.fr/pyconfr-2024/cfp + cfp: '2024-07-21 23:59:00' + timezone: Europe/Paris + place: Strasbourg, France + start: 2024-10-31 + end: 2024-11-03 + sponsor: https://pycon.fr/2024/fr/sponsors.html + finaid: https://www.pycon.fr/2024/fr/financial.html + twitter: PyConFR + mastodon: https://mamot.fr/@AFPy + sub: PY + location: + - title: PyCon France 2024 + latitude: 48.584614 + longitude: 7.7507127 + +- conference: PyCon Balkan + year: 2024 + link: https://pyconbalkan.com/ + cfp: Cancelled + place: Belgrade, Serbia + start: 2024-10-30 + end: 2024-11-01 + sponsor: https://pyconbalkan.com/wp-content/uploads/2024/06/PyCon-Balkan-2024-Sponsorship-Proposal.pdf + twitter: pyconblkn + sub: PY + note: Conference never went beyond announcement. + location: + - title: PyCon Balkan 2024 + latitude: 44.8178131 + longitude: 20.4568974 + +- conference: PyCon Asia Pacific + alt_name: PyCon Indonesia + year: 2024 + link: https://pycon.id/ + cfp: '2024-08-01 23:59:00' + place: Yogyakarta, Indonesia + start: 2024-10-25 + end: 2024-10-27 + sponsor: https://docs.google.com/forms/d/e/1FAIpQLSckkgXMyjHHUUuq8QdwPUEcwfoUuYrZEmAzErs2xo5YzbiufQ/viewform + sub: PY + note: Held at PyCon Indonesia + location: + - title: PyCon Asia Pacific 2024 + latitude: -7.9778383999999996 + longitude: 110.36722565020244 + +- conference: PyCon South Korea + alt_name: PyCon KR + year: 2024 + link: https://2024.pycon.kr/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSdXXxakv9IZa_Se9DQzG3Kf8qc_ADIlyyTS5h7r20ENSfD6MA/closedform + cfp: '2024-06-22 23:59:00' + place: Suwon, South Korea + start: 2024-10-25 + end: 2024-10-27 + sub: PY + location: + - title: PyCon South Korea 2024 + latitude: 37.2633325 + longitude: 127.0287472 + +- conference: Python Ho + alt_name: PythonHo Conference + year: 2024 + link: https://2024.pythonho.com/ + cfp_link: https://www.papercall.io/2024-pythonho-conference + cfp: '2024-09-24 11:22:33' + timezone: UTC + place: Ho, Ghana + start: 2024-10-25 + end: 2024-10-26 + sponsor: https://2024.pythonho.com/sponsors/sponsor-us/ + finaid: https://docs.google.com/forms/d/e/1FAIpQLSfjtg89elA0zgKHYn85kPFXcQJsliB0jhcqdQZR442kts21pQ/closedform + sub: PY + location: + - title: Python Ho 2024 + latitude: 6.6126598 + longitude: 0.4688932 + +- conference: PyDay Cali + year: 2024 + link: https://www.calidev.co/eventos/pyday/cali-2024/ + cfp: None + place: Cali, Colombia + start: 2024-10-19 + end: 2024-10-19 + sub: DAY + location: + - title: PyDay Cali 2024 + latitude: 3.4520339 + longitude: -76.5329352 + +- conference: Swiss Python Summit + year: 2024 + link: https://python-summit.ch/ + cfp_link: https://web.archive.org/web/20240415190539/https://www.python-summit.ch/cfp/ + cfp: '2024-06-30 23:59:00' + timezone: Europe/Zurich + place: Rapperswil, Switzerland + start: 2024-10-17 + end: 2024-10-18 + twitter: pythonsummit + sub: PY + location: + - title: Swiss Python Summit 2024 + latitude: 47.2266532 + longitude: 8.8164042 + +- conference: PyCon Portugal + year: 2024 + link: https://2024.pycon.pt/ + cfp_link: https://pretalx.evolutio.pt/pycon-portugal-2024/cfp + cfp: '2024-04-29 00:00:00' + cfp_ext: '2024-05-15 00:00:00' + timezone: Europe/Lisbon + place: Braga, Portugal + start: 2024-10-17 + end: 2024-10-19 + sponsor: https://2024.pycon.pt/sponsors/sponsorship/ + sub: PY + location: + - title: PyCon Portugal 2024 + latitude: 41.5510583 + longitude: -8.4280045 + +- conference: Python Brasil + alt_name: PythonBrasil + year: 2024 + link: https://2024.pythonbrasil.org.br/ + cfp_link: https://talks.python.org.br/pythonbrasil-2024/cfp + cfp: '2024-08-10 23:59:00' + timezone: America/Sao_Paulo + place: Rio de Janeiro, Brazil + start: 2024-10-16 + end: 2024-10-21 + sponsor: https://2024.pythonbrasil.org.br/theme/media_kits/sponsorship-proposal-pybr-2024.pdf + twitter: PythonBrasil + sub: PY + location: + - title: Python Brasil 2024 + latitude: -22.9110137 + longitude: -43.2093727 + +- conference: PyCon Panamá + year: 2024 + link: https://pycon.pa/2024/ + cfp: None + place: Panama City, Panamá + start: 2024-10-16 + end: 2024-10-18 + twitter: pythonpanama + sub: PY + location: + - title: PyCon Panamá 2024 + latitude: 8.9714493 + longitude: -79.5341802 + +- conference: Python in Education Day + year: 2024 + link: https://scienceoxford.com/python-in-education-day/ + cfp_link: https://web.archive.org/web/20240729170104/https://www.surveymonkey.com/r/PythonInEducationDay + cfp: '2024-08-31 23:59:00' + place: Oxford, UK + start: 2024-10-14 + end: 2024-10-14 + twitter: ScienceOxford + sub: DAY + location: + - title: Python in Education Day 2024 + latitude: 51.7520131 + longitude: -1.2578499 + +- conference: PyCon MEA + alt_name: PyCon MEA & Data Science + year: 2024 + link: https://globaldevslam.com/ + cfp: '2024-05-31 23:59:00' + timezone: Asia/Dubai + place: Dubai, United Arab Emirates + start: 2024-10-14 + end: 2024-10-18 + twitter: GlobalDevSlam + sub: PY + location: + - title: PyCon MEA 2024 + latitude: 25.074282349999997 + longitude: 55.18853865430702 + +- conference: PyCon Netherlands + alt_name: PyCon NL + year: 2024 + link: https://nl.pycon.org/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSe6ZmARu1Vfj-th4nIHYiIqzzwLio3wY7e8nM3GQ-52d2kDrQ/closedform + cfp: '2024-07-31 23:59:00' + place: Utrecht, Netherlands + start: 2024-10-10 + end: 2024-10-10 + sub: PY + location: + - title: PyCon Netherlands 2024 + latitude: 52.090833 + longitude: 5.121667 + +- conference: PyCon Uganda + year: 2024 + link: https://ug.pycon.org/2024 + cfp_link: https://www.papercall.io/pyconug + cfp: '2024-04-30 23:59:00' + tutorial_deadline: '2024-04-30 23:59:00' + place: Kampala, Uganda + start: 2024-10-09 + end: 2024-10-13 + sponsor: https://ug.pycon.org/2024/sponsors + sub: PY + location: + - title: PyCon Uganda 2024 + latitude: 0.3177137 + longitude: 32.5813539 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2024 + link: https://2024.es.pycon.org/ + cfp_link: https://2024.es.pycon.org/c4p/ + cfp: '2024-05-31 21:00:00' + tutorial_deadline: '2024-05-31 23:59:00' + timezone: Europe/Madrid + place: Vigo, Spain + start: 2024-10-04 + end: 2024-10-06 + sponsor: https://2024.es.pycon.org/patrocinios/ + sub: PY + location: + - title: PyCon Spain 2024 + latitude: 42.240599 + longitude: -8.720727 + +- conference: Django Day Copenhagen + year: 2024 + link: https://2024.djangoday.dk/ + cfp_link: https://2024.djangoday.dk/cfp/ + cfp: '2023-08-31 23:59:59' + timezone: Europe/Copenhagen + place: Copenhagen, Denmark + start: 2024-10-04 + end: 2024-10-04 + twitter: djangodenmark + mastodon: https://fosstodon.org/@djangodenmark + sub: WEB,DAY + location: + - title: Django Day Copenhagen 2024 + latitude: 55.6867243 + longitude: 12.5700724 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2024 + link: https://za.pycon.org/ + cfp_link: https://za.pycon.org/talks/how-to-submit-a-talk/ + cfp: '2024-08-18 23:59:00' + tutorial_deadline: '2024-08-18 23:59:00' + timezone: Africa/Johannesburg + place: Rondebosch, South Africa + start: 2024-10-02 + end: 2024-10-06 + twitter: PyConZA + mastodon: https://fosstodon.org/@PyConZA + sub: PY + location: + - title: PyCon South Africa 2024 + latitude: -33.9680556 + longitude: 18.4877778 + +- conference: PyCon Niger + year: 2024 + link: https://ne.pycon.org/ + cfp_link: https://ne.pycon.org/speaking + cfp: '2024-07-30 23:59:00' + place: Niamey, Niger + start: 2024-09-28 + end: 2024-09-29 + twitter: pythonniger + sub: PY + location: + - title: PyCon Niger 2024 + latitude: 13.515 + longitude: 2.1175 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2024 + link: https://2024.pycon.jp/ja + cfp_link: https://pretalx.com/pyconjp2024/cfp + cfp: '2024-05-31 23:59:00' + place: Tokyo, Japan + start: 2024-09-27 + end: 2024-09-29 + twitter: pyconjapan + sub: PY + location: + - title: PyCon Japan 2024 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: Python Norte + year: 2024 + link: https://2024.pythonnorte.org/ + cfp: None + place: Itacoatiara, Brazil + start: 2024-09-27 + end: 2024-09-28 + twitter: pynorte + sub: PY + location: + - title: Python Norte 2024 + latitude: -3.1477898 + longitude: -58.4461041 + +- conference: Piter Py + alt_name: PiterPy + year: 2024 + link: https://piterpy.com/en/ + cfp: '2024-06-01 23:59:00' + place: Saint Petersburg, Russia + start: 2024-09-26 + end: 2024-09-27 + sub: PY + location: + - title: Piter Py 2024 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: PyConf Mini Davao + alt_name: PyCon Davao + year: 2024 + link: https://pyconf-mini-2024.durianpy.org/ + cfp: None + place: Davao City, Philippines + start: 2024-09-26 + end: 2024-09-26 + sponsor: https://pyconf-mini-2024.durianpy.org/prospectus + sub: PY + location: + - title: PyConf Mini Davao 2024 + latitude: 7.0648306 + longitude: 125.6080623 + +- conference: PyData Paris + year: 2024 + link: https://pydata.org/paris2024/ + cfp_link: https://pydata.org/paris2024/cfp/ + cfp: '2024-04-08 23:59:00' + place: Paris, France + start: 2024-09-25 + end: 2024-09-26 + sponsor: https://pydata.org/paris2024/sponsorship-opportunites + twitter: PyDataParis + sub: DATA + location: + - title: PyData Paris 2024 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyCon Africa + year: 2024 + link: https://africa.pycon.org/2024/ + cfp_link: https://africa.pycon.org/2024/talks/speaking/ + cfp: '2024-07-08 23:59:00' + tutorial_deadline: '2024-07-08 23:59:00' + place: Accra, Ghana + start: 2024-09-24 + end: 2024-09-28 + sponsor: https://africa.pycon.org/2024/sponsor-us/ + twitter: pyconafrica + mastodon: https://mastodon.social/@pyconafrica + sub: PY + location: + - title: PyCon Africa 2024 + latitude: 5.5571096 + longitude: -0.2012376 + +- conference: DjangoCon US + year: 2024 + link: https://2024.djangocon.us/ + cfp_link: https://2024.djangocon.us/speaking/ + cfp: '2024-04-24 12:00:00' + timezone: America/New_York + place: Durham, USA + start: 2024-09-22 + end: 2024-09-27 + finaid: https://2024.djangocon.us/opportunity-grants/ + twitter: DjangoCon + mastodon: https://fosstodon.org/@djangocon + sub: WEB + location: + - title: DjangoCon US 2024 + latitude: 42.240599 + longitude: -8.720727 + +- conference: PyBay + year: 2024 + link: https://pybay.org/ + cfp_link: https://pybay.org/speaking/ + cfp: '2024-07-31 23:59:00' + place: San Franciso, USA + start: 2024-09-21 + end: 2024-09-21 + sponsor: https://pybay.org/sponsors/sponsor-us/ + mastodon: https://fosstodon.org/@pybay + sub: PY + location: + - title: PyBay 2024 + latitude: 38.676839 + longitude: -90.2497213 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2024 + link: https://tw.pycon.org/2024/en-us + cfp_link: https://tw.pycon.org/2024/en-us/speaking/cfp + cfp: '2024-04-08 23:59:00' + tutorial_deadline: '2024-04-08 23:59:00' + place: Kaohsiung, Taiwan + start: 2024-09-21 + end: 2024-09-22 + sponsor: https://tw.pycon.org/2024/en-us/sponsor + finaid: https://tw.pycon.org/2024/en-us/registration/financial-aid + sub: PY + location: + - title: PyCon Taiwan 2024 + latitude: 22.6203348 + longitude: 120.3120375 + +- conference: PyCon India + year: 2024 + link: https://in.pycon.org/2024/ + cfp_link: https://in.pycon.org/cfp/2024/proposals/ + cfp: '2024-05-31 23:59:00' + tutorial_deadline: '2024-05-31 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, India + start: 2024-09-20 + end: 2024-09-23 + sponsor: https://in.pycon.org/2024/prospectus.pdf + twitter: PyConIndia + sub: PY + location: + - title: PyCon India 2024 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon Latin America + alt_name: PyCon Latam + year: 2024 + link: https://www.pylatam.org/ + cfp_link: https://web.archive.org/web/20240524062206/https://www.papercall.io/pyconlatam24 + cfp: '2024-06-10 23:59:00' + tutorial_deadline: '2024-06-10 23:59:00' + place: Mazatlan, Mexico + start: 2024-09-19 + end: 2024-09-21 + sponsor: https://web.archive.org/web/20240607024356/https://docs.google.com/presentation/d/12_iPvHdtR5islMlL-76Xja2GK0IMccL8/edit + sub: PY + location: + - title: PyCon Latin America 2024 + latitude: 23.2035785 + longitude: -106.4208391 + +- conference: PyTorch Conference + year: 2024 + link: https://events.linuxfoundation.org/pytorch-conference/ + cfp_link: https://sessionize.com/pytorch2024/ + cfp: '2024-06-09 23:59:00' + timezone: America/Los_Angeles + place: San Francisco, USA + start: 2024-09-18 + end: 2024-09-19 + sponsor: https://events.linuxfoundation.org/pytorch-conference/sponsor/ + finaid: https://events.linuxfoundation.org/pytorch-conference/attend/scholarships-travel-funding/ + sub: DATA + location: + - title: PyTorch Conference 2024 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyData Amsterdam + year: 2024 + link: https://amsterdam.pydata.org/ + cfp: '2024-05-19 23:59:00' + cfp_ext: '2024-06-02 23:59:00' + timezone: Europe/Amsterdam + place: Amsterdam, Netherlands + start: 2024-09-18 + end: 2024-09-20 + sponsor: https://amsterdam.pydata.org/sponsor/ + sub: DATA + location: + - title: PyData Amsterdam 2024 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: PyCon Israel + year: 2024 + link: https://pycon.org.il/2024/ + cfp: '2024-06-01 23:59:00' + timezone: Asia/Jerusalem + place: Gelilot, Israel + start: 2024-09-16 + end: 2024-09-16 + twitter: PyConIL + sub: PY + location: + - title: PyCon Israel 2024 + latitude: 32.13655705 + longitude: 34.80366518770497 + +- conference: Python Sul + alt_name: Python Sul (Brazil) + year: 2024 + link: https://sul.python.org.br/ + cfp_link: https://talks.python.org.br/pythonsul-2024/cfp + cfp: '2024-05-12 23:59:00' + cfp_ext: '2024-05-31 23:59:00' + timezone: America/Sao_Paulo + place: Florianópolis, Brazil + start: 2024-09-13 + end: 2024-09-15 + sponsor: https://bit.ly/sponsorship-pysul24 + sub: PY + location: + - title: Python Sul 2024 + latitude: -27.5973002 + longitude: -48.5496098 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2024 + link: https://pycon.ee/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSe-OUSgBSYweCMPCAv-1pYXscGK9T7npoP77Dk17LtvQsynwQ/closedform + cfp: '2024-04-15 23:59:00' + timezone: Europe/Tallinn + place: Tallinn, Estonia + start: 2024-09-05 + end: 2024-09-06 + twitter: PyConEstonia + sub: PY + location: + - title: PyCon Estonia 2024 + latitude: 59.4372155 + longitude: 24.7453688 + +- conference: EARL + year: 2024 + link: https://datacove.co.uk/earl-2024-tech-conference/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSf7QY-VFFWB5FtKl3dENcNSDnzhvqS2GL43bv6GjKCyYIrHKw/viewform + cfp: '2024-03-31 23:59:00' + timezone: Europe/Zurich + place: Brighton, UK + start: 2024-09-04 + end: 2024-09-05 + sub: BIZ + location: + - title: EARL 2024 + latitude: 50.8214626 + longitude: -0.1400561 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2024 + link: https://pl.pycon.org/2024/ + cfp_link: https://pl.pycon.org/2024/call-for-proposals/ + cfp: '2024-08-13 23:59:00' + cfp_ext: '2024-08-20 23:59:00' + timezone: Europe/Warsaw + place: Gliwice, Poland + start: 2024-08-29 + end: 2024-09-01 + sponsor: https://pl.pycon.org/2024/en/sponsorzy/ + sub: PY + location: + - title: PyCon Poland 2024 + latitude: 50.294113 + longitude: 18.6657306 + +- conference: PyCon Somalia + year: 2024 + link: https://pycon.org.so/ + cfp: '2024-07-25 23:59:00' + place: Mogadishu, Somalia + start: 2024-08-28 + end: 2024-08-29 + sub: PY + note: Originally planned for August 21-22, 2024 + location: + - title: PyCon Somalia 2024 + latitude: 2.0349312 + longitude: 45.3419183 + +- conference: EuroSciPy + year: 2024 + link: https://euroscipy.org/2024/ + cfp_link: https://euroscipy.org/2024/program.html + cfp: '2024-05-26 23:59:59' + cfp_ext: '2024-06-09 23:59:59' + tutorial_deadline: '2024-06-02 23:59:00' + timezone: Europe/Warsaw + place: Szczecin, Poland + start: 2024-08-26 + end: 2024-08-30 + sponsor: https://euroscipy.org/2024/sponsoring.html + finaid: https://euroscipy.org/2024/finaid.html + twitter: euroSciPy + sub: SCIPY + location: + - title: EuroSciPy 2024 + latitude: 53.42968095 + longitude: 14.592912670292268 + +- conference: PyHEP.dev + alt_name: PyHEP + year: 2024 + link: https://indico.cern.ch/event/1375573/ + cfp: '2024-06-25 05:59:00' + timezone: Europe/Brussels + place: Aachen, Germany + start: 2024-08-26 + end: 2024-08-30 + sub: SCIPY + location: + - title: PyHEP.dev 2024 + latitude: 50.776351 + longitude: 6.083862 + +- conference: PyCon Malaysia + alt_name: PyCon MY + year: 2024 + link: https://web.archive.org/web/20240815232138/https://www.pycon.my/ + cfp: '2024-06-30 23:59:00' + timezone: Asia/Kuala_Lumpur + place: Petaling Jaya, Malaysia + start: 2024-08-24 + end: 2024-08-25 + twitter: pyconmy + sub: PY + location: + - title: PyCon Malaysia 2024 + latitude: 3.0988792 + longitude: 101.6454202 + +- conference: Kiwi PyCon + alt_name: Kiwi PyCon XIII + year: 2024 + link: https://kiwipycon.nz/ + cfp_link: https://kiwipycon.nz/present/submitting-a-talk + cfp: '2024-05-23 23:59:00' + timezone: Pacific/Auckland + place: Te Whanganui-a-Tara Wellington, New Zealand + start: 2024-08-23 + end: 2024-08-25 + sponsor: https://kiwipycon.nz/sponsors/become-a-sponsor + finaid: https://kiwipycon.nz/attend/financial-aid + twitter: kiwipycon + mastodon: https://mastodon.social/@kiwipycon + sub: PY + location: + - title: Kiwi PyCon 2024 + latitude: -41.2887953 + longitude: 174.7772114 + +- conference: Python Nordeste + year: 2024 + link: https://2024.pythonnordeste.org/ + cfp_link: https://even3.com.br/python-nordeste-2024/ + cfp: '2024-03-04 23:59:00' + place: Natal, Brazil + start: 2024-08-09 + end: 2024-08-11 + sponsor: https://drive.google.com/file/d/1WvfelX-Sfp79YcUbf8Hs6e-MtPabVSmO/view + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2024 + latitude: -5.7944777 + longitude: -35.2119324 + +- conference: PyData Vermont + year: 2024 + link: https://pydata.org/vermont2024/ + cfp_link: https://pydata.org/vermont2024/call-for-proposals + cfp: '2024-04-26 23:59:00' + cfp_ext: '2024-05-03 23:59:00' + timezone: America/New_York + place: Burlington, USA + start: 2024-07-29 + end: 2024-07-30 + sponsor: https://pydata.org/vermont2024/sponsorship-opportunities + sub: DATA + location: + - title: PyData Vermont 2024 + latitude: 43.3248924 + longitude: -79.7966835 + +- conference: PyOhio + year: 2024 + link: https://pyohio.org/2024/ + cfp_link: https://www.pyohio.org/2024/speaking/cfp/ + cfp: '2024-05-20 23:59:00' + cfp_ext: '2024-05-27 23:59:00' + place: Cleveland, USA + start: 2024-07-27 + end: 2024-07-28 + sponsor: https://www.pyohio.org/2024/sponsors/prospectus/ + sub: PY + location: + - title: PyOhio 2024 + latitude: 41.4996574 + longitude: -81.6936772 + +- conference: PyCon Russia + year: 2024 + link: https://www.pycon.ru/ + cfp: '2024-05-15 23:59:00' + place: Moscow, Russia + start: 2024-07-26 + end: 2024-07-27 + sub: PY + location: + - title: PyCon Russia 2024 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: PyData Eindhoven + alt_name: PyData EHV + year: 2024 + link: https://pydata.org/eindhoven2024 + cfp_link: https://pydata.org/eindhoven2024/call-for-proposals + cfp: '2024-05-13 23:59:00' + timezone: Europe/Amsterdam + place: Eindhoven, Netherlands + start: 2024-07-11 + end: 2024-07-11 + sponsor: https://pydata.org/eindhoven2024/sponsorship-opportunities + sub: DATA + location: + - title: PyData Eindhoven 2024 + latitude: 51.4383999131 + longitude: 5.46712979814 + +- conference: PyCon Nigeria + year: 2024 + link: https://ng.pycon.org/ + cfp: '2024-03-10 23:59:00' + place: Lagos, Nigeria + start: 2024-07-10 + end: 2024-07-13 + sub: PY + location: + - title: PyCon Nigeria 2024 + latitude: 6.4550575 + longitude: 3.3941795 + +- conference: EuroPython + year: 2024 + link: https://ep2024.europython.eu/ + cfp_link: https://ep2024.europython.eu/cfp/ + cfp: '2024-03-06 23:59:00' + place: Prague, Czechia + start: 2024-07-08 + end: 2024-07-14 + sponsor: https://ep2024.europython.eu/sponsor + finaid: https://ep2024.europython.eu/finaid/ + twitter: EuroPython + mastodon: https://fosstodon.org/@europython + sub: PY + location: + - title: EuroPython 2024 + latitude: 50.0874654 + longitude: 14.4212535 + +- conference: SciPy US + alt_name: SciPy + year: 2024 + link: https://web.archive.org/web/20240705165737/https://www.scipy2024.scipy.org/ + cfp_link: https://cfp.scipy.org/2024/cfp + cfp: '2024-02-27 23:59:00' + timezone: America/Los_Angeles + place: Tacoma, USA + start: 2024-07-08 + end: 2024-07-14 + twitter: SciPyConf + sub: SCIPY + location: + - title: SciPy US 2024 + latitude: 47.2455013 + longitude: -122.438329 + +- conference: PyHEP + year: 2024 + link: https://indico.cern.ch/event/1384010/ + cfp: '2024-06-05 21:29:00' + place: Online + start: 2024-07-01 + end: 2024-07-04 + sub: PY + +- conference: North Bay Python + year: 2024 + link: https://2024.northbaypython.org/ + cfp: '2024-04-12 23:59:00' + place: Petaluma, USA + start: 2024-06-29 + end: 2024-06-30 + twitter: northbaypython + mastodon: https://social.northbaypython.org/@NorthBayPython + sub: PY + location: + - title: North Bay Python 2024 + latitude: 38.2325829 + longitude: -122.636465 + +- conference: PyCamp Argentina + year: 2024 + link: https://pyar.discourse.group/t/pycamp-2024/1252 + cfp_link: https://pyar.discourse.group/t/propuestas-de-actividades-pycamp-2024/1297 + cfp: None + place: Riachuelo, Argentina + start: 2024-06-20 + end: 2024-06-23 + finaid: https://docs.google.com/forms/d/e/1FAIpQLSeobYsoQsp0NdC769bBJGDFh2FMrdw0kiU1dq1Tn_HIdWZqrQ/viewform + sub: CAMP + location: + - title: PyCamp Argentina 2024 + latitude: -34.694496599999994 + longitude: -58.45183581327579 + +- conference: Wagtail Space US + year: 2024 + link: https://us.wagtail.space/ + cfp_link: https://us.wagtail.space/#speak + cfp: '2024-04-22 23:59:00' + timezone: America/New_York + place: Philadelphia, USA + start: 2024-06-20 + end: 2024-06-22 + sponsor: https://us.wagtail.space/#sponsors + twitter: WagtailCMS + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space US 2024 + latitude: 39.9533 + longitude: -75.198 + +- conference: PyData London + year: 2024 + link: https://pydata.org/london2024/ + cfp_link: https://pydata.org/london2024/cfp#submit + cfp: '2024-03-04 23:59:00' + timezone: Europe/London + place: London, UK + start: 2024-06-14 + end: 2024-06-16 + sponsor: https://pydata.org/london2024/sponsor + twitter: PyDataLondon + sub: DATA + location: + - title: PyData London 2024 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyDay Valparaiso + year: 2024 + link: https://www.pyday.cl/valparaiso.html + cfp_link: https://sessionize.com/pyday-2024/ + cfp: '2024-05-24 23:59:00' + place: Valparaiso, Chile + start: 2024-06-14 + end: 2024-06-14 + sub: DAY + location: + - title: PyDay Valparaiso 2024 + latitude: -33.0458456 + longitude: -71.6196749 + +- conference: PyDay Copiapó + year: 2024 + link: https://www.pyday.cl/copiapo.html + cfp_link: https://sessionize.com/pyday-2024/ + cfp: '2024-05-24 23:59:00' + place: Copiapó, Chile + start: 2024-06-12 + end: 2024-06-12 + sub: DAY + location: + - title: PyDay Copiapó 2024 + latitude: -27.5406034 + longitude: -70.4441348 + +- conference: Wagtail Space Netherlands + year: 2024 + link: https://nl.wagtail.space/ + cfp_link: https://nl.wagtail.space/call-for-participation + cfp: '2024-03-08 23:59:00' + timezone: Europe/Amsterdam + place: Arnhem, Netherlands + start: 2024-06-12 + end: 2024-06-14 + sponsor: https://nl.wagtail.space/sponsors + twitter: WagtailCMS + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space Netherlands 2024 + latitude: 51.984257 + longitude: 5.9108573 + +- conference: PyCon Colombia + year: 2024 + link: https://2024.pycon.co/en + cfp_link: https://2024.pycon.co/en/call-for-proposals + cfp: '2024-03-11 23:59:59' + timezone: America/Bogota + place: Medellín, Colombia + start: 2024-06-07 + end: 2024-06-09 + twitter: PyConColombia + sub: PY + location: + - title: PyCon Colombia 2024 + latitude: 6.2443382 + longitude: -75.573553 + +- conference: BelPy + year: 2024 + link: https://belpy.in/ + cfp_link: https://web.archive.org/web/20240407222727/https://www.papercall.io/belpy2024 + cfp: '2024-04-14 19:18:00' + timezone: UTC + place: Belagavi, India + start: 2024-06-06 + end: 2024-06-08 + twitter: Belpy2021 + sub: PY + location: + - title: BelPy 2024 + latitude: 15.8572666 + longitude: 74.5069343 + +- conference: DjangoCon Europe + year: 2024 + link: https://2024.djangocon.eu/ + cfp_link: https://2024.djangocon.eu/talks/cfp/ + cfp: '2024-02-29 23:59:00' + timezone: Europe/Madrid + place: Vigo, Spain + start: 2024-06-05 + end: 2024-06-09 + sponsor: https://2024.djangocon.eu/sponsors/sponsorship/ + finaid: https://2024.djangocon.eu/information/grants/ + twitter: DjangoConEurope + mastodon: https://fosstodon.org/@djangoconeurope + sub: WEB + location: + - title: DjangoCon Europe 2024 + latitude: 42.240599 + longitude: -8.720727 + +- conference: GeoPython + year: 2024 + link: https://2024.geopython.net/ + cfp_link: https://submit.geopython.net/geopython-2024/cfp + cfp: '2024-01-23 00:59:00' + timezone: Europe/Zurich + place: Basel, Switzerland + start: 2024-05-27 + end: 2024-05-29 + twitter: GeoPythonConf + sub: GEO + location: + - title: GeoPython 2024 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: PyCon KyuShu + year: 2024 + link: https://web.archive.org/web/20240509142117/https://kyushu.pycon.jp/2024/ + cfp: '2024-03-31 23:59:00' + place: Kagoshima, Japan + start: 2024-05-25 + end: 2024-05-25 + sub: PY + location: + - title: PyCon KyuShu 2024 + latitude: 31.521587 + longitude: 130.5474077 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2024 + link: https://pycon.it/en + cfp_link: https://2024.pycon.it/cfp + cfp: '2024-01-06 23:59:00' + cfp_ext: '2024-01-15 23:59:00' + place: Florence, Italy + start: 2024-05-22 + end: 2024-05-25 + sponsor: https://2024.pycon.it/en/sponsor + twitter: PyConIT + mastodon: https://social.python.it/@pycon + sub: PY + location: + - title: PyCon Italia 2024 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: Flask Con + year: 2024 + link: https://flaskcon.com/2024/ + cfp: '2024-04-17 23:59:00' + place: Pittsburgh, USA + start: 2024-05-17 + end: 2024-05-17 + sub: WEB + note: Alongside PyCon US 2024 + location: + - title: Flask Con 2024 + latitude: 40.4416941 + longitude: -79.9900861 + +- conference: PyGrunn + year: 2024 + link: https://pygrunn.org/ + cfp_link: https://forms.gle/AXzpAA9KyFaR9VHx8 + cfp: '2024-04-07 23:59:00' + place: Groningen, Netherlands + start: 2024-05-17 + end: 2024-05-17 + sponsor: https://pygrunn.org/#sponsoring + twitter: pygrunn + sub: PY + location: + - title: PyGrunn 2024 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyCon US + year: 2024 + link: https://us.pycon.org/2024/ + cfp_link: https://us.pycon.org/2024/speaking/guidelines/ + cfp: '2023-12-18 23:59:00' + timezone: America/New_York + place: Pittsburgh, USA + start: 2024-05-15 + end: 2024-05-23 + sponsor: https://us.pycon.org/2024/sponsorship/why-sponsor/ + twitter: pycon + mastodon: https://fosstodon.org/@pycon + sub: PY + location: + - title: PyCon US 2024 + latitude: 40.4416941 + longitude: -79.9900861 + +- conference: Python Niger + alt_name: Launching Python Niger + year: 2024 + link: https://web.archive.org/web/20240420231013/https://fb.me/e/8alLCsc39 + cfp: None + place: Maradi, Niger Republic + start: 2024-04-28 + end: 2024-04-28 + sub: PY + location: + - title: Python Niger 2024 + latitude: 13.1277068 + longitude: 7.2601319 + +- conference: PyCon Germany & PyData Berlin + alt_name: PyCon DE & PyData Berlin + year: 2024 + link: https://pycon.de/ + cfp_link: https://pretalx.com/pyconde-pydata-2024/cfp + cfp: '2023-12-22 23:59:59' + cfp_ext: '2024-01-07 23:59:59' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2024-04-22 + end: 2024-04-24 + sponsor: https://2024.pycon.de/sponsors/ + finaid: https://2024.pycon.de/financial-aid/ + twitter: PyConDE + sub: PY,DATA + location: + - title: PyCon Germany & PyData Berlin 2024 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: Python fwdays + year: 2024 + link: https://fwdays.com/en/event/python-ds-fwdays-2024 + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLScnUVAZxseEr8a3p7jUj7D6q-U3LoiFA3Z1I4mAqR0ovUW1-g/closedform + cfp: '2024-03-20 23:59:00' + place: Kyiv, Ukraine + start: 2024-04-20 + end: 2024-04-20 + sub: PY + location: + - title: Python fwdays 2024 + latitude: 50.6215011 + longitude: 30.460508167757546 + +- conference: PyTexas + year: 2024 + link: https://pytexas.org/2024/ + cfp_link: https://web.archive.org/web/20240329144646/https://pretalx.com/pytexas-2024/ + cfp: '2024-01-14 23:59:00' + tutorial_deadline: '2024-01-14 23:59:00' + timezone: America/Chicago + place: Austin, USA + start: 2024-04-19 + end: 2024-04-21 + sponsor: https://pytexas.org/2024/sponsors/sponsor-us/ + finaid: https://forms.gle/rTWhsoayZ7JRU2hR9 + sub: PY + location: + - title: PyTexas 2024 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyCascades + year: 2024 + link: https://2024.pycascades.com/ + cfp_link: https://web.archive.org/web/20240329145604/https://pretalx.com/pycascades-2024/cfp + cfp: '2024-01-04 23:59:00' + place: Seattle, USA + start: 2024-04-05 + end: 2024-04-08 + sponsor: https://2024.pycascades.com/sponsors/become-a-sponsor/ + twitter: pyCascades + mastodon: https://fosstodon.org/@pycascades + sub: PY + location: + - title: PyCascades 2024 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: PyCon Lithuania + alt_name: PyCon LT + year: 2024 + link: https://pycon.lt/2024 + cfp_link: https://pycon.lt/2024/call-for-proposals + cfp: '2024-01-10 23:59:00' + timezone: Europe/Vilnius + place: Vilnius, Lithuania + start: 2024-04-02 + end: 2024-04-06 + sponsor: https://pycon.lt/2024/partnership + sub: PY + location: + - title: PyCon Lithuania 2024 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: PyCamp España + year: 2024 + link: https://pycamp.es/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSfLVbA5F-d6xzdLz08eD8_pUcngUommwqfgAMsEz1MWv-rnQw/viewform + cfp: '2024-03-27 23:59:00' + place: Lleida, Spain + start: 2024-03-29 + end: 2024-04-01 + sub: CAMP + location: + - title: PyCamp España 2024 + latitude: 41.6147605 + longitude: 0.6267842 + +- conference: PyCon Slovakia + alt_name: PyCon SK + year: 2024 + link: https://2024.pycon.sk/ + cfp_link: https://2024.pycon.sk/en/cfp + cfp: '2023-12-31 23:59:00' + place: Bratislava, Slovakia + start: 2024-03-15 + end: 2024-03-17 + twitter: pyconsk + sub: PY + location: + - title: PyCon Slovakia 2024 + latitude: 48.1516988 + longitude: 17.1093063 + +- conference: PyCon Pakistan + year: 2024 + link: https://pycon.pk/ + cfp: '2024-01-15 23:59:00' + timezone: Asia/Karachi + place: Lahore, Pakistan + start: 2024-03-09 + end: 2024-03-10 + twitter: PyConPK + sub: PY + location: + - title: PyCon Pakistan 2024 + latitude: 31.5656822 + longitude: 74.3141829 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2024 + link: https://web.archive.org/web/20240223022107/https://na.pycon.org/ + cfp_link: https://web.archive.org/web/20240329144136/https://na.pycon.org/call-proposals/ + cfp: '2024-01-21 23:59:00' + timezone: Africa/Windhoek + place: Windhoek, Namibia + start: 2024-03-04 + end: 2024-03-07 + sponsor: https://web.archive.org/web/20240224145516/https://na.pycon.org/sponsorship/ + twitter: PyConNA + sub: PY + location: + - title: PyCon Namibia 2024 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2024 + link: https://pycon-2024.python.ph/ + cfp: '2023-12-31 23:59:00' + timezone: Asia/Manila + place: Manila, Philippines + start: 2024-02-25 + end: 2024-02-26 + sponsor: https://docs.google.com/forms/d/e/1FAIpQLSfFUgrENuMWS-Ef4DQdDucTYAwVcV-_kPjnTxpiIXVl7fx-_g/closedform + twitter: PyConPH + sub: PY + location: + - title: PyCon Philippines 2024 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: Python Pizza Prague + alt_name: Prague Python Pizza + year: 2024 + link: https://prague.python.pizza/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSfaDox_HZ2il0KOoohtYQJxVbhuTlwMFpmbz8bp-WOoLVQlNQ/closedform + cfp: '2023-12-31 23:59:00' + timezone: Europe/Prague + place: Prague, Czechia + start: 2024-02-24 + end: 2024-02-24 + twitter: PythonPizzaConf + mastodon: https://fosstodon.org/@pythonpizza/ + sub: PY + location: + - title: Python Pizza Prague 2024 + latitude: 50.0874654 + longitude: 14.4212535 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2024 + link: https://fosdem.org/2024/schedule/track/python-devroom/ + cfp: '2023-12-01 23:59:00' + place: Brussels, Belgium + start: 2024-02-04 + end: 2024-02-04 + sub: PY + location: + - title: FOSDEM 2024 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: PyCon Somalia + year: 2023 + link: https://web.archive.org/web/20231227000601/https://pycon.org.so/ + cfp: None + place: Mogadishu, Somalia + start: 2023-12-26 + end: 2023-12-27 + sub: PY + location: + - title: PyCon Somalia 2023 + latitude: 2.0349312 + longitude: 45.3419183 + +- conference: PyCon China + year: 2023 + link: https://web.archive.org/web/20230927124755/http://cn.pycon.org/2023/ + cfp: '2023-11-30 23:59:00' + place: Guangzhou, China + start: 2023-12-23 + end: 2023-12-23 + sub: PY + location: + - title: PyCon China 2023 + latitude: 23.1301964 + longitude: 113.2592945 + +- conference: PyCon China + year: 2023 + link: https://web.archive.org/web/20230927124755/http://cn.pycon.org/2023/ + cfp: '2023-11-30 23:59:00' + place: Chengdu, China + start: 2023-12-17 + end: 2023-12-17 + sub: PY + location: + - title: PyCon China 2023 + latitude: 30.7001324 + longitude: 104.0708278 + +- conference: Flask Con + year: 2023 + link: https://web.archive.org/web/20231016112650/https://flaskcon.com/2023/ + cfp: '2023-10-31 23:59:00' + place: Online + start: 2023-12-16 + end: 2023-12-17 + sponsor: https://flaskcon.com/2023/become-sponsor + twitter: FlaskCon + sub: WEB + +- conference: PyOhio + year: 2023 + link: https://pyohio.org/2023/ + cfp: '2023-10-23 08:00:00' + timezone: America/New_York + place: Online + start: 2023-12-16 + end: 2023-12-16 + sub: PY + location: + - title: PyOhio 2023 + latitude: 40.2253569 + longitude: -82.6881395 + +- conference: PyCon Thailand + year: 2023 + link: https://th.pycon.org/ + cfp_link: https://papercall.io/pyconth2023 + cfp: '2023-08-16 23:59:00' + workshop_deadline: '2023-08-16 23:59:00' + tutorial_deadline: '2023-08-16 23:59:00' + timezone: UTC + place: Bangkok, Thailand + start: 2023-12-14 + end: 2023-12-16 + sponsor: https://web.archive.org/web/20240329124030/https://www.canva.com/design/DAFkARVxuLI/I-ufznB4xLhvsdJEl571NQ/view + sub: PY + location: + - title: PyCon Thailand 2023 + latitude: 13.7524938 + longitude: 100.4935089 + +- conference: PyData Global + year: 2023 + link: https://web.archive.org/web/20240303060445/https://pydata.org/global2023 + cfp_link: https://pydata.org/global2023/cfp + cfp: '2023-10-01 23:59:00' + place: Online + start: 2023-12-06 + end: 2023-12-08 + sponsor: https://pydata.org/global2023/sponsor/ + sub: DATA + +- conference: Pyjamas Conf + year: 2023 + link: https://pyjamas.live/ + cfp: Cancelled + place: Online + start: 2023-12-05 + end: 2023-12-05 + sub: PY + +- conference: Xtreme Python + year: 2023 + link: https://xtremepython.dev/2023/ + cfp_link: https://forms.gle/7dv6iqToggY8Gshs5 + cfp: '2023-11-01 23:59:00' + place: Online + start: 2023-12-05 + end: 2023-12-05 + sponsor: https://xtremepython.dev/2023/sponsors/ + sub: PY + +- conference: PyCon China + year: 2023 + link: https://web.archive.org/web/20230927124755/http://cn.pycon.org/2023/ + cfp: '2023-11-30 23:59:00' + place: Beijing, China + start: 2023-12-02 + end: 2023-12-02 + sub: PY + location: + - title: PyCon China 2023 + latitude: 40.190632 + longitude: 116.412144 + +- conference: PyLadiesCon + year: 2023 + link: https://conference.pyladies.com/ + cfp_link: https://web.archive.org/web/20231201030942/https://pretalx.com/pyladiescon-2023/cfp + cfp: '2023-09-04 23:59:00' + place: Online + start: 2023-12-02 + end: 2023-12-03 + sub: PY + +- conference: PyCon Chile + year: 2023 + link: https://pycon.cl/ + cfp: '2023-09-15 23:59:59' + timezone: America/Santiago + place: Valparaiso, Chile + extra_places: + - Online + start: 2023-11-24 + end: 2023-11-26 + twitter: PythonChileDev + sub: PY + note: Saturday presence, 2 days Online + location: + - title: PyCon Chile 2023 + latitude: -32.5976089 + longitude: -70.8529753 + +- conference: PyCon Indonesia + alt_name: PyCon ID + year: 2023 + link: https://pycon.id/ + cfp_link: https://papercall.io/pyconid2023 + cfp: '2023-07-15 16:59:59' + place: Badung City, Indonesia + start: 2023-11-18 + end: 2023-11-19 + sponsor: https://web.archive.org/web/20231203101832/https://pycon.id/sponsor + twitter: id_pycon + sub: PY + location: + - title: PyCon Indonesia 2023 + latitude: -8.7326688 + longitude: 115.1701613 + +- conference: Python Pizza Hamburg + year: 2023 + link: https://hamburg.python.pizza/ + cfp_link: https://forms.gle/Mssgv25KUgjBv3hN6 + cfp: '2023-09-30 23:59:00' + timezone: Europe/Zurich + place: Hamburg, Germany + start: 2023-11-17 + end: 2023-11-17 + sponsor: https://hamburg.python.pizza/#sponsors + twitter: PythonPizzaConf + sub: PY + location: + - title: Python Pizza Hamburg 2023 + latitude: 53.5672881 + longitude: 9.941726150411604 + +- conference: Piter Py + alt_name: PiterPy + year: 2023 + link: https://web.archive.org/web/20230628045535/https://piterpy.com/en/ + cfp: '2023-06-30 23:59:00' + place: Saint Petersburg, Russia + start: 2023-11-13 + end: 2023-11-14 + sub: PY + location: + - title: Piter Py 2023 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2023 + link: http://python.ie/previous-pycons/pycon-2023/ + cfp: '2023-07-16 23:59:00' + timezone: UTC + place: Dublin, Ireland + start: 2023-11-11 + end: 2023-11-12 + sub: PY + location: + - title: PyCon Ireland 2023 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2023 + link: https://pycon.hk/2023/ + cfp_link: https://pycon.hk/2023/pycon-hk-2023-cfp/ + cfp: '2023-06-18 23:59:00' + timezone: Asia/Hong_Kong + place: Hong Kong, Hong Kong + start: 2023-11-10 + end: 2023-11-11 + twitter: pyconhk + sub: PY + location: + - title: PyCon Hong Kong 2023 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2023 + link: https://pycon.se/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSebISd6uvGN6QB9MMdfib6UpHyleNcvXOvyZf9Jfkt0YrTtuA/closedform + cfp: '2023-09-01 23:59:00' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2023-11-09 + end: 2023-11-10 + sponsor: https://pycon.se/#sponsorship + twitter: pyconse + mastodon: https://fosstodon.org/@pyconsweden + sub: PY + location: + - title: PyCon Sweden 2023 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: DjangoCon Africa + year: 2023 + link: https://2023.djangocon.africa/ + cfp_link: https://web.archive.org/web/20231002014735/https://cfp-2023.djangocon.africa/ + cfp: '2023-07-12 23:59:00' + place: Zanzibar, Tanzania + start: 2023-11-06 + end: 2023-11-11 + sponsor: https://2023.djangocon.africa/sponsor-us/ + finaid: https://2023.djangocon.africa/grant/ + twitter: djcafrica + sub: WEB + location: + - title: DjangoCon Africa 2023 + latitude: -6.09994425 + longitude: 39.32094431715264 + +- conference: Python Brasil + alt_name: PythonBrasil + year: 2023 + link: https://2023.pythonbrasil.org.br/ + cfp_link: https://pretalx.com/python-Brazil-2023/cfp + cfp: '2023-06-08 23:59:00' + cfp_ext: '2023-06-21 23:59:00' + timezone: America/Sao_Paulo + place: Caxias do Sul, Brazil + start: 2023-10-30 + end: 2023-11-05 + sponsor: https://2023.pythonbrasil.org.br/#patrocinadores + twitter: PyConBrazil + sub: PY + location: + - title: Python Brasil 2023 + latitude: -29.1685045 + longitude: -51.1796385 + +- conference: PyCon Asia Pacific + alt_name: PyCon Japan + year: 2023 + link: https://2023-apac.pycon.jp/ + cfp_link: https://pretalx.com/pyconapac2023/cfp + cfp: '2023-05-31 23:59:59' + place: Tokyo, Japan + start: 2023-10-27 + end: 2023-10-29 + sponsor: https://web.archive.org/web/20231125033134/https://pyconjp.blogspot.com/2023/05/pyconapac2023-call-for-sponsors-en.html + sub: PY + location: + - title: PyCon Asia Pacific 2023 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PackagingCon + year: 2023 + link: https://packaging-con.org/ + cfp_link: https://cfp.packaging-con.org/2023/cfp + cfp: '2023-08-06 23:59:59' + place: Berlin, Germany + start: 2023-10-26 + end: 2023-10-28 + sponsor: https://packaging-con.org/s/sponsorship_prospectus_packagingcon_2023.pdf + sub: PY + location: + - title: PackagingCon 2023 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyDay Cali + year: 2023 + link: https://www.calidev.co/eventos/pyday/cali-2023/ + cfp: None + place: Cali, Colombia + start: 2023-10-21 + end: 2023-10-21 + sub: DAY + location: + - title: PyDay Cali 2023 + latitude: 3.4520339 + longitude: -76.5329352 + +- conference: EduPy + year: 2023 + link: https://slec.net/edupy/ + cfp_link: https://bit.ly/ConferencistaEdupyOctubre2023 + cfp: '2023-10-14 23:59:00' + place: Cali, Colombia + start: 2023-10-21 + end: 2023-10-21 + sponsor: https://slec.net/edupy/posts/callforsponsors/ + sub: PY + location: + - title: EduPy 2023 + latitude: 3.4520339 + longitude: -76.5329352 + +- conference: PyTorch Conference + year: 2023 + link: https://events.linuxfoundation.org/pytorch-conference/ + cfp: '2023-07-21 23:59:00' + timezone: America/Los_Angeles + place: San Francisco, USA + start: 2023-10-16 + end: 2023-10-17 + sponsor: https://events.linuxfoundation.org/pytorch-conference/sponsor/ + finaid: https://events.linuxfoundation.org/pytorch-conference/attend/scholarships-travel-funding/ + sub: DATA + location: + - title: PyTorch Conference 2023 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyCon MEA + alt_name: PyCon MEA @ Global DevSlam + year: 2023 + link: https://globaldevslam.com/ + cfp: '2023-05-31 23:59:00' + timezone: Asia/Dubai + place: Dubai, UAE + start: 2023-10-16 + end: 2023-10-20 + twitter: GlobalDevSlam + sub: PY + location: + - title: PyCon MEA 2023 + latitude: 25.074282349999997 + longitude: 55.18853865430702 + +- conference: DjangoCon US + year: 2023 + link: https://2023.djangocon.us/ + cfp_link: https://2023.djangocon.us/speaking/ + cfp: '2023-05-15 18:00:00' + tutorial_deadline: '2023-05-15 23:59:00' + timezone: America/New_York + place: North Carolina, USA + start: 2023-10-16 + end: 2023-10-20 + sponsor: https://2023.djangocon.us/sponsors/information/ + finaid: https://2023.djangocon.us/opportunity-grants/ + twitter: djangoCon + sub: WEB + location: + - title: DjangoCon US 2023 + latitude: 35.6729639 + longitude: -79.0392919 + +- conference: PyHEP + year: 2023 + link: https://indico.cern.ch/event/1252095/ + cfp_link: https://indico.cern.ch/event/1252095/abstracts/ + cfp: '2023-09-06 23:59:00' + timezone: Europe/Zurich + place: Online + start: 2023-10-09 + end: 2023-10-12 + twitter: PyHEPConf + sub: SCIPY + +- conference: Django Day Copenhagen + year: 2023 + link: https://2023.djangoday.dk/ + cfp_link: https://2023.djangoday.dk/cfp/ + cfp: '2023-08-31 23:59:59' + timezone: Europe/Copenhagen + place: Copenhagen, Denmark + start: 2023-10-06 + end: 2023-10-06 + twitter: djangodenmark + mastodon: https://fosstodon.org/@djangodenmark + sub: WEB,DAY + location: + - title: Django Day Copenhagen 2023 + latitude: 55.6867243 + longitude: 12.5700724 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2023 + link: https://2023.es.pycon.org/ + cfp_link: https://2023.es.pycon.org/c4p/ + cfp: '2023-06-23 23:59:00' + timezone: Europe/London + place: Tenerife, Spain + start: 2023-10-06 + end: 2023-10-08 + sponsor: https://2023.es.pycon.org/patrocinios/ + twitter: PyConES + mastodon: https://fosstodon.org/@pycones + sub: PY + location: + - title: PyCon Spain 2023 + latitude: 28.2935785 + longitude: -16.621447121144122 + +- conference: PyGotham TV + year: 2023 + link: https://2023.pygotham.tv/ + cfp_link: https://cfp.pygotham.tv/ + cfp: '2023-05-15 23:59:00' + place: Online + start: 2023-10-06 + end: 2023-10-07 + sponsor: https://2023.pygotham.tv/sponsors/prospectus/ + sub: PY + note: Tech talks and short film submissions + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2023 + link: https://za.pycon.org/ + cfp_link: https://web.archive.org/web/20231004163314/https://za.pycon.org/talks/how-to-submit-a-talk/ + cfp: '2023-08-18 23:59:00' + tutorial_deadline: '2023-08-18 23:59:00' + timezone: Africa/Johannesburg + place: Durban, South Africa + start: 2023-10-05 + end: 2023-10-06 + twitter: PyConZA + mastodon: https://fosstodon.org/@PyConZA + sub: PY + location: + - title: PyCon South Africa 2023 + latitude: -29.861825 + longitude: 31.009909 + +- conference: Plone Conference + year: 2023 + link: https://2023.ploneconf.org/ + cfp: '2023-09-01 23:59:00' + place: Eibar, Spain + start: 2023-10-02 + end: 2023-10-08 + sub: WEB + location: + - title: Plone Conference 2023 + latitude: 43.1842839 + longitude: -2.4732748 + +- conference: PyCon India + year: 2023 + link: https://in.pycon.org/2023/ + cfp_link: https://in.pycon.org/cfp/pycon-india-2023/proposals/ + cfp: '2023-08-05 23:59:00' + timezone: Asia/Kolkata + place: Hyderabad, India + start: 2023-09-29 + end: 2023-10-02 + sponsor: https://docs.google.com/forms/d/e/1FAIpQLScKhnPeoB30F4PTA22fvXsNlF81Q7L_SIIPUtbty7YLlLvzmA/viewform + twitter: PyConIndia + sub: PY + location: + - title: PyCon India 2023 + latitude: 17.360589 + longitude: 78.4740613 + +- conference: PyCon UK + year: 2023 + link: https://2023.pyconuk.org/ + cfp_link: https://2023.pyconuk.org/call-for-proposals/ + cfp: '2023-06-30 16:59:00' + timezone: Europe/London + place: Cardiff, UK + start: 2023-09-22 + end: 2023-09-25 + sponsor: https://2023.pyconuk.org/sponsorship/ + finaid: https://2023.pyconuk.org/financial-assistance/ + twitter: PyConUK + mastodon: https://fosstodon.org/@PyConUK + sub: PY + location: + - title: PyCon UK 2023 + latitude: 51.4816546 + longitude: -3.1791934 + +- conference: Python Nordeste + year: 2023 + link: https://2023.pythonnordeste.org/ + cfp_link: https://pretalx.com/python-nordeste-2023/cfp + cfp: '2023-06-25 23:59:00' + timezone: America/Recife + place: Salvador, Brazil + start: 2023-09-22 + end: 2023-09-24 + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2023 + latitude: -5.7944777 + longitude: -35.2119324 + +- conference: Swiss Python Summit + year: 2023 + link: https://python-summit.ch/ + cfp_link: https://web.archive.org/web/20230602211338/https://www.python-summit.ch/cfp/ + cfp: '2023-07-01 23:59:00' + timezone: Europe/Zurich + place: Rapperswil, Switzerland + start: 2023-09-21 + end: 2023-09-21 + sponsor: https://web.archive.org/web/20230923151344/https://www.python-summit.ch/helpus/ + twitter: pythonsummit + sub: PY + location: + - title: Swiss Python Summit 2023 + latitude: 47.2266532 + longitude: 8.8164042 + +- conference: PyCon Uganda + year: 2023 + link: https://ug.pycon.org/2023 + cfp_link: https://web.archive.org/web/20230929225843/https://ug.pycon.org/speakers + cfp: '2023-05-05 23:59:00' + timezone: Africa/Kampala + place: Kampala, Uganda + start: 2023-09-21 + end: 2023-09-23 + sponsor: https://web.archive.org/web/20231129142123/https://ug.pycon.org/sponsors + sub: PY + location: + - title: PyCon Uganda 2023 + latitude: 0.3177137 + longitude: 32.5813539 + +- conference: PyCon Czechia + alt_name: PyCon CZ + year: 2023 + link: https://cz.pycon.org/2023/ + cfp_link: https://cz.pycon.org/2023/cfp/ + cfp: '2023-06-25 23:59:00' + workshop_deadline: '2023-06-25 23:59:00' + tutorial_deadline: '2023-06-25 23:59:00' + timezone: Europe/Prague + place: Prague, Czechia + start: 2023-09-15 + end: 2023-09-17 + sponsor: https://web.archive.org/web/20230516214745/https://cz.pycon.org/2023/pycon-cz-sponsorship-prospectus-2023.pdf + finaid: https://cz.pycon.org/2023/cfp/ + twitter: pyconcz + sub: PY + location: + - title: PyCon Czechia 2023 + latitude: 50.0874654 + longitude: 14.4212535 + +- conference: Kiwi PyCon + alt_name: Kiwi PyCon XII + year: 2023 + link: https://kiwipycon.nz/ + cfp_link: https://web.archive.org/web/20230314112258/https://kiwipycon.nz/call-for-proposals + cfp: '2023-05-19 23:59:00' + timezone: Pacific/Auckland + place: Waihōpai (Invercargill), New Zealand + start: 2023-09-15 + end: 2023-09-17 + sponsor: https://kiwipycon.nz/s/Kiwi-Pycon-XII-Sponsorship-Prospectus.pdf + finaid: https://web.archive.org/web/20220721015137/https://kiwipycon.nz/financial-aid + twitter: KiwiPyCon + sub: PY + location: + - title: Kiwi PyCon 2023 + latitude: -46.4118465 + longitude: 168.3470632 + +- conference: PyData Amsterdam + year: 2023 + link: https://amsterdam.pydata.org/ + cfp_link: https://amsterdam2023.pydata.org/cfp/cfp + cfp: '2023-06-11 23:59:00' + tutorial_deadline: '2023-06-11 23:59:00' + timezone: Europe/Amsterdam + place: Amsterdam, Netherlands + start: 2023-09-14 + end: 2023-09-16 + sponsor: https://amsterdam.pydata.org/sponsor/ + sub: DATA + location: + - title: PyData Amsterdam 2023 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: PyCon Portugal + year: 2023 + link: https://2023.pycon.pt/ + cfp_link: https://2023.pycon.pt/talks/cfp/ + cfp: '2023-06-30 23:59:00' + tutorial_deadline: '2023-06-30 23:59:00' + timezone: UTC + place: Coimbra, Portugal + start: 2023-09-07 + end: 2023-09-09 + sponsor: https://2023.pycon.pt/sponsors/sponsorship/ + finaid: https://2023.pycon.pt/information/grants/ + twitter: PyConPT + sub: PY + location: + - title: PyCon Portugal 2023 + latitude: 40.2111931 + longitude: -8.4294632 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2023 + link: https://pycon.ee/ + cfp_link: https://pyconestonia.typeform.com/to/hBOEtTQ3 + cfp: '2023-05-09 23:59:59' + tutorial_deadline: '2023-05-09 23:59:00' + timezone: Europe/Tallinn + place: Tallinn, Estonia + start: 2023-09-07 + end: 2023-09-08 + twitter: PyConEstonia + sub: PY + location: + - title: PyCon Estonia 2023 + latitude: 59.4372155 + longitude: 24.7453688 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2023 + link: https://tw.pycon.org/2023/ + cfp: '2023-03-31 23:59:59' + place: Taipei, Taiwan + start: 2023-09-02 + end: 2023-09-03 + sponsor: https://tw.pycon.org/2023/en-us/sponsor/ + finaid: https://tw.pycon.org/2023/en-us/registration/financial-aid/ + twitter: PyConTW + sub: PY + location: + - title: PyCon Taiwan 2023 + latitude: 25.0375198 + longitude: 121.5636796 + +- conference: PyCon Malaysia + alt_name: PyCon MY + year: 2023 + link: https://web.archive.org/web/20230809230514/https://pycon.my/ + cfp_link: https://papercall.io/pycon-my-2023 + cfp: '2023-05-31 23:59:00' + timezone: Asia/Kuala_Lumpur + place: Kuala Lumpur, Malaysia + start: 2023-08-26 + end: 2023-08-26 + twitter: pyconmy + sub: PY + location: + - title: PyCon Malaysia 2023 + latitude: 4.5693754 + longitude: 102.2656823 + +- conference: PyCon Latin America + alt_name: PyCon LatAm + year: 2023 + link: https://pylatam.org/ + cfp_link: https://papercall.io/pyconlatam23 + cfp: '2023-05-07 23:59:00' + timezone: UTC + place: Monterrey, Mexico + start: 2023-08-24 + end: 2023-08-26 + sponsor: https://web.archive.org/web/20230927211825/https://www.pylatam.org/patrocinios/informacion/ + twitter: PyLatam + sub: PY + location: + - title: PyCon Latin America 2023 + latitude: 25.6802019 + longitude: -100.315258 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2023 + link: https://2023.pycon.org.au/ + cfp_link: https://2023.pycon.org.au/program/ + cfp: '2023-05-15 23:59:00' + timezone: Australia/Adelaide + place: Tarndanya (Adelaide), Australia + start: 2023-08-18 + end: 2023-08-22 + sponsor: https://2023.pycon.org.au/sponsor/#opportunities + twitter: PyConAU + mastodon: https://fosstodon.org/@pyconau + sub: PY + location: + - title: PyCon Australia 2023 + latitude: -34.9281805 + longitude: 138.5999312 + +- conference: DjangoCon Australia + alt_name: DjangoCon AU + year: 2023 + link: https://2023.djangocon.com.au/ + cfp_link: https://2023.pycon.org.au/program/ + cfp: '2023-05-14 23:59:00' + timezone: Australia/Adelaide + place: Tarndanya (Adelaide), Australia + start: 2023-08-18 + end: 2023-08-18 + sponsor: https://2023.pycon.org.au/sponsor/ + twitter: DjangoConAU + mastodon: https://fosstodon.org/@djangoconau + sub: WEB + location: + - title: DjangoCon Australia 2023 + latitude: -34.9281805 + longitude: 138.5999312 + +- conference: EuroSciPy + year: 2023 + link: https://euroscipy.org/2023/ + cfp_link: https://euroscipy.org/2023/program.html + cfp: '2023-05-14 23:59:59' + timezone: Europe/Berlin + place: Basel, Switzerland + start: 2023-08-14 + end: 2023-08-18 + sponsor: https://euroscipy.org/2023/sponsoring.html + finaid: https://euroscipy.org/2023/finaid.html + twitter: euroSciPy + sub: SCIPY + location: + - title: EuroSciPy 2023 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: PyCon South Korea + alt_name: PyCon Korea + year: 2023 + link: https://2023.pycon.kr/ + cfp_link: https://2023.pycon.kr/cfp/apply + cfp: '2023-05-14 23:59:00' + timezone: Asia/Seoul + place: Seoul, South Korea + start: 2023-08-11 + end: 2023-08-13 + sponsor: https://2023.pycon.kr/sponsor/information + twitter: PyConKR + sub: PY + location: + - title: PyCon South Korea 2023 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: North Bay Python + year: 2023 + link: https://2023.northbaypython.org/ + cfp_link: https://2023.northbaypython.org/speak + cfp: '2023-05-19 23:59:00' + timezone: America/Los_Angeles + place: Petaluma, USA + start: 2023-07-29 + end: 2023-07-30 + sponsor: https://2023.northbaypython.org/assets/pdf/sponsor-prospectus.pdf + twitter: NorthBayPython + mastodon: https://floss.social/@northbaypython + sub: PY + location: + - title: North Bay Python 2023 + latitude: 38.2325829 + longitude: -122.636465 + +- conference: PyCon Russia + year: 2023 + link: https://web.archive.org/web/20230715073901/https://pycon.ru/ + cfp_link: https://web.archive.org/web/20230210024458/https://pycon.ru/cfp/ + cfp: '2023-03-15 23:59:00' + timezone: Europe/Moscow + place: Moscow, Russia + start: 2023-07-28 + end: 2023-07-29 + sponsor: https://web.archive.org/web/20240203212600/https://pycon.ru/partneram + twitter: IT_People_ru + sub: PY + location: + - title: PyCon Russia 2023 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: AfroPython Conf + year: 2023 + link: https://web.archive.org/web/20230609213307/http://afropython.org/conf2023/ + cfp_link: https://bit.ly/conf2023-palestrantes + cfp: '2023-06-19 23:59:00' + timezone: America/Bahia + place: Salvador, Brazil + start: 2023-07-22 + end: 2023-07-22 + sponsor: https://docs.google.com/forms/d/e/1FAIpQLSclMmFsjw5qcJaFwCC-z7zhN0Uaf8t4zF74qL_KKsBjh-y-aA/viewform + twitter: AfroPython + sub: PY + location: + - title: AfroPython Conf 2023 + latitude: -5.7944777 + longitude: -35.2119324 + +- conference: EuroPython + year: 2023 + link: https://ep2023.europython.eu/ + cfp_link: https://ep2023.europython.eu/cfp/ + cfp: '2023-03-26 23:59:00' + place: Prague, Czechia + start: 2023-07-17 + end: 2023-07-23 + sponsor: https://drive.google.com/file/d/15f6HGVUjgx2OKaLoCaIa6uNG3W0xLOm6/view + finaid: https://ep2023.europython.eu/finaid/ + twitter: EuroPython + sub: PY + location: + - title: EuroPython 2023 + latitude: 50.0874654 + longitude: 14.4212535 + +- conference: SciPy US + alt_name: SciPy + year: 2023 + link: https://scipy2023.scipy.org/ + cfp_link: https://scipy2023.scipy.org/present + cfp: '2023-03-01 23:59:00' + timezone: America/Chicago + place: Austin, USA + start: 2023-07-10 + end: 2023-07-16 + sponsor: https://web.archive.org/web/20230602014437/https://pydata.org/wp-content/uploads/2023/02/SciPy-2023-Prospectus.pdf + finaid: https://web.archive.org/web/20230407213408/https://www.scipy2023.scipy.org/financial-aid + twitter: SciPyConf + sub: SCIPY + location: + - title: SciPy US 2023 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyCon Israel + year: 2023 + link: https://web.archive.org/web/20230627071113/https://2023.pycon.org.il/ + cfp_link: https://cfp.pycon.org.il/conference2023/cfp + cfp: '2023-04-02 22:59:00' + timezone: Africa/Cairo + place: Israel, Israel + start: 2023-07-04 + end: 2023-07-05 + sponsor: https://web.archive.org/web/20231207055744/https://2023.pycon.org.il/ + twitter: PyConIL + sub: PY + location: + - title: PyCon Israel 2023 + latitude: 30.8124247 + longitude: 34.8594762 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2023 + link: https://pl.pycon.org/2023/ + cfp: '2023-03-27 23:59:00' + timezone: Europe/Warsaw + place: Gliwice, Poland + start: 2023-06-29 + end: 2023-07-02 + sponsor: https://pl.pycon.org/2023/sponsorship.pdf + finaid: https://pl.pycon.org/2023/en/financial-aid/ + twitter: PyConPL + sub: PY + location: + - title: PyCon Poland 2023 + latitude: 50.294113 + longitude: 18.6657306 + +- conference: PyCon Colombia + year: 2023 + link: https://2023.pycon.co/ + cfp_link: https://2023.pycon.co/call-for-proposals/ + cfp: '2023-03-30 23:59:59' + timezone: America/Bogota + place: Online + start: 2023-06-09 + end: 2023-06-11 + finaid: https://2023.pycon.co/scholarship/ + twitter: PyConColombia + sub: PY + +- conference: PyDay La Paz + year: 2023 + link: https://pyday.pylapaz.org/ + cfp: '2023-03-30 23:59:00' + timezone: America/La_Paz + place: La Paz, Bolivia + start: 2023-06-03 + end: 2023-06-03 + sponsor: https://forms.gle/7SoVfzBgwYfv1Qw59 + twitter: PyDayLaPaz + sub: DAY + location: + - title: PyDay La Paz 2023 + latitude: -16.4955455 + longitude: -68.1336229 + +- conference: PyData London + year: 2023 + link: https://pydata.org/london2023/ + cfp: '2023-03-13 23:59:00' + timezone: Europe/London + place: London, UK + start: 2023-06-02 + end: 2023-06-04 + sponsor: https://web.archive.org/web/20230602014516/https://pydata.org/wp-content/uploads/2023/01/PyData-2023-Sponsorship-Prospectus.pdf + twitter: PyDataLondon + sub: DATA + location: + - title: PyData London 2023 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: DjangoCon Europe + year: 2023 + link: https://2023.djangocon.eu/ + cfp_link: https://2023.djangocon.eu/call-for-proposals/ + cfp: '2023-02-27 23:59:59' + tutorial_deadline: '2023-02-27 23:59:00' + place: Edinburgh, UK + start: 2023-05-29 + end: 2023-06-02 + sponsor: https://2023.djangocon.eu/sponsors/information/ + finaid: https://2023.djangocon.eu/opportunity-grants/ + twitter: DjangoConEurope + sub: WEB + location: + - title: DjangoCon Europe 2023 + latitude: 55.9533456 + longitude: -3.1883749 + +- conference: PyGrunn + year: 2023 + link: https://web.archive.org/web/20230608055024/http://www.pygrunn.org/ + cfp: '2023-04-07 23:59:00' + place: Groningen, Netherlands + start: 2023-05-26 + end: 2023-05-26 + sub: PY + location: + - title: PyGrunn 2023 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2023 + link: https://pycon.it/en + cfp_link: https://pycon.it/cfp + cfp: '2023-01-16 13:59:00' + tutorial_deadline: '2023-01-15 23:59:00' + place: Florence, Italy + start: 2023-05-25 + end: 2023-05-28 + sponsor: https://pycon.it/en/sponsor + finaid: https://pycon.it/en/grants-info + twitter: PyConIT + mastodon: https://social.python.it/@pycon + sub: PY + location: + - title: PyCon Italia 2023 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: Moscow Python Conf++ + alt_name: MoscowPythonConf++ + year: 2023 + link: https://conf.python.ru/moscow/2023 + cfp_link: https://web.archive.org/web/20230521035241/https://cfp.conf.python.ru/ + cfp: '2023-04-17 23:59:00' + timezone: Europe/Moscow + place: Moscow, Russia + start: 2023-05-19 + end: 2023-05-20 + twitter: moscowpython + sub: PY + location: + - title: Moscow Python Conf++ 2023 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: PyCon Lithuania + alt_name: PyCon LT + year: 2023 + link: https://pycon.lt/2024 + cfp: '2023-03-18 00:00:00' + timezone: Europe/Vilnius + place: Vilnius, Lithuania + start: 2023-05-17 + end: 2023-05-20 + sponsor: https://drive.google.com/file/d/1wznoPlxfrdHd_jI7ZqP3vRKMHSaRJatm/view?usp=sharing + finaid: https://forms.gle/hbsYbiboLEXLGU8XA + twitter: PyConLT + sub: PY + location: + - title: PyCon Lithuania 2023 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: JupyterCon + year: 2023 + link: https://web.archive.org/web/20230507170740/http://www.jupytercon.com/ + cfp: '2022-12-20 23:59:00' + place: Paris, France + start: 2023-05-10 + end: 2023-05-12 + sponsor: https://jupytercon.com/s/JupyterCon-2023-Prospectus-v3.pdf + finaid: https://www.jupytercon.com/scholarships/ + twitter: jupyterCon + sub: DATA + location: + - title: JupyterCon 2023 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyData Seattle + year: 2023 + link: https://web.archive.org/web/20230405212605/http://pydata.org/seattle2023/ + cfp: '2023-02-06 23:59:00' + timezone: America/Los_Angeles + place: Seattle, USA + start: 2023-04-26 + end: 2023-04-28 + sponsor: https://web.archive.org/web/20230327071537/https://pydata.org/seattle2023/wp-content/uploads/2022/12/PyData-2023-Sponsorship-Prospectus.pdf + finaid: https://web.archive.org/web/20240121140723/https://pydata.org/seattle2023/ + twitter: PyDataSeattle + sub: DATA + location: + - title: PyData Seattle 2023 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: PyCon US + year: 2023 + link: https://us.pycon.org/2023/ + cfp_link: https://web.archive.org/web/20230325060747/https://us.pycon.org/2023/speaking/guidelines/ + cfp: '2022-12-11 23:59:59' + tutorial_deadline: '2022-12-11 23:59:00' + place: Salt Lake City, USA + start: 2023-04-19 + end: 2023-04-27 + sponsor: https://us.pycon.org/2023/sponsorship/why-sponsor + twitter: pycon + mastodon: https://fosstodon.org/@pycon + sub: PY + location: + - title: PyCon US 2023 + latitude: 40.7596198 + longitude: -111.886797 + +- conference: PyCon Germany & PyData Berlin + alt_name: PyCon DE & PyData Berlin + year: 2023 + link: https://2023.pycon.de/ + cfp_link: https://2023.pycon.de/blog/call-for-proposals/ + cfp: '2023-01-05 23:59:59' + tutorial_deadline: '2023-01-05 23:59:00' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2023-04-17 + end: 2023-04-19 + sponsor: https://drive.google.com/file/d/1_8zqb6ORNTRfNJWaXBmKA03ow06IN4_l/view?usp=sharing + finaid: https://2023.pycon.de/financial-aid/ + twitter: PyConDE + sub: PY,DATA + location: + - title: PyCon Germany & PyData Berlin 2023 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyTexas + year: 2023 + link: https://pytexas.org/ + cfp_link: https://web.archive.org/web/20230328105743/https://pretalx.com/pytexas-2023/ + cfp: '2023-01-15 23:59:00' + place: Austin, USA + start: 2023-04-01 + end: 2023-04-02 + sponsor: https://web.archive.org/web/20230601022143/https://www.pytexas.org/sponsors/prospectus + sub: PY + location: + - title: PyTexas 2023 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyCamp Argentina + year: 2023 + link: https://wiki.python.org.ar/PyCamp/2023/ + cfp: None + place: Riachuelo, Argentina + start: 2023-03-23 + end: 2023-03-26 + sub: CAMP + location: + - title: PyCamp Argentina 2023 + latitude: -34.694496599999994 + longitude: -58.45183581327579 + +- conference: PyCascades + year: 2023 + link: https://2023.pycascades.com/ + cfp: '2022-11-16 23:59:59' + timezone: America/Vancouver + place: Vancouver, Canada + start: 2023-03-18 + end: 2023-03-19 + sponsor: https://2023.pycascades.com/sponsors/become-a-sponsor/ + twitter: pyCascades + mastodon: https://fosstodon.org/@pycascades + sub: PY + location: + - title: PyCascades 2023 + latitude: 49.27213705 + longitude: -123.13439461006233 + +- conference: Python Web Conference + year: 2023 + link: https://2023.pythonwebconf.com/ + cfp: '2022-10-01 23:00:00' + timezone: UTC+0 + place: Online + start: 2023-03-13 + end: 2023-03-17 + twitter: PythonWebConf + sub: WEB + +- conference: GeoPython + year: 2023 + link: https://2023.geopython.net/ + cfp_link: https://submit.geopython.net/geopython-2023/cfp + cfp: '2022-12-16 12:00:00' + place: Basel, Switzerland + start: 2023-03-06 + end: 2023-03-08 + twitter: GeoPythonConf + sub: GEO + location: + - title: GeoPython 2023 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2023 + link: https://pycon-2023.python.ph/ + cfp: '2022-12-23 23:59:00' + timezone: Asia/Manila + place: Manila, Philippines + start: 2023-02-25 + end: 2023-02-26 + twitter: PyConPH + sub: PY + location: + - title: PyCon Philippines 2023 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2023 + link: https://web.archive.org/web/20230222112415/https://na.pycon.org/ + cfp_link: https://pretalx.com/pycon-namibia-2022/cfp + cfp: '2023-01-22 23:59:59' + tutorial_deadline: '2023-01-22 23:59:00' + timezone: Africa/Windhoek + place: Windhoek, Namibia + start: 2023-02-21 + end: 2023-02-23 + sponsor: https://web.archive.org/web/20230127191144/https://na.pycon.org/sponsorship/ + twitter: PyConNA + sub: PY + location: + - title: PyCon Namibia 2023 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: PyCon France + alt_name: PyCon FR + year: 2023 + link: https://pycon.fr/2023/ + cfp_link: https://cfp-2023.pycon.fr/cfp/ + cfp: '2023-01-07 23:59:59' + timezone: Europe/Paris + place: Bordeaux, France + start: 2023-02-16 + end: 2023-02-19 + sponsor: https://pycon.fr/2023/fr/support.html + twitter: PyConFR + mastodon: https://mamot.fr/@AFPy + sub: PY + location: + - title: PyCon France 2023 + latitude: 44.841225 + longitude: -0.5800364 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2023 + link: https://fosdem.org/2023 + cfp_link: https://fosdem.org/submit + cfp: '2022-12-15 23:59:00' + place: Brussels, Belgium + start: 2023-02-04 + end: 2023-02-05 + sponsor: https://fosdem.org/2023/about/sponsors + sub: PY + location: + - title: FOSDEM 2023 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: Xtreme Python + year: 2022 + link: https://xtremepython.dev/2022/ + cfp: '2022-12-01 23:59:00' + place: Online + start: 2022-12-27 + end: 2022-12-27 + sub: PY + note: No formal CfP, but you can submit a talk proposal via the website + +- conference: PyCon China + year: 2022 + link: https://web.archive.org/web/20220927124755/http://cn.pycon.org/2022/ + cfp: '2022-11-30 23:59:00' + place: Shenzhen, China + extra_places: + - Hangzhou, China + - Beijing, China + - Shanghai, China + start: 2022-12-17 + end: 2022-12-17 + sub: PY + location: + - title: PyCon China 2022 + latitude: 22.5445741 + longitude: 114.0545429 + - title: PyCon China 2022 + latitude: 30.2489634 + longitude: 120.2052342 + - title: PyCon China 2022 + latitude: 40.190632 + longitude: 116.412144 + - title: PyCon China 2022 + latitude: 31.2323437 + longitude: 121.4691024 + +- conference: PyData Tel Aviv + year: 2022 + link: https://web.archive.org/web/20221203190353/http://pydata.org/telaviv2022/ + cfp: '2022-09-12 23:59:00' + timezone: Asia/Jerusalem + place: Tel Aviv, Israel + start: 2022-12-13 + end: 2022-12-13 + sub: DATA + location: + - title: PyData Tel Aviv 2022 + latitude: 32.0852997 + longitude: 34.7818064 + +- conference: PyConf Hyderabad + year: 2022 + link: https://pyconf.hydpy.org/2022/ + cfp_link: https://web.archive.org/web/20220927033100/https://www.papercall.io/pyconfhyd-cfp-2022 + cfp: '2022-11-08 00:00:00' + timezone: UTC + place: Hyderabad, India + start: 2022-12-10 + end: 2022-12-10 + sub: PY + location: + - title: PyConf Hyderabad 2022 + latitude: 17.4454957 + longitude: 78.34854697544472 + +- conference: PyCon Tanzania + alt_name: Python Tanzania Conference + year: 2022 + link: https://web.archive.org/web/20221202222503/https://pycon.or.tz/2022/ + cfp_link: https://pycon.or.tz/2022/speak/ + cfp: '2022-11-15 23:59:00' + place: Zanzibar, Tanzania + start: 2022-12-04 + end: 2022-12-08 + sub: PY + location: + - title: PyCon Tanzania 2022 + latitude: -6.09994425 + longitude: 39.32094431715264 + +- conference: PyCon Chile + year: 2022 + link: https://web.archive.org/web/20230925093306/https://pycon.cl/2022/ + cfp: '2022-11-12 23:59:00' + timezone: America/Santiago + place: Santiago, Chile + start: 2022-12-02 + end: 2022-12-04 + sub: PY + location: + - title: PyCon Chile 2022 + latitude: -33.4377756 + longitude: -70.6504502 + +- conference: PyData Global + year: 2022 + link: https://web.archive.org/web/20221130202143/http://pydata.org/global2022/ + cfp: '2022-09-12 23:59:00' + timezone: UTC + place: Online + start: 2022-12-01 + end: 2022-12-03 + sponsor: https://web.archive.org/web/20221203190547/https://pydata.org/global2022/sponsors/ + sub: DATA + +- conference: Pyjamas Conf + year: 2022 + link: https://pyjamas.live/ + cfp: '2022-09-19 23:59:00' + place: Online + start: 2022-11-26 + end: 2022-11-27 + sub: PY + note: Support any language of talks + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2022 + link: http://python.ie/previous-pycons/pycon-2022/ + cfp_link: https://sessionize.com/pycon-ireland-2022720 + cfp: '2022-08-29 23:59:00' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2022-11-12 + end: 2022-11-13 + sub: PY + location: + - title: PyCon Ireland 2022 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyData NYC + year: 2022 + link: https://web.archive.org/web/20221203182532/https://pydata.org/nyc2022 + cfp: '2022-08-24 23:59:00' + timezone: America/New_York + place: New York, USA + start: 2022-11-09 + end: 2022-11-11 + sponsor: https://web.archive.org/web/20220907192705/https://pydata.org/nyc2022/sponsors/ + sub: DATA + location: + - title: PyData NYC 2022 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2022 + link: http://pycon.se/ + cfp: '2022-09-11 23:59:59' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2022-11-03 + end: 2022-11-04 + sponsor: https://pycon.se/#sponsorship + sub: PY + location: + - title: PyCon Sweden 2022 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2022 + link: https://pl.pycon.org/2022/ + cfp: '2022-08-13 23:59:00' + timezone: Europe/Warsaw + place: Gliwice, Poland + start: 2022-11-03 + end: 2022-11-06 + sub: PY + location: + - title: PyCon Poland 2022 + latitude: 50.294113 + longitude: 18.6657306 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2022 + link: https://pycon.hk/2022/ + cfp: '2022-09-05 23:59:00' + place: Hong Kong, Hong Kong + start: 2022-10-29 + end: 2022-10-29 + sub: PY + location: + - title: PyCon Hong Kong 2022 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: Piter Py + alt_name: PiterPy + year: 2022 + link: https://web.archive.org/web/20220628045535/https://piterpy.com/en/ + cfp_link: https://web.archive.org/web/20220524162310/https://piterpy.com/en/callforpapers/ + cfp: '2022-06-30 23:59:00' + place: Saint Petersburg, Russia + start: 2022-10-28 + end: 2022-10-28 + sub: PY + location: + - title: Piter Py 2022 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: Python at Scale + year: 2022 + link: https://web.archive.org/web/20221120131604/https://www.pythonatscale.com/ + cfp: '2022-08-01 23:59:59' + timezone: America/Chicago + place: Austin, USA + start: 2022-10-27 + end: 2022-10-29 + sub: PY + location: + - title: Python at Scale 2022 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: enterPy + year: 2022 + link: https://www.enterpy.de/ + cfp: '2022-06-27 23:59:00' + place: Heidelberg, Germany + start: 2022-10-25 + end: 2022-10-25 + sub: BIZ + location: + - title: enterPy 2022 + latitude: 49.4093582 + longitude: 8.694724 + +- conference: Python Brasil + alt_name: PythonBrasil + year: 2022 + link: https://web.archive.org/web/20211016000321/http://2022.pythonbrasil.org.br/ + cfp_link: https://pretalx.com/python-brasil-2022/cfp + cfp: '2022-07-03 23:59:00' + cfp_ext: '2022-07-08 23:59:00' + place: Manaus, Brazil + start: 2022-10-17 + end: 2022-10-23 + sub: PY + location: + - title: Python Brasil 2022 + latitude: -3.1316333 + longitude: -59.9825041 + +- conference: PyCon Brazil + year: 2022 + link: https://2022.pythonbrasil.org.br/ + cfp: '2022-07-03 23:59:00' + timezone: America/Manaus + place: Manaus, Brazil + start: 2022-10-17 + end: 2022-10-23 + sub: PY + location: + - title: PyCon Brazil 2022 + latitude: -3.1316333 + longitude: -59.9825041 + +- conference: DjangoCon US + year: 2022 + link: https://2022.djangocon.us/ + cfp: '2022-06-11 07:31:00' + timezone: America/Los_Angeles + place: San Diego, USA + start: 2022-10-16 + end: 2022-10-21 + sub: WEB + location: + - title: DjangoCon US 2022 + latitude: 32.7174202 + longitude: -117.1627728 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2022 + link: https://2022.pycon.jp/ + cfp: '2022-06-12 23:59:59' + place: Tokyo, Japan + start: 2022-10-14 + end: 2022-10-16 + sub: PY + location: + - title: PyCon Japan 2022 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2022 + link: https://za.pycon.org/ + cfp: '2022-08-19 23:59:00' + place: Durban, South Africa + start: 2022-10-13 + end: 2022-10-14 + sub: PY + location: + - title: PyCon South Africa 2022 + latitude: -29.861825 + longitude: 31.009909 + +- conference: PyCon Ghana + year: 2022 + link: https://gh.pycon.org/ + cfp_link: https://gh.pycon.org/talks/speaking + cfp: '2022-08-08 23:59:00' + timezone: Africa/Accra + place: Accra, Ghana + start: 2022-10-13 + end: 2022-10-15 + sponsor: https://gh.pycon.org/support-us/ + sub: PY + location: + - title: PyCon Ghana 2022 + latitude: 5.5571096 + longitude: -0.2012376 + +- conference: Plone Conference + year: 2022 + link: https://2022.ploneconf.org/ + cfp_link: https://plone.org/news-and-events/news/2022/plone-conference-2022-call-for-papers-open + cfp: '2022-09-12 23:59:00' + place: Namur, Belgium + start: 2022-10-10 + end: 2022-10-16 + sub: WEB + location: + - title: Plone Conference 2022 + latitude: 50.4665284 + longitude: 4.8661892 + +- conference: PyCon South Korea + alt_name: PyCon Korea + year: 2022 + link: https://web.archive.org/web/20221001033348/https://2022.pycon.kr/ + cfp: '2022-07-14 23:59:00' + timezone: Asia/Seoul + place: Seoul, South Korea + start: 2022-10-01 + end: 2022-10-02 + sub: PY + location: + - title: PyCon South Korea 2022 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2022 + link: https://2022.es.pycon.org/ + cfp: '2022-05-31 23:59:59' + timezone: Europe/Madrid + place: Granada, Spain + start: 2022-09-30 + end: 2022-10-03 + sub: PY + location: + - title: PyCon Spain 2022 + latitude: 37.1734995 + longitude: -3.5995337 + +- conference: SciPy Latin America + year: 2022 + link: https://pythoncientifico.ar/ + cfp_link: https://pythoncientifico.ar/pages/llamado-a-propuestas/ + cfp: '2022-08-31 23:59:00' + timezone: America/Argentina/Buenos_Aires + place: Salta, Argentina + start: 2022-09-26 + end: 2022-09-28 + sponsor: https://web.archive.org/web/20220901114721/https://pythoncientifico.ar/sponsors + sub: SCIPY + location: + - title: SciPy Latin America 2022 + latitude: -25.1076701 + longitude: -64.3494964 + +- conference: PyCon Portugal + year: 2022 + link: https://2022.pycon.pt/ + cfp_link: https://2022.pycon.pt/talks/cfp/ + cfp: '2022-06-30 23:59:00' + tutorial_deadline: '2022-06-30 23:59:00' + timezone: Europe/Lisbon + place: Porto, Portugal + start: 2022-09-24 + end: 2022-09-25 + sponsor: https://2022.pycon.pt/sponsors/sponsorship/ + sub: PY + location: + - title: PyCon Portugal 2022 + latitude: 41.1494512 + longitude: -8.6107884 + +- conference: PyData Miami + year: 2022 + link: https://web.archive.org/web/20220926183127/http://pydata.org/miami2022/ + cfp: '2022-08-08 23:59:00' + timezone: America/New_York + place: Miami, USA + start: 2022-09-22 + end: 2022-09-22 + sub: DATA + location: + - title: PyData Miami 2022 + latitude: 25.7741728 + longitude: -80.19362 + +- conference: DjangoCon Europe + year: 2022 + link: https://2022.djangocon.eu/ + cfp: '2022-05-31 23:59:00' + timezone: Europe/Lisbon + place: Porto, Portugal + start: 2022-09-21 + end: 2022-09-25 + sub: WEB + location: + - title: DjangoCon Europe 2022 + latitude: 41.1494512 + longitude: -8.6107884 + +- conference: PyCon UK + year: 2022 + link: https://2022.pyconuk.org/ + cfp_link: https://2022.pyconuk.org/call-for-proposals/ + cfp: '2022-07-02 17:00:00' + timezone: Europe/London + place: Cardiff, UK + start: 2022-09-16 + end: 2022-09-18 + sponsor: https://2022.pyconuk.org/sponsors/ + finaid: https://2022.pyconuk.org/financial-assistance/ + sub: PY + location: + - title: PyCon UK 2022 + latitude: 51.4816546 + longitude: -3.1791934 + +- conference: PyHEP + year: 2022 + link: https://indico.cern.ch/event/1150631/ + cfp: '2022-08-17 23:59:00' + place: Online + start: 2022-09-12 + end: 2022-09-16 + sub: SCIPY + +- conference: PyBay + year: 2022 + link: https://web.archive.org/web/20220901001232/http://pybay.com/ + cfp: '2022-06-29 23:59:00' + timezone: America/Los_Angeles + place: San Francisco, USA + start: 2022-09-10 + end: 2022-09-11 + sponsor: https://web.archive.org/web/20221002151717/https://pybay.com/sponsors-prospectus/ + sub: PY + location: + - title: PyBay 2022 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyCon Slovakia + alt_name: PyCon SK + year: 2022 + link: https://2022.pycon.sk/en/ + cfp: '2022-06-30 23:59:59' + timezone: Europe/Bratislava + place: Bratislava, Slovakia + start: 2022-09-09 + end: 2022-09-11 + sub: PY + location: + - title: PyCon Slovakia 2022 + latitude: 48.1516988 + longitude: 17.1093063 + +- conference: PyCon Asia Pacific + alt_name: PyCon Taiwan + year: 2022 + link: https://tw.pycon.org/2022/en-us/ + cfp: '2022-04-15 23:59:59' + place: Online + start: 2022-09-03 + end: 2022-09-04 + sub: PY + +- conference: EuroSciPy + year: 2022 + link: https://www.euroscipy.org/2022/ + cfp_link: https://pretalx.com/euroscipy-2022/cfp + cfp: '2022-06-13 23:59:59' + tutorial_deadline: '2022-05-30 23:59:00' + timezone: Europe/Zurich + place: Basel, Switzerland + start: 2022-08-29 + end: 2022-09-02 + sponsor: https://www.euroscipy.org/2022/sponsoring.html + finaid: https://www.euroscipy.org/2022/finaid.html + sub: SCIPY + location: + - title: EuroSciPy 2022 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: Python Nordeste + year: 2022 + link: https://2022.pythonnordeste.org/ + cfp: '2022-06-04 23:59:00' + place: Aracaju, Brazil + start: 2022-08-26 + end: 2022-08-28 + twitter: PythonNordeste + sub: PY + location: + - title: Python Nordeste 2022 + latitude: -10.9162061 + longitude: -37.0774655 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2022 + link: https://web.archive.org/web/20220801000000*/https://pycon.ee/ + cfp: '2022-04-01 23:59:59' + timezone: Europe/Tallinn + place: Tallinn, Estonia + start: 2022-08-25 + end: 2022-08-25 + sub: PY + location: + - title: PyCon Estonia 2022 + latitude: 59.4372155 + longitude: 24.7453688 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2022 + link: https://2022.pycon.org.au/ + cfp: Cancelled + place: Online + start: 2022-08-19 + end: 2022-08-21 + sub: PY + note: Cancelled due to COVID-19 and Burnout + +- conference: Kiwi PyCon + alt_name: Kiwi PyCon XI + year: 2022 + link: https://web.archive.org/web/20220311104918/http://python.nz/kiwipycon + cfp: '2021-11-30 23:59:00' + timezone: Pacific/Auckland + place: Otautahi Christchurch, New Zealand + start: 2022-08-19 + end: 2022-08-21 + sub: PY + location: + - title: Kiwi PyCon 2022 + latitude: -43.530955 + longitude: 172.6364343 + +- conference: PyCon Armenia + alt_name: PyData Yerevan + year: 2022 + link: https://web.archive.org/web/20220812003726/http://pydata.org/yerevan2022/ + cfp: '2022-06-30 23:59:00' + timezone: Asia/Yerevan + place: Yerevan, Armenia + start: 2022-08-12 + end: 2022-08-13 + sub: DATA + location: + - title: PyData Yerevan 2022 + latitude: 40.1777112 + longitude: 44.5126233 + +- conference: PyOhio + year: 2022 + link: https://pyohio.org/2022 + cfp_link: https://pyohio.org/2022/speaking/call-for-proposals + cfp: '2022-05-15 23:59:00' + place: Columbus, USA + start: 2022-07-30 + end: 2022-07-30 + sub: PY + location: + - title: PyOhio 2022 + latitude: 39.9622601 + longitude: -83.0007065 + +- conference: PyCon Russia + year: 2022 + link: https://web.archive.org/web/20220330120305/http://www.pycon.ru/ + cfp_link: https://web.archive.org/web/20220330120305/http://www.pycon.ru/cfp + cfp: '2022-05-10 23:59:00' + place: Moscow, Russia + start: 2022-07-30 + end: 2022-07-31 + sponsor: https://web.archive.org/web/20220330120305/https://pycon.ru/partneram + sub: PY + location: + - title: PyCon Russia 2022 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: EuroPython + year: 2022 + link: https://ep2022.europython.eu/ + cfp: '2022-04-03 23:59:59' + place: Dublin, Ireland + start: 2022-07-11 + end: 2022-07-17 + sub: PY + location: + - title: EuroPython 2022 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: SciPy US + alt_name: SciPy + year: 2022 + link: https://conference.scipy.org/ + cfp: '2022-02-22 23:59:00' + timezone: America/Chicago + place: Austin, USA + start: 2022-07-11 + end: 2022-07-17 + sub: SCIPY + location: + - title: SciPy US 2022 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyCon Colombia + year: 2022 + link: https://2022.pycon.co/ + cfp: '2022-04-30 23:59:59' + timezone: America/Bogota + place: Online + start: 2022-07-09 + end: 2022-07-10 + sub: PY + +- conference: PyCon Israel + year: 2022 + link: https://web.archive.org/web/20220629094715/https://pycon.org.il/2022/ + cfp: '2022-04-30 23:59:59' + timezone: Asia/Jerusalem + place: Ramat-Gan, Israel + start: 2022-06-28 + end: 2022-06-29 + sub: PY + location: + - title: PyCon Israel 2022 + latitude: 32.0686867 + longitude: 34.8246812 + +- conference: GeoPython + year: 2022 + link: https://2022.geopython.net/ + cfp_link: https://web.archive.org/web/20220301062005/https://submit.geopython.net/geopython-2022/cfp + cfp: '2022-02-28 12:00:00' + cfp_ext: '2022-03-15 23:59:00' + tutorial_deadline: '2022-02-15 23:59:00' + timezone: Europe/Zurich + place: Basel, Switzerland + start: 2022-06-20 + end: 2022-06-22 + sub: GEO + location: + - title: GeoPython 2022 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: PyData London + year: 2022 + link: https://web.archive.org/web/20220606165926/https://pydata.org/london2022/ + cfp: '2022-04-25 23:59:00' + place: London, UK + start: 2022-06-17 + end: 2022-06-19 + sponsor: https://web.archive.org/web/20220526121203/https://pydata.org/london2022/sponsors/ + sub: DATA + location: + - title: PyData London 2022 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: Wagtail Space Netherlands + year: 2022 + link: https://web.archive.org/web/20220622065405/https://www.wagtail.space/2022/ + cfp: '2022-05-30 23:59:00' + place: Arnhem, Netherlands + start: 2022-06-15 + end: 2022-06-17 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space Netherlands 2022 + latitude: 51.984257 + longitude: 5.9108573 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2022 + link: https://pycon.it/en + cfp: '2022-01-16 23:59:59' + place: Florence, Italy + start: 2022-06-02 + end: 2022-06-06 + sub: PY + location: + - title: PyCon Italia 2022 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Lithuania + alt_name: PyCon LT + year: 2022 + link: https://pycon.lt/ + cfp: '2022-05-07 23:59:00' + timezone: Europe/Vilnius + place: Vilnius, Lithuania + start: 2022-05-26 + end: 2022-05-28 + sub: PY + location: + - title: PyCon Lithuania 2022 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: PyCon Kenya + year: 2022 + link: https://web.archive.org/web/20220325212423/https://www.pyconke.org/ + cfp: '2022-04-15 23:59:59' + timezone: Africa/Nairobi + place: Nairobi, Kenia + start: 2022-05-06 + end: 2022-05-08 + sub: PY + location: + - title: PyCon Kenya 2022 + latitude: -1.2832533 + longitude: 36.8172449 + +- conference: PyCon US + year: 2022 + link: https://us.pycon.org/2022/ + cfp: '2021-12-20 23:59:00' + place: Salt Lake City, USA + start: 2022-04-27 + end: 2022-05-06 + sub: PY + location: + - title: PyCon US 2022 + latitude: 40.7596198 + longitude: -111.886797 + +- conference: PyCamp España + year: 2022 + link: https://pycamp.es/ + cfp: '2022-03-15 23:59:00' + place: Girona, Spain + start: 2022-04-15 + end: 2022-04-19 + sub: CAMP + location: + - title: PyCamp España 2022 + latitude: 41.9793006 + longitude: 2.8199439 + +- conference: PyCon Germany & PyData Berlin + alt_name: PyCon DE & PyData Berlin + year: 2022 + link: https://2022.pycon.de/ + cfp_link: https://2022.pycon.de/call-for-proposals/ + cfp: '2022-01-16 23:59:59' + tutorial_deadline: '2022-01-16 23:59:00' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2022-04-11 + end: 2022-04-14 + sponsor: https://2022.pycon.de/blog/pyconde-pydata-berlin-call-for-sponsors/ + sub: PY,DATA + location: + - title: PyCon Germany & PyData Berlin 2022 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: Django Day Copenhagen + year: 2022 + link: https://2022.djangoday.dk/ + cfp: '2022-03-01 23:59:59' + timezone: Europe/Copenhagen + place: Copenhagen, Denmark + start: 2022-04-08 + end: 2022-04-09 + sub: WEB,DAY + location: + - title: Django Day Copenhagen 2022 + latitude: 55.6867243 + longitude: 12.5700724 + +- conference: PyTexas + year: 2022 + link: https://web.archive.org/web/20220131171842/https://www.pytexas.org/ + cfp: '2022-01-13 23:59:00' + place: Austin, USA + start: 2022-03-26 + end: 2022-03-27 + sub: PY + location: + - title: PyTexas 2022 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: Wagtail Space US + year: 2022 + link: https://web.archive.org/web/20220521162958/https://us.wagtail.space/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSf_sI1IhJEeYzKthm56bL0MjGIdFUaeMHrclVYd1LnG5x78LQ/closedform + cfp: '2022-02-28 23:59:00' + place: Cleveland, USA + start: 2022-03-24 + end: 2022-03-26 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space US 2022 + latitude: 41.4996574 + longitude: -81.6936772 + +- conference: PyCamp Argentina + year: 2022 + link: https://wiki.python.org.ar/PyCamp/2022/ + cfp: None + place: Baradero, Argentina + start: 2022-03-24 + end: 2022-03-27 + sub: CAMP + location: + - title: PyCamp Argentina 2022 + latitude: -33.8120471 + longitude: -59.5051759 + +- conference: Python Web Conference + year: 2022 + link: https://pythonwebconference.com/ + cfp: '2021-11-01 23:59:59' + timezone: UTC+0 + place: Online + start: 2022-03-21 + end: 2022-03-26 + sub: WEB + +- conference: PyCon Sri Lanka + year: 2022 + link: https://web.archive.org/web/20220220183035/http://pycon.lk/ + cfp: '2021-12-31 23:59:00' + place: Online + start: 2022-02-22 + end: 2022-02-22 + sub: PY + +- conference: PyCon Iran + alt_name: Iran PyCon + year: 2022 + link: https://ir.pycon.org/?lang=en + cfp: Cancelled + timezone: Asia/Tehran + place: Online + start: 2022-02-16 + end: 2022-02-19 + sub: PY + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2022 + link: https://fosdem.org/2022/schedule/track/python/ + cfp: '2021-12-24 23:59:00' + place: Online + start: 2022-02-05 + end: 2022-02-06 + sub: PY + +- conference: PyCascades + year: 2022 + link: https://2022.pycascades.com/ + cfp: '2021-10-24 23:59:59' + place: Online + start: 2022-02-05 + end: 2022-02-07 + sub: PY + note: Remote + +- conference: PyCamp Leipzig + year: 2022 + link: https://barcamps.eu/pycamp-leipzig-2022/ + cfp: '2022-01-28 23:59:00' + place: Leipzig, Germany + start: 2022-01-29 + end: 2022-01-30 + sub: CAMP + location: + - title: PyCamp Leipzig 2022 + latitude: 51.3406321 + longitude: 12.3747329 + +- conference: PyCon Kyushu Kumamoto + alt_name: PyCon Kyushu + year: 2022 + link: https://kyushu.pycon.jp/2022/ + cfp: '2021-11-21 14:59:00' + timezone: UTC + place: Kumamoto, Japan + start: 2022-01-22 + end: 2022-01-22 + sub: PY + location: + - title: PyCon Kyushu Kumamoto 2022 + latitude: 32.6450475 + longitude: 130.6341345 + +- conference: SciPy India + year: 2021 + link: https://scipy.in/2021 + cfp: '2022-01-07 23:59:00' + timezone: Asia/Kolkata + place: Online + start: 2022-01-21 + end: 2022-01-22 + sub: SCIPY + +- conference: SciPy Latin America + alt_name: SciPyLA + year: 2021 + link: https://web.archive.org/web/20210518213755/http://conf.scipyla.org/scipyla2021/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSdXpPK5sWqpz_MWTkxPiXQVH4-XdS4gmqPRFO3NCv6_1Bo84g/viewform?usp=send_form + cfp: '2021-11-12 23:59:00' + place: Online + start: 2021-12-11 + end: 2021-12-12 + sub: SCIPY + +- conference: Pyjamas Conf + year: 2021 + link: https://pyjamas.live/ + cfp: '2021-09-05 23:59:00' + cfp_ext: '2021-09-19 23:59:00' + place: Online + start: 2021-12-05 + end: 2021-12-05 + sub: PY + +- conference: PyCon Indonesia + alt_name: PyCon ID + year: 2021 + link: https://web.archive.org/web/20210904043050/http://pycon.id/ + cfp: '2021-10-31 23:59:00' + place: Online + start: 2021-12-04 + end: 2021-12-05 + sponsor: https://web.archive.org/web/20210904043050/http://pycon.id/sponsorship/ + sub: PY + location: + - latitude: -2.4833826 + longitude: 117.8902853 + +- conference: PyCode Conference + year: 2021 + link: https://web.archive.org/web/20210801205817/https://pycode-conference.org/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSdSteyb-qDJu3BKaj1RBlV0pzatZgiRg9ftVz4-7-7kunMcbA/viewform + cfp: '2021-11-20 23:59:00' + place: Online + start: 2021-12-02 + end: 2021-12-03 + finaid: https://docs.google.com/forms/d/e/1FAIpQLSf8dqx3IMndirf9ny1yMfP7GMcOFnv7b3kaK7MFGu0qb2VO6g/closedform + sub: PY + +- conference: PyCon Tanzania + alt_name: Python Tanzania Conference + year: 2021 + link: https://web.archive.org/web/20221202222503/https://pycon.or.tz/2021/ + cfp: '2021-11-15 23:59:00' + place: Dar Es Salaam, Tanzania + start: 2021-12-01 + end: 2021-12-04 + sub: PY + location: + - title: PyCon Tanzania 2021 + latitude: -6.8160837 + longitude: 39.2803583 + +- conference: Flask Con + year: 2021 + link: https://web.archive.org/web/20211130204922/http://flaskcon.com/y/2021/ + cfp: '2021-11-04 00:00:00' + timezone: GMT + place: Online + start: 2021-12-01 + end: 2021-12-04 + sub: WEB + location: + - latitude: -33.8938107 + longitude: 151.2621478 + +- conference: Xtreme Python + year: 2021 + link: https://xtremepython.dev/2021/ + cfp: '2021-11-01 23:59:00' + place: Online + start: 2021-11-25 + end: 2021-11-25 + sub: PY + note: No formal CfP, but you can submit a talk proposal via the website + +- conference: PyCamp Argentina + year: 2021 + link: https://wiki.python.org.ar/PyCamp/2021/ + cfp: None + place: San Rafael, Argentina + start: 2021-11-20 + end: 2021-11-23 + sub: CAMP + location: + - title: PyCamp Argentina 2021 + latitude: -34.6126025 + longitude: -68.330514 + +- conference: PyCon Asia Pacific + alt_name: PyCon Thailand + year: 2021 + link: https://2021.th.pycon.org/ + cfp_link: https://www.papercall.io/pyconapac + cfp: '2021-08-21 23:30:00' + timezone: UTC + place: Bangkok, Thailand + start: 2021-11-20 + end: 2021-11-21 + sub: PY + location: + - title: PyCon Asia Pacific 2021 + latitude: 13.7524938 + longitude: 100.4935089 + +- conference: PyGrunn + year: 2021 + link: https://web.archive.org/web/20211028110307/https://pygrunn.org/ + cfp: '2021-10-01 23:59:00' + place: Groningen, Netherlands + start: 2021-11-12 + end: 2021-11-12 + sub: PY + location: + - title: PyGrunn 2021 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyData Eindhoven + year: 2021 + link: https://web.archive.org/web/20210802123801/https://eindhoven.pydata.org/ + cfp_link: https://web.archive.org/web/20210923202412/https://pydata.org/eindhoven2021/present/ + cfp: '2021-09-26 23:59:00' + place: Online + start: 2021-11-12 + end: 2021-11-12 + sub: DATA + +- conference: PyCon Chile + year: 2021 + link: https://web.archive.org/web/20220925074609/https://pycon.cl/2021/ + cfp: '2021-08-31 23:59:00' + cfp_ext: '2021-09-12 23:59:00' + timezone: America/Santiago + place: Online + start: 2021-11-05 + end: 2021-11-07 + sub: PY + +- conference: PyData Global + year: 2021 + link: https://web.archive.org/web/20211028140235/http://pydata.org/global2021/ + cfp_link: https://web.archive.org/web/20211129200537/https://pydata.org/global2021/present/ + cfp: '2021-08-15 23:59:00' + tutorial_deadline: '2021-08-15 23:59:00' + place: Online + start: 2021-10-28 + end: 2021-10-31 + sponsor: https://web.archive.org/web/20211017042901/https://pydata.org/global2021/sponsor/ + sub: DATA + +- conference: Plone Conference + year: 2021 + link: https://2021.ploneconf.org/ + cfp_link: https://2021.ploneconf.org/cfp + cfp: '2021-10-23 23:59:00' + place: Online + start: 2021-10-23 + end: 2021-10-31 + sub: WEB + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2021 + link: https://www.pycon.se/2021/ + cfp: '2021-09-05 23:59:00' + timezone: Europe/Stockholm + place: Online + start: 2021-10-21 + end: 2021-10-22 + twitter: PyConSE + sub: PY + +- conference: PyCon China + year: 2021 + link: https://web.archive.org/web/20210927124755/http://cn.pycon.org/2021/ + cfp: '2021-09-01 23:59:00' + place: Online + start: 2021-10-16 + end: 2021-10-17 + sub: PY + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2021 + link: https://2021.pycon.jp/ + cfp: '2021-07-10 23:59:00' + place: Tokyo, Japan + start: 2021-10-15 + end: 2021-10-16 + sub: PY + location: + - title: PyCon Japan 2021 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Germany & PyData Berlin + alt_name: PyCon DE & PyData Berlin + year: 2021 + link: https://2021.de.pycon.org/ + cfp: Cancelled + place: Berlin, Germany + start: 2021-10-14 + end: 2021-10-17 + sub: PY + note: Cancelled due to Covid + location: + - title: PyCon Germany & PyData Berlin 2021 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: Python Brasil + alt_name: PythonBrasil + year: 2021 + link: https://web.archive.org/web/20210723070931/http://2021.pythonbrasil.org.br/ + cfp: '2021-08-12 23:59:00' + place: Online + start: 2021-10-11 + end: 2021-10-17 + sub: PY + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2021 + link: https://pycon.hk/2021/ + cfp_link: https://forms.gle/roP6WDYGYK61eKX16 + cfp: '2021-06-14 23:59:00' + cfp_ext: '2021-06-30' + place: Hong Kong, Hong Kong + start: 2021-10-08 + end: 2021-10-09 + sub: PY + location: + - title: PyCon Hong Kong 2021 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2021 + link: https://2021.za.pycon.org/ + cfp: '2021-08-16 23:59:00' + place: Online + start: 2021-10-07 + end: 2021-10-08 + sub: PY + +- conference: PyCon South Korea + alt_name: PyCon Korea + year: 2021 + link: https://www.pycon.kr/2021/ + cfp: '2021-06-30 23:59:00' + place: Online + start: 2021-10-02 + end: 2021-10-03 + sub: PY + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2021 + link: https://2021.es.pycon.org/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSeNa71Fi9w8tppJlYoACnBVf5GB2ywU9lfJiHO0Aj0lmamwlQ/closedform + cfp: '2021-05-02 23:59:00' + cfp_ext: '2021-05-16' + place: Online + start: 2021-10-02 + end: 2021-10-03 + sub: PY + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2021 + link: https://web.archive.org/web/20211003092837/https://tw.pycon.org/2021/en-us + cfp: '2021-04-26 23:59:59' + place: Online + start: 2021-10-02 + end: 2021-10-03 + sub: PY + +- conference: PyGotham TV + year: 2021 + link: https://2021.pygotham.tv/ + cfp: '2021-05-21 23:59:00' + place: Online + start: 2021-10-01 + end: 2021-10-02 + sub: PY + +- conference: PyCon India + year: 2021 + link: https://in.pycon.org/2021/ + cfp: '2021-05-07 23:59:00' + timezone: Asia/Kolkata + place: Online + start: 2021-09-17 + end: 2021-09-21 + sub: PY + +- conference: PyCon Odessa + year: 2021 + link: https://pyconodessa.com/en/ + cfp: '2021-08-20 00:00:00' + timezone: UTC + place: Odessa, Ukraine + start: 2021-09-11 + end: 2021-09-12 + sub: PY + location: + - title: PyCon Odessa 2021 + latitude: 46.4843023 + longitude: 30.7322878 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2021 + link: https://2021.pycon.org.au/ + cfp: '2021-07-11 23:59:00' + place: Online + start: 2021-09-10 + end: 2021-09-12 + sub: PY + +- conference: PyCon Russia + year: 2021 + link: https://web.archive.org/web/20210715073901/https://pycon.ru/ + cfp: '2021-06-15 23:59:00' + place: Tarusa, Russia + start: 2021-09-05 + end: 2021-09-06 + sub: PY + location: + - title: PyCon Russia 2021 + latitude: 54.7293536 + longitude: 37.1815538 + +- conference: PyOhio + year: 2021 + link: https://www.pyohio.org/2021/ + cfp_link: https://pyohio.org/cfp + cfp: '2021-05-02 23:59:00' + place: Columbus, USA + start: 2021-07-31 + end: 2021-08-01 + sub: PY + location: + - title: PyOhio 2021 + latitude: 39.9622601 + longitude: -83.0007065 + +- conference: EuroPython + year: 2021 + link: https://www.europython.eu/ + cfp: '2021-05-12 23:59:59' + timezone: Europe/Zurich + place: Online + start: 2021-07-26 + end: 2021-08-02 + sponsor: https://us.pycon.org/2021/sponsorship/why-sponsor + sub: PY + +- conference: Python Nordeste + year: 2021 + link: https://2020.pythonnordeste.org/ + cfp_link: https://web.archive.org/web/20210516000954/https://speakerfight.com/events/python-nordeste-2020-palestras/ + cfp: '2021-03-10 23:59:00' + timezone: America/Recife + place: Online + start: 2021-07-16 + end: 2021-07-18 + twitter: pythonnordeste + sub: PY + +- conference: SciPy US + alt_name: SciPy + year: 2021 + link: https://www.scipy2021.scipy.org/ + cfp: '2021-02-22 23:59:00' + timezone: America/Chicago + place: Austin, US + start: 2021-07-12 + end: 2021-07-19 + sub: SCIPY + location: + - title: SciPy US 2021 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyHEP + year: 2021 + link: https://indico.cern.ch/event/1019958/ + cfp: '2021-06-09 23:59:00' + place: Online + start: 2021-07-05 + end: 2021-07-09 + sub: SCIPY + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2021 + link: https://web.archive.org/web/20230331212743/https://na.pycon.org/2021/ + cfp: '2021-04-11 23:59:00' + place: Windhoek, Namibia + start: 2021-06-18 + end: 2021-06-18 + sub: PY + location: + - title: PyCon Namibia 2021 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: DjangoCon Europe + year: 2021 + link: https://2021.djangocon.eu/ + cfp_link: https://2021.djangocon.eu/talks/cfp/ + cfp: '2021-04-01 23:59:00' + tutorial_deadline: '2021-04-01 23:59:00' + place: Porto, Portugal + start: 2021-06-02 + end: 2021-06-06 + sponsor: https://2021.djangocon.eu/sponsors/sponsorships/ + sub: WEB + location: + - title: DjangoCon Europe 2021 + latitude: 41.1494512 + longitude: -8.6107884 + +- conference: PyCon US + year: 2021 + link: https://us.pycon.org/2021/ + cfp_link: https://web.archive.org/web/20210428000634/https://us.pycon.org/2021/speaking/talks/ + cfp: '2021-02-12 23:59:00' + tutorial_deadline: '2021-02-12 23:59:00' + place: Online + start: 2021-05-12 + end: 2021-05-21 + sponsor: https://us.pycon.org/2021/sponsorship/why-sponsor + sub: PY + +- conference: PyCon Israel + year: 2021 + link: https://web.archive.org/web/20210629094715/https://pycon.org.il/2022/ + cfp: '2021-04-01 23:59:59' + timezone: Asia/Jerusalem + place: Ramat-Gan, Israel + start: 2021-05-02 + end: 2021-05-03 + sub: PY + location: + - title: PyCon Israel 2021 + latitude: 32.0686867 + longitude: 34.8246812 + +- conference: GeoPython + year: 2021 + link: https://2021.geopython.net/ + cfp_link: https://submit.geopython.net/gp2021/cfp + cfp: '2021-01-25 23:59:00' + tutorial_deadline: '2021-01-31 23:59:00' + place: Basel, Switzerland + start: 2021-04-22 + end: 2021-04-23 + sub: GEO + location: + - title: GeoPython 2021 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: Python for ML and AI Global Summit + year: 2021 + link: https://web.archive.org/web/20220106000100/https://wp.geekle.us/python + cfp_link: https://forms.gle/ryKkiJtqBgs6zT119 + cfp: '2021-03-30 23:59:00' + place: Online + start: 2021-04-08 + end: 2021-04-09 + sub: PY + +- conference: Python Web Conference + year: 2021 + link: https://pythonwebconference.com/ + cfp: '2021-01-29 15:03:00' + timezone: UTC + place: Online + start: 2021-03-22 + end: 2021-03-26 + sub: WEB + +- conference: PyCon Belarus + year: 2021 + link: https://web.archive.org/web/20210223084649/https://by.pycon.org/ + cfp: '2021-02-12 23:59:00' + place: Online + start: 2021-03-13 + end: 2021-03-13 + sub: PY + +- conference: enterPy + year: 2021 + link: https://www.enterpy.de/ + cfp_link: https://web.archive.org/web/20201209094935/https://www.enterpy.de/call_for_proposals.php + cfp: '2021-01-18 23:59:00' + place: Online + start: 2021-03-09 + end: 2021-03-09 + sub: BIZ + +- conference: PyCascades + year: 2021 + link: https://2021.pycascades.com/ + cfp_link: https://www.youtube.com/watch?v=p3AIkpkad6E + cfp: '2020-11-15 23:59:00' + place: Online + start: 2021-02-19 + end: 2021-02-21 + sponsor: https://2021.pycascades.com/sponsors/become-a-sponsor/ + sub: PY + +- conference: PyCon Iran + alt_name: Iran PyCon + year: 2021 + link: https://web.archive.org/web/20211021094358/http://2021.pycon.ir/ + cfp: '2021-02-04 23:59:00' + place: Tehran, Iran + start: 2021-02-16 + end: 2021-02-18 + sub: PY + location: + - title: PyCon Iran 2021 + latitude: 35.6892523 + longitude: 51.3896004 + +- conference: BelPy + year: 2021 + link: https://belpy.in/ + cfp_link: https://web.archive.org/web/20210301200242/https://www.papercall.io/belpy + cfp: '2020-12-07 11:59:00' + timezone: UTC + place: Online + start: 2021-01-30 + end: 2021-01-31 + sub: PY + +- conference: SciPy India + year: 2020 + link: https://web.archive.org/web/20201005212148/http://scipy.in/2020 + cfp: '2020-12-11 23:59:00' + place: Mumbai, India + start: 2020-12-19 + end: 2020-12-20 + sub: SCIPY + location: + - title: SciPy India 2020 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: PyCon Tanzania + alt_name: Python Tanzania Conference + year: 2020 + link: https://web.archive.org/web/20201101054537/https://pycon.or.tz/ + cfp_link: https://web.archive.org/web/20201101062346/http://www.pycon.or.tz/speak/index.html + cfp: '2020-10-24 23:59:00' + place: Dar es Salaam, Tanzania + start: 2020-12-14 + end: 2020-12-16 + sub: PY + location: + - title: PyCon Tanzania 2020 + latitude: -6.8160837 + longitude: 39.2803583 + +- conference: PyCode Conference + year: 2020 + link: https://web.archive.org/web/20200801205817/https://pycode-conference.org/ + cfp_link: https://web.archive.org/web/20210127221022/https://eventil.com/events/pycode-conference-2020/cfp + cfp: '2020-11-22 23:59:00' + place: Online + start: 2020-12-11 + end: 2020-12-12 + sub: PY + +- conference: PyConf Hyderabad + year: 2020 + link: https://pyconf.hydpy.org/2020/ + cfp_link: https://www.papercall.io/pyconf-hyd-2020 + cfp: '2020-11-10 23:42:00' + timezone: UTC + place: Online + start: 2020-12-05 + end: 2020-12-06 + sub: PY + +- conference: PyDay Chile + year: 2020 + link: https://pydhttps//web.archive.org/web/20201103151233/https://pyday.cl/ay.cl/ + cfp: '2020-11-18 23:59:00' + place: Online + start: 2020-12-05 + end: 2020-12-05 + sub: DAY + +- conference: Plone Conference + year: 2020 + link: https://2020.ploneconf.org/ + cfp: '2020-09-22 23:59:00' + place: Online + start: 2020-12-05 + end: 2020-12-13 + sub: WEB + +- conference: Pyjamas Conf + year: 2020 + link: https://web.archive.org/web/20201124170628/https://pyjamas.live/ + cfp: '2020-09-05 23:59:00' + place: Online + start: 2020-12-05 + end: 2020-12-05 + sub: PY + +- conference: PyData Taipei + year: 2020 + link: https://pydata.org/taipei2020 + cfp: '2020-06-30 23:59:00' + place: Online + start: 2020-11-27 + end: 2020-11-29 + sub: DATA + +- conference: enterPy + year: 2020 + link: https://www.enterpy.de/ + cfp_link: https://web.archive.org/web/20200401110541/https://www.enterpy.de/call_for_proposals.php + cfp: '2020-01-31 23:59:00' + place: Online + start: 2020-11-23 + end: 2020-11-24 + sub: BIZ + note: The conference was held online due to the COVID-19 pandemic. + location: + - title: enterPy 2020 + latitude: 49.4093582 + longitude: 8.694724 + +- conference: PyHPC + year: 2020 + link: https://www.pyhpc.io/ + cfp: '2020-09-11 23:59:00' + cfp_ext: '2020-09-11 23:59:00' + place: Online + start: 2020-11-15 + end: 2020-11-16 + sub: SCIPY + +- conference: PyCon Indonesia + alt_name: PyCon ID + year: 2020 + link: https://web.archive.org/web/20200918233203/https://pycon.id/ + cfp: '2020-11-01 23:59:00' + place: Online + start: 2020-11-14 + end: 2020-11-15 + sub: PY + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2020 + link: https://www.pycon.se/2020/ + cfp: '2020-10-01 00:00:00' + timezone: Europe/Stockholm + place: Online + start: 2020-11-12 + end: 2020-11-13 + sub: PY + +- conference: PyData Global + year: 2020 + link: https://web.archive.org/web/20200803232804/https://global.pydata.org/ + cfp_link: https://web.archive.org/web/20200804225635/https://global.pydata.org/pages/cfp.html + cfp: '2020-08-02 23:59:00' + place: Online + start: 2020-11-11 + end: 2020-11-15 + sub: DATA + +- conference: PyCon Hong Kong Fall + alt_name: PyCon Hong Kong + year: 2020 + link: https://pycon.hk/2020-spring/ + cfp_link: https://forms.gle/oBuiNiLy51DrNkQU6 + cfp: '2020-09-30 23:59:00' + place: Hong Kong, Hong Kong + start: 2020-11-06 + end: 2020-11-07 + sub: PY + location: + - title: PyCon Hong Kong Fall 2020 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2020 + link: http://pycon.it/ + cfp: Cancelled + place: Florence, Italy + start: 2020-11-05 + end: 2020-11-08 + sub: PY + note: Cancelled due to COVID-19 + location: + - title: PyCon Italia 2020 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: Python Brasil + alt_name: PythonBrasil + year: 2020 + link: https://2020.pythonbrasil.org.br/ + cfp: Cancelled + place: Caxias do Sul, Brazil + start: 2020-11-02 + end: 2020-11-09 + sub: PY + note: Postponed to 2021 due to COVID-19 pandemic + location: + - title: Python Brasil 2020 + latitude: -29.1685045 + longitude: -51.1796385 + +- conference: PyData London + year: 2020 + link: https://web.archive.org/web/20201023053817/http://pydata.org/london2020/ + cfp: Cancelled + place: London, UK + start: 2020-10-30 + end: 2020-11-02 + sub: DATA + note: Cancelled due to Covid + location: + - title: PyData London 2020 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: SciPy Japan + year: 2020 + link: https://www.scipyjapan.scipy.org/ + cfp_link: https://easychair.org/cfp/scipyjapan2020 + cfp: '2020-07-08 23:59:00' + place: Online + start: 2020-10-30 + end: 2020-10-31 + sub: SCIPY + +- conference: PyCon France + alt_name: PyCon FR + year: 2020 + link: https://web.archive.org/web/20201025183354/http://www.pycon.fr/2020/ + cfp: Cancelled + place: Strasbourg, France + start: 2020-10-29 + end: 2020-11-01 + sub: PY + note: Cancelled due to COVID-19 + location: + - title: PyCon France 2020 + latitude: 48.584614 + longitude: 7.7507127 + +- conference: PyTexas + year: 2020 + link: https://www.pytexas.org/2020/ + cfp: '2019-02-14 23:59:00' + place: Online + start: 2020-10-24 + end: 2020-10-25 + sub: PY + +- conference: Swiss Python Summit + year: 2020 + link: https://web.archive.org/web/20200813000724/https://www.python-summit.ch/ + cfp: Cancelled + cfp_ext: '2019-10-31 23:59:00' + place: Rapperswil, Switzerland + start: 2020-10-23 + end: 2020-10-23 + sub: PY + note: Cancelled due to COVID-19 + location: + - title: Swiss Python Summit 2020 + latitude: 47.2266532 + longitude: 8.8164042 + +- conference: PyCon Germany & PyData Berlin + alt_name: PyCon DE & PyData Berlin + year: 2020 + link: https://de.pycon.org/ + cfp: Cancelled + cfp_ext: '2020-05-05 23:59:00' + place: Berlin, Germany + start: 2020-10-14 + end: 2020-10-16 + sub: PY + note: Cancelled due to Covid + location: + - title: PyCon Germany & PyData Berlin 2020 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: DjangoCon US + year: 2020 + link: https://web.archive.org/web/20200508100008/https://2020.djangocon.us + cfp: Cancelled + place: San Diego, USA + start: 2020-10-11 + end: 2020-10-16 + sub: WEB + location: + - title: DjangoCon US 2020 + latitude: 32.7174202 + longitude: -117.1627728 + +- conference: PyCon UK + year: 2020 + link: https://2020.pyconuk.org/ + cfp: Cancelled + timezone: Europe/London + place: Coventry, UK + start: 2020-10-10 + end: 2020-10-14 + sub: PY + note: Cancelled due to Covid-19 + location: + - title: PyCon UK 2020 + latitude: 52.4081812 + longitude: -1.510477 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2020 + link: https://web.archive.org/web/20200926040819/https://pycon.ee/ + cfp: '2020-04-15 23:59:00' + place: Online + start: 2020-10-08 + end: 2020-10-08 + sub: PY + +- conference: PyData Eindhoven + year: 2020 + link: https://pydata.org/eindhoven2020 + cfp: '2019-05-13 23:59:00' + timezone: Europe/Amsterdam + place: Online + start: 2020-10-07 + end: 2020-10-09 + sub: DATA + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2020 + link: https://2020.es.pycon.org/ + cfp_link: https://web.archive.org/web/20200825225439/https://2020.es.pycon.org/ + cfp: '2020-08-25 23:59:00' + place: Online + start: 2020-10-02 + end: 2020-10-03 + sub: PY + +- conference: PyCon India + year: 2020 + link: https://in.pycon.org/2020/ + cfp: '2020-08-14 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, Bengaluru + start: 2020-10-02 + end: 2020-10-05 + sub: PY + location: + - title: PyCon India 2020 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyGotham TV + year: 2020 + link: https://2020.pygotham.tv/ + cfp: '2020-07-05 23:59:00' + place: Online + start: 2020-10-02 + end: 2020-10-03 + sub: PY + +- conference: PyCon South Korea + alt_name: PyCon Korea + year: 2020 + link: https://www.pycon.kr/2020/ + cfp: '2020-07-14 23:59:00' + place: Online + start: 2020-09-26 + end: 2020-09-27 + sub: PY + +- conference: PyCon Turkey + year: 2020 + link: https://tr.pycon.org/ + cfp_link: https://www.papercall.io/pycon-turkey-2020 + cfp: '2020-01-19 23:59:00' + timezone: UTC + place: Online + start: 2020-09-26 + end: 2020-09-27 + sub: PY + +- conference: Django Day Copenhagen + year: 2020 + link: https://djangoday.dk/ + cfp: '2020-02-16 23:59:00' + place: Online & Copenhagen, Denmark + start: 2020-09-25 + end: 2020-09-26 + sub: WEB + +- conference: GeoPython + year: 2020 + link: https://web.archive.org/web/20200921164832/http://2020.geopython.net/ + cfp: '2020-03-15 23:59:00' + place: Online + start: 2020-09-21 + end: 2020-09-22 + sub: GEO + +- conference: DragonPy + year: 2020 + link: https://dragonpy.com/ + cfp: Cancelled + place: Ljubljana, Slovenia + start: 2020-09-19 + end: 2020-09-21 + sub: WEB,DATA + note: Cancelled due to COVID-19 + location: + - title: DragonPy 2020 + latitude: 46.0500268 + longitude: 14.5069289 + +- conference: DjangoCon EU + year: 2020 + link: https://2020.djangocon.eu/ + cfp: '2020-03-01 11:59:00' + place: Online + start: 2020-09-18 + end: 2020-09-20 + sub: WEB + +- conference: PyCon Asia Pacific + alt_name: PyCon Malaysia + year: 2020 + link: https://web.archive.org/web/20200420060932/https://pycon.my/ + cfp: '2020-04-30 23:59:00' + place: Online + start: 2020-09-12 + end: 2020-09-20 + sub: PY + +- conference: PyCon Slovakia + alt_name: PyCon SK + year: 2020 + link: https://2020.pycon.sk/en/ + cfp: Cancelled + cfp_ext: '2020-01-31 23:59:00' + place: Bratislava, Slovakia + start: 2020-09-11 + end: 2020-09-13 + sub: PY + note: Cancelled due to Covid-19 + location: + - title: PyCon Slovakia 2020 + latitude: 48.1516988 + longitude: 17.1093063 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2020 + link: http://pycon.tw/ + cfp: '2020-04-26 23:59:00' + place: Taipei, Taiwan + start: 2020-09-05 + end: 2020-09-06 + sub: PY + location: + - title: PyCon Taiwan 2020 + latitude: 25.0560586 + longitude: 121.4437641 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2020 + link: https://2020.pycon.org.au/ + cfp: '2020-07-12 23:59:00' + place: Online + start: 2020-09-04 + end: 2020-09-06 + sub: PY + +- conference: DjangoCon Australia + alt_name: DjangoCon AU + year: 2020 + link: https://web.archive.org/web/20200508100008/https://2020.djangocon.com.au/ + cfp: '2020-07-12 23:59:00' + place: Online + start: 2020-09-04 + end: 2020-09-04 + sub: WEB + note: Alongside PyCon Australia + +- conference: PyCon Russia + year: 2020 + link: https://web.archive.org/web/20200715073901/https://pycon.ru/ + cfp: '2020-06-01 23:59:00' + place: Moscow, Russia + start: 2020-09-03 + end: 2020-09-04 + sub: PY + location: + - title: PyCon Russia 2020 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2020 + link: https://pycon.jp/2020/ + cfp: '2020-05-31 23:59:00' + place: Online + start: 2020-08-28 + end: 2020-08-29 + sub: PY + +- conference: PyCon Africa + year: 2020 + link: https://africa.pycon.org/ + cfp: '2020-06-01 23:59:00' + place: Online + start: 2020-08-04 + end: 2020-08-08 + sub: PY + +- conference: Piter Py + alt_name: PiterPy + year: 2020 + link: https://web.archive.org/web/20200628045535/https://piterpy.com/en/ + cfp: '2020-06-26 23:59:00' + place: Online + start: 2020-08-03 + end: 2020-08-06 + sub: PY + +- conference: Wagtail Space US + year: 2020 + link: https://web.archive.org/web/20200617195844/https://us.wagtail.space/ + cfp: None + place: Online + start: 2020-07-30 + end: 2020-08-01 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + +- conference: EuroSciPy + year: 2020 + link: https://www.euroscipy.org/ + cfp: Cancelled + place: Bilbao, Spain + start: 2020-07-27 + end: 2020-07-31 + sub: SCIPY + note: Cancelled due to Covid + location: + - title: EuroSciPy 2020 + latitude: 43.2630018 + longitude: -2.9350039 + +- conference: PyOhio + year: 2020 + link: https://pyohio.org/2020/ + cfp_link: https://www.pyohio.org/2020/speaking/cfp/ + cfp: '2020-05-31 23:59:00' + place: Online + start: 2020-07-25 + end: 2020-07-26 + sub: PY + +- conference: EuroPython + year: 2020 + link: https://ep2020.europython.eu/ + cfp: '2020-05-24 23:59:59' + place: Online + start: 2020-07-23 + end: 2020-07-26 + sub: PY + +- conference: Python Nordeste + year: 2020 + link: https://2020.pythonnordeste.org/ + cfp: Cancelled + place: Fortaleza, Brasil + start: 2020-07-17 + end: 2020-07-18 + sub: PY + note: Moved to 2021 due to Covid + location: + - title: Python Nordeste 2020 + latitude: -3.7304512 + longitude: -38.5217989 + +- conference: PyHEP + year: 2020 + link: https://indico.cern.ch/event/882824/ + cfp: '2020-06-22 16:59:00' + place: Online + start: 2020-07-13 + end: 2020-07-17 + sub: SCIPY + note: Online due to Covid + +- conference: SciPy US + alt_name: SciPy + year: 2020 + link: https://www.scipy2020.scipy.org/ + cfp: '2020-01-31 23:59:00' + cfp_ext: '2020-02-15 23:59:00' + timezone: America/Chicago + place: Online + start: 2020-07-06 + end: 2020-07-12 + sub: SCIPY + +- conference: Flask Con + year: 2020 + link: https://web.archive.org/web/20200611021621/https://flaskcon.com/ + cfp: '2020-06-14 23:59:00' + place: Online + start: 2020-07-04 + end: 2020-07-05 + sub: WEB + +- conference: Python Web Conference + year: 2020 + link: https://2020.pythonwebconf.com/ + cfp: '2020-04-18 04:00:00' + timezone: UTC + place: Online + start: 2020-06-17 + end: 2020-06-19 + sub: WEB + +- conference: PyData Amsterdam + alt_name: PyDataFest Amsterdam + year: 2020 + link: https://web.archive.org/web/20201030121307/https://amsterdam.pydata.org/ + cfp: '2020-03-01 23:59:00' + place: Online + start: 2020-06-15 + end: 2020-06-20 + sub: DATA + +- conference: PyCon Odessa + year: 2020 + link: https://pyconodessa.com/en/ + cfp: '2020-02-29 00:00:00' + timezone: UTC + place: Odessa, Ukraine + start: 2020-06-13 + end: 2020-06-15 + sub: PY + location: + - title: PyCon Odessa 2020 + latitude: 46.4843023 + longitude: 30.7322878 + +- conference: PyCon Czechia + alt_name: PyCon CZ + year: 2020 + link: https://cz.pycon.org/2020/ + cfp: Cancelled + place: Ostrava, Czechia + start: 2020-06-05 + end: 2020-06-08 + sub: PY + note: Cancelled due to COVID-19 + location: + - title: PyCon Czechia 2020 + latitude: 49.8349139 + longitude: 18.2820084 + +- conference: PyLondinium + year: 2020 + link: https://web.archive.org/web/20200812040952/http://pylondinium.org/ + cfp: Cancelled + place: London, UK + start: 2020-06-05 + end: 2020-06-07 + sub: PY + note: Cancelled due to COVID-19 + location: + - title: PyLondinium 2020 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: Python Pizza Berlin + alt_name: Berlin Python Pizza + year: 2020 + link: https://web.archive.org/web/20200228024911/https://berlin.python.pizza/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSeLDUCC6Mb0wN4NFcqNIE2JZtuZvD0ZH7bhZlRvNBr5IcofYA/viewform + cfp: '2020-04-16 23:59:00' + place: Berlin, Germany + start: 2020-05-16 + end: 2020-05-16 + sub: PY + location: + - title: Python Pizza Berlin 2020 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: Python fwdays + year: 2020 + link: https://web.archive.org/web/20200527064935/https://fwdays.com/en/event/python-fwdays-conference + cfp: '2020-04-01 23:59:59' + place: Online + start: 2020-05-16 + end: 2020-05-16 + sub: WEB + +- conference: PyGrunn + year: 2020 + link: https://web.archive.org/web/20200608055024/http://www.pygrunn.org/ + cfp: Cancelled + place: Groningen, Netherlands + start: 2020-05-15 + end: 2020-05-15 + sub: PY + note: Postponed due to COVID-19 + location: + - title: PyGrunn 2020 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyCon Web + year: 2020 + link: https://web.archive.org/web/20200318031117/https://pyconweb.com/ + cfp_link: https://www.papercall.io/pyconweb20 + cfp: Cancelled + cfp_ext: '2020-03-07 22:59:00' + timezone: UTC + place: Munich, Germany + start: 2020-05-09 + end: 2020-05-10 + sub: WEB + location: + - title: PyConWeb 2020 + latitude: 48.1371079 + longitude: 11.5753822 + +- conference: PyCon Hong Kong Spring + alt_name: PyCon Hong Kong + year: 2020 + link: https://pycon.hk/2020-spring/ + cfp_link: https://forms.gle/hhK6F1QmUrnJ3rmn7 + cfp: '2020-04-15 23:59:00' + place: Hong Kong, Hong Kong + start: 2020-05-08 + end: 2020-05-10 + sub: PY + location: + - title: PyCon Hong Kong Spring 2020 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon Israel + year: 2020 + link: https://web.archive.org/web/20200315123043/https://il.pycon.org/2020/ + cfp: Cancelled + place: Ramat Gan, Israel + start: 2020-05-04 + end: 2020-05-06 + sub: PY + location: + - title: PyCon Israel 2020 + latitude: 32.0686867 + longitude: 34.8246812 + +- conference: Python Pizza Remote + year: 2020 + link: https://remote.python.pizza/ + cfp: '2020-04-05 23:59:00' + place: Online + start: 2020-04-25 + end: 2020-04-25 + sub: PY + +- conference: Python in Astronomy + year: 2020 + link: https://openastronomy.org/pyastro/2020/ + cfp: '2020-01-31 23:59:00' + place: Baltimore, USA + start: 2020-04-20 + end: 2020-04-24 + sub: DATA + location: + - title: Python in Astronomy 2020 + latitude: 39.2908816 + longitude: -76.610759 + +- conference: Moscow Python Conf++ + alt_name: MoscowPythonConf++ + year: 2020 + link: https://conf.python.ru/en/2020 + cfp: '2020-01-13 23:59:00' + place: Moscow, Russia + start: 2020-03-27 + end: 2020-03-27 + sub: PY + location: + - title: Moscow Python Conf++ 2020 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: PyTennessee + year: 2020 + link: https://web.archive.org/web/20200324221914/https://www.pytennessee.org + cfp: '2019-10-14 23:59:00' + place: Nashville, USA + start: 2020-03-07 + end: 2020-03-08 + sub: PY + location: + - title: PyTennessee 2020 + latitude: 36.1622767 + longitude: -86.7742984 + +- conference: PyBeach + year: 2020 + link: https://web.archive.org/web/20200320222337/https://2020.pybeach.org/ + cfp_link: https://www.papercall.io/pybeach2020 + cfp: '2019-12-15 00:00:00' + timezone: America/Los_Angeles + place: Los Angeles, USA + start: 2020-02-29 + end: 2020-02-29 + sub: PY + location: + - title: PyBeach 2020 + latitude: 34.0536909 + longitude: -118.242766 + +- conference: PyCon Belarus + year: 2020 + link: https://web.archive.org/web/20200223084649/https://by.pycon.org/ + cfp: '2019-11-16 23:59:00' + place: Minsk, Belarus + start: 2020-02-21 + end: 2020-02-22 + sub: PY + location: + - title: PyCon Belarus 2020 + latitude: 53.9024716 + longitude: 27.5618225 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2020 + link: https://web.archive.org/web/20200305092556/https://na.pycon.org/ + cfp: '2019-12-27 23:59:00' + place: Windhoek, Namibia + start: 2020-02-18 + end: 2020-02-20 + sub: PY + location: + - title: PyCon Namibia 2020 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: PyCascades + year: 2020 + link: https://2020.pycascades.com/ + cfp_link: https://2020.pycascades.com/news/2-pycascades-2020-dates-location-cfp/ + cfp: '2019-10-01 23:59:00' + place: Portland, USA + start: 2020-02-08 + end: 2020-02-09 + sub: PY + location: + - title: PyCascades 2020 + latitude: 45.5202471 + longitude: -122.674194 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2020 + link: https://fosdem.org/2020/schedule/track/python/ + cfp: '2019-11-24 23:59:00' + place: Brussels, Belgium + start: 2020-02-01 + end: 2020-02-01 + sub: PY + location: + - title: FOSDEM 2020 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: Python fwdays + year: 2019 + link: https://fwdays.com/en/event/python-fwdays-Online-conference + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSde6NvTplJa_S8AwDYbXPHqCrUDlEGvaq_78xD2VyPgV6Cz6g/viewform + cfp: '2019-11-28 23:59:00' + place: Kyiv, Ukraine + start: 2019-12-14 + end: 2019-12-14 + sub: PY + location: + - title: Python fwdays 2019 + latitude: 50.6215011 + longitude: 30.460508167757546 + +- conference: PyCon Tanzania + alt_name: Python Tanzania Conference + year: 2019 + link: https://web.archive.org/web/20211206213536/https://pycon.or.tz/2019/ + cfp_link: https://web.archive.org/web/20211206194319/https://pycon.or.tz/2019/speak/ + cfp: '2019-11-06 23:59:00' + place: Dar Es Salaam, Tanzania + start: 2019-12-10 + end: 2019-12-11 + sub: PY + location: + - title: PyCon Tanzania 2019 + latitude: -6.8160837 + longitude: 39.2803583 + +- conference: PyConf Hyderabad + year: 2019 + link: https://pyconf.hydpy.org/2019/ + cfp_link: https://web.archive.org/web/20200806092040/https://papercall.io/pyconf-hyderabad2019 + cfp: '2019-11-07 18:29:00' + timezone: UTC + place: Hyderabad, India + start: 2019-12-07 + end: 2019-12-08 + sub: PY + location: + - title: PyConf Hyderabad 2019 + latitude: 17.4454957 + longitude: 78.34854697544472 + +- conference: PyData Austin + year: 2019 + link: https://web.archive.org/web/20191018232928/https://pydata.org/austin2019/ + cfp: '2019-10-20 23:59:00' + place: Austin, USA + start: 2019-12-07 + end: 2019-12-08 + sub: DATA + location: + - title: PyData Austin 2019 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyData Los Angeles + year: 2019 + link: https://web.archive.org/web/20200116192652/https://pydata.org/la2019/ + cfp: '2019-08-15 23:59:00' + place: Los Angeles, USA + start: 2019-12-03 + end: 2019-12-05 + sub: DATA + location: + - title: PyData Los Angeles 2019 + latitude: 34.0536909 + longitude: -118.242766 + +- conference: SciPy India + year: 2019 + link: https://web.archive.org/web/20191005212148/http://scipy.in/2019 + cfp: '2019-10-25 23:59:00' + place: Mumbai, India + start: 2019-11-29 + end: 2019-11-30 + sub: SCIPY + location: + - title: SciPy India 2019 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: PyData Eindhoven + year: 2019 + link: https://web.archive.org/web/20191018232946/https://pydata.org/eindhoven2019/ + cfp: '2019-05-13 23:59:00' + timezone: Europe/Amsterdam + place: Eindhoven, Netherlands + start: 2019-11-29 + end: 2019-11-30 + sub: DATA + location: + - title: PyData Eindhoven 2019 + latitude: 51.4383999131 + longitude: 5.46712979814 + +- conference: PyCon Indonesia + alt_name: PyCon ID + year: 2019 + link: https://web.archive.org/web/20190906181415/http://pycon.id/ + cfp: '2019-10-31 23:10:00' + timezone: UTC + place: Surabaya, Indonesia + start: 2019-11-23 + end: 2019-11-23 + sub: PY + location: + - title: PyCon Indonesia 2019 + latitude: -7.2459717 + longitude: 112.7378266 + +- conference: AfroPython Conf + year: 2019 + link: https://afropython.org/ + cfp_link: https://forms.gle/Ew1T24SEMQcXivfb7 + cfp: '2019-10-15 23:59:59' + place: Porto Alegre, Brazil + start: 2019-11-23 + end: 2019-11-24 + sub: PY + location: + - title: AfroPython Conf 2019 + latitude: -30.0324999 + longitude: -51.2303767 + +- conference: PyCon Canada + year: 2019 + link: https://2019.pycon.ca/ + cfp_link: https://web.archive.org/web/20190503000520/http://cfp.pycon.ca/ + cfp: '2019-08-31 23:59:00' + tutorial_deadline: '2019-08-31 23:59:00' + place: Toronto, Canada + start: 2019-11-16 + end: 2019-11-20 + sub: PY + location: + - title: PyCon Canada 2019 + latitude: 43.6534817 + longitude: -79.3839347 + +- conference: PyData Cambridge + year: 2019 + link: https://web.archive.org/web/20191001220034/https://cambridgespark.com/pydata-cambridge-2019/ + cfp: '2019-09-29 23:59:59' + place: Cambridge, UK + start: 2019-11-15 + end: 2019-11-17 + sub: DATA + location: + - title: PyData Cambridge 2019 + latitude: 52.2055314 + longitude: 0.1186637 + +- conference: PyData NYC + year: 2019 + link: https://pydata.org/nyc2019/ + cfp_link: https://web.archive.org/web/20190818194522/https://pydata.org/nyc2019/cfp/ + cfp: '2019-08-15 23:59:00' + timezone: America/New_York + place: New York, USA + start: 2019-11-04 + end: 2019-11-06 + sub: DATA + location: + - title: PyData NYC 2019 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: North Bay Python + year: 2019 + link: https://web.archive.org/web/20190918022448/https://2019.northbaypython.org/ + cfp: '2019-08-16 23:59:00' + place: Petaluma, USA + start: 2019-11-02 + end: 2019-11-03 + sub: PY + location: + - title: North Bay Python 2019 + latitude: 38.2325829 + longitude: -122.636465 + +- conference: Piter Py + alt_name: PiterPy + year: 2019 + link: https://web.archive.org/web/20190628045535/https://piterpy.com/en/ + cfp: '2019-06-30 23:59:00' + place: Saint Petersburg, Russia + start: 2019-11-01 + end: 2019-11-01 + sub: PY + location: + - title: Piter Py 2019 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: PyCon France + alt_name: PyCon FR + year: 2019 + link: https://web.archive.org/web/20191106161538/https://www.pycon.fr/2019/ + cfp_link: https://web.archive.org/web/20190925024501/https://cfp-2019.pycon.fr/ + cfp: '2019-09-30 23:59:00' + place: Bordeaux, France + start: 2019-10-31 + end: 2019-11-03 + sub: PY + location: + - title: PyCon France 2019 + latitude: 44.841225 + longitude: -0.5800364 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2019 + link: https://web.archive.org/web/20190917132734/http://rencontres.django-fr.org/2018/ + cfp: '2019-09-30 23:59:00' + place: Lille, France + start: 2019-10-31 + end: 2019-11-03 + sub: WEB + location: + - title: DjangoCong 2019 + latitude: 50.6365654 + longitude: 3.0635282 + +- conference: PyCon Sweden + alt_name: PyCon SE year: 2019 - id: scipyEU19 - link: https://euroscipy.org/2020/ + link: https://www.pycon.se/ + cfp_link: https://forms.gle/hZWhUePsHB34xtUM9 + cfp: '2019-09-13 23:59:00' + tutorial_deadline: '2019-09-13 23:59:00' + place: Stockholm, Sweden + start: 2019-10-31 + end: 2019-11-02 + sponsor: https://web.archive.org/web/20191025124100/http://www.pycon.se/sponsorship.html + sub: PY + location: + - title: PyCon Sweden 2019 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: Python Brasil + alt_name: PythonBrasil[15] + year: 2019 + link: https://web.archive.org/web/20190615021525/https://2019.pythonbrasil.org.br/ + cfp: '2019-08-05 23:59:00' + place: Ribeirão Preto, Brazil + start: 2019-10-23 + end: 2019-10-28 + sponsor: https://2019.pythonbrasil.org.br/assets/pdfs/sponsorship_plan.pdf + sub: PY + location: + - title: Python Brasil 2019 + latitude: -21.1776315 + longitude: -47.8100983 + +- conference: Plone Conference + year: 2019 + link: https://2019.ploneconf.org/ + cfp: '2019-10-15 23:59:00' + place: Ferrara, Italy + start: 2019-10-21 + end: 2019-10-27 + sub: WEB + location: + - title: Plone Conference 2019 + latitude: 44.766764249999994 + longitude: 11.827938995640167 + +- conference: PyDay Barcelona + year: 2019 + link: https://web.archive.org/web/20200513113600/http://pybcn.org/pyday-bcn-2019/ + cfp_link: https://web.archive.org/web/20200513113819/https://pybcn.org/call-for-proposals/ + cfp: None + place: Barcelona, Spain + start: 2019-10-19 + end: 2019-10-19 + sub: DAY + location: + - title: PyDay Barcelona 2019 + latitude: 41.3828939 + longitude: 2.1774322 + +- conference: PyDay Mexico + year: 2019 + link: https://web.archive.org/web/20190505175944/http://pythonday.mx/ + cfp_link: https://papercall.io/pythondaymx2019 + cfp: '2019-09-27 23:59:00' + tutorial_deadline: '2019-09-27 23:59:00' + place: Mexico City, Mexico + start: 2019-10-18 + end: 2019-10-19 + sub: DAY + location: + - title: PyDay Mexico 2019 + latitude: 19.4326296 + longitude: -99.1331785 + +- conference: PyHEP + year: 2019 + link: https://indico.cern.ch/event/833895/ + cfp: None + place: Abingdon, UK + start: 2019-10-16 + end: 2019-10-18 + sub: SCIPY + location: + - title: PyHEP 2019 + latitude: 51.6714842 + longitude: -1.2779715 + +- conference: PyCode Conference + year: 2019 + link: https://web.archive.org/web/20190801205817/https://pycode-conference.org/ + cfp_link: https://web.archive.org/web/20190706074128/https://pycode-conference.org/#section-C4P + cfp: '2019-06-26 23:59:00' + place: Gdansk, Poland + start: 2019-10-14 + end: 2019-10-16 + sub: PY + location: + - title: PyCode Conference 2019 + latitude: 54.3706858 + longitude: 18.61298210330077 + +- conference: PyCon mini Hiroshima + year: 2019 + link: https://hiroshima.pycon.jp/2019/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSdIebD2ijyIFFKAtlR-iYiYWs8kPbP8ZMXNSaw0iiXeC57szA/viewform + cfp: '2019-09-01 23:59:00' + place: Hiroshima, Japan + start: 2019-10-12 + end: 2019-10-12 + sub: PY + location: + - title: PyCon mini Hiroshima 2019 + latitude: 34.3917241 + longitude: 132.4517589 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2019 + link: https://web.archive.org/web/20191029092941/http://python.ie/pycon-2019/ + cfp_link: https://web.archive.org/web/20191029123236/http://python.ie/pycon-2019/call-proposals/ + cfp: '2019-08-11 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2019-10-12 + end: 2019-10-13 + sub: PY + location: + - title: PyCon Ireland 2019 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Pakistan + year: 2019 + link: https://web.archive.org/web/20191016171256/http://pycon.pk/ + cfp: '2019-08-01 23:59:00' + place: Karachi, Pakistan + start: 2019-10-12 + end: 2019-10-12 + sub: PY + location: + - title: PyCon Pakistan 2019 + latitude: 24.8546842 + longitude: 67.0207055 + +- conference: PyCon India + year: 2019 + link: https://in.pycon.org/2019/ + cfp: '2019-07-01 23:59:00' + timezone: Asia/Kolkata + place: Chennai, India + start: 2019-10-12 + end: 2019-10-16 + sub: PY + location: + - title: PyCon India 2019 + latitude: 13.0836939 + longitude: 80.270186 + +- conference: PyCon Singapore + year: 2019 + link: https://web.archive.org/web/20190406120434/https://pycon.sg/ + cfp: '2019-09-01 23:59:00' + place: Singapore, Singapore + start: 2019-10-10 + end: 2019-10-12 + sub: PY + location: + - title: PyCon Singapore 2019 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2019 + link: https://web.archive.org/web/20191008045812/https://za.pycon.org/ + cfp_link: https://2019.za.pycon.org/archived/submit-talk/ + cfp: '2019-08-30 23:59:00' + place: Johannesburg, South Africa + start: 2019-10-09 + end: 2019-10-13 + sub: PY + location: + - title: PyCon South Africa 2019 + latitude: -26.205 + longitude: 28.049722 + +- conference: PyCon Germany & PyData Berlin + alt_name: PyCon DE & PyData Berlin + year: 2019 + link: https://2019.pycon.de/ + cfp_link: https://2019.pycon.de/call-for-proposals/ + cfp: '2019-06-09 23:59:00' + place: Berlin, Germany + start: 2019-10-09 + end: 2019-10-13 + sponsor: https://de.pycon.org/sponsors + sub: PY,DATA + location: + - title: PyCon Germany & PyData Berlin 2019 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: SciPy Latin America + year: 2019 + link: https://web.archive.org/web/20200112191236/http://conf.scipyla.org/en/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSd9HVivE4bJKMqfi1jAD8SPBn-ra8kECMNpngBo1mziXtV-Nw/viewform + cfp: '2019-08-30 23:59:00' + place: Bogota, Colombia + start: 2019-10-08 + end: 2019-10-10 + sub: SCIPY + location: + - title: SciPy Latin America 2019 + latitude: 4.6529539 + longitude: -74.0835643 + +- conference: PyGotham TV + year: 2019 + link: https://web.archive.org/web/20190927181741/https://2019.pygotham.org/ + cfp_link: https://cfp.pygotham.org/ + cfp: '2019-05-12 23:59:00' + place: New York, USA + start: 2019-10-04 + end: 2019-10-05 + sponsor: https://web.archive.org/web/20191117081327/https://2019.pygotham.org/sponsors/prospectus/ + sub: PY + location: + - title: PyGotham TV 2019 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2019 + link: https://web.archive.org/web/20200213214517/https://2019.es.pycon.org/ + cfp_link: https://web.archive.org/web/20221225060854/https://easychair.org/cfp/pycones2019 + cfp: '2019-05-10 23:59:00' + place: Alicante, Spain + start: 2019-10-04 + end: 2019-10-06 + sub: PY + location: + - title: PyCon Spain 2019 + latitude: 38.3436365 + longitude: -0.4881708 + +- conference: PyCon Balkan + year: 2019 + link: https://web.archive.org/web/20200124104208/https://conference.pyconbalkan.com/ + cfp_link: https://web.archive.org/web/20201021110639/https://sessionize.com/pycon-balkan-2019/ + cfp: '2019-07-15 23:59:00' + tutorial_deadline: '2019-07-15 23:59:00' + place: Belgrade, Serbia + start: 2019-10-03 + end: 2019-10-06 + sponsor: https://web.archive.org/web/20191011102949/https://www.pyconbalkan.com/faq + sub: PY + location: + - title: PyCon Balkan 2019 + latitude: 44.8178131 + longitude: 20.4568974 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2019 + link: https://web.archive.org/web/20190724094325/https://pycon.ee/ + cfp: '2019-04-01 23:59:00' + place: Tallinn, Estonia + start: 2019-10-03 + end: 2019-10-03 + sub: PY + location: + - title: PyCon Estonia 2019 + latitude: 59.4372155 + longitude: 24.7453688 + +- conference: PyData Cordoba + year: 2019 + link: https://web.archive.org/web/20191103174430/https://pydata.org/cordoba2019/ + cfp: '2019-06-30 23:59:59' + place: Cordoba, Argentina + start: 2019-09-27 + end: 2019-09-30 + sub: DATA + location: + - title: PyData Cordoba 2019 + latitude: -31.4166867 + longitude: -64.1834193 + +- conference: DjangoCon US + year: 2019 + link: https://web.archive.org/web/20191006102647/https://2019.djangocon.us/ + cfp: '2019-05-20 23:59:00' + place: San Diego, USA + start: 2019-09-22 + end: 2019-09-27 + sub: WEB + location: + - title: DjangoCon US 2019 + latitude: 32.7174202 + longitude: -117.1627728 + +- conference: PyCon China + year: 2019 + link: https://cn.pycon.org/2019/en/ + cfp: '2019-08-10 23:59:00' + place: Shanghai, China + extra_places: + - Beijing, China + - Hangzhou, China + - Shenzhen, China + - Chengou, China + - Nanning, China + start: 2019-09-21 + end: 2019-09-22 + sub: PY + location: + - title: PyCon China 2019 + latitude: 31.2323437 + longitude: 121.4691024 + - title: PyCon China 2019 + latitude: 40.190632 + longitude: 116.412144 + - title: PyCon China 2019 + latitude: 30.2489634 + longitude: 120.2052342 + - title: PyCon China 2019 + latitude: 22.5445741 + longitude: 114.0545429 + - title: PyCon China 2019 + latitude: 34.127 + longitude: 105.422 + - title: PyCon China 2019 + latitude: 22.8193063 + longitude: 108.3627211 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2019 + link: https://tw.pycon.org/2019/en-us/ + cfp_link: https://web.archive.org/web/20200814150723/https://tw.pycon.org/2019/en-us/events/talks/ + cfp: '2019-04-14 23:59:00' + place: Taipei, Taiwan + start: 2019-09-20 + end: 2019-09-22 + sponsor: https://web.archive.org/web/20200814143440/https://tw.pycon.org/2019/en-us/sponsor/sponsor/ + sub: PY + location: + - title: PyCon Taiwan 2019 + latitude: 25.0375198 + longitude: 121.5636796 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2019 + link: https://pycon.jp/2019/ + cfp_link: https://papercall.io/pyconjp2019 + cfp: '2019-06-02 23:59:00' + place: Tokyo, Japan + start: 2019-09-16 + end: 2019-09-17 + sponsor: https://web.archive.org/web/20191107125024/https://docs.google.com/forms/d/e/1FAIpQLScTCSXE3VsdjHZbxt3QOJbRLNEFjXBDKZxjX6Z2uwWqoT3rYg/closedform + sub: PY + location: + - title: PyCon Japan 2019 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon UK + year: 2019 + link: https://web.archive.org/web/20190905015126/http://2019.pyconuk.org/ + cfp_link: https://web.archive.org/web/20190517080333/https://2019.pyconuk.org/call-proposals/ + cfp: '2019-06-07 17:00:00' + timezone: Europe/London + place: Cardiff, UK + start: 2019-09-13 + end: 2019-09-17 + sub: PY + location: + - title: PyCon UK 2019 + latitude: 51.4816546 + longitude: -3.1791934 + +- conference: PyColorado + year: 2019 + link: https://web.archive.org/web/20190408160659/https://pycolorado.org/ + cfp_link: https://web.archive.org/web/20200809143958/https://www.papercall.io/pycolorado + cfp: '2019-05-17 12:05:00' + timezone: UTC + place: Denver, USA + start: 2019-09-07 + end: 2019-09-08 + sub: PY + location: + - title: PyColorado 2019 + latitude: 39.7392364 + longitude: -104.984862 + +- conference: Flask Conf Brasil + year: 2019 + link: https://web.archive.org/web/20191207191746/https://2019.flask.python.org.br/ + cfp_link: https://web.archive.org/web/20190630125719/https://speakerfight.com/events/flaskconf-2019/ + cfp: '2019-07-31 23:55:00' + place: Florianópolis, Brazil + start: 2019-09-06 + end: 2019-09-08 + sub: WEB + location: + - title: Flask Conf Brasil 2019 + latitude: -27.5973002 + longitude: -48.5496098 + +- conference: EuroSciPy + year: 2019 + link: https://web.archive.org/web/20191105204223/https://www.euroscipy.org/2019/ + cfp_link: https://web.archive.org/web/20190401033830/https://pretalx.com/euroscipy-2019/ cfp: '2019-04-28 23:59:59' - start: 2019-09-02 - end: 2019-09-06 - date: September 2 - 6, 2019 + tutorial_deadline: '2019-05-12 23:59:00' timezone: Europe/Madrid place: Bilbao, Spain + start: 2019-09-02 + end: 2019-09-07 + sponsor: https://web.archive.org/web/20191112144705/https://www.euroscipy.org/2019/sponsors.html sub: SCIPY + location: + - title: EuroSciPy 2019 + latitude: 43.2630018 + longitude: -2.9350039 -- title: PyCascades Remote - year: 2022 - id: pycascadesremote2022 - link: https://2022.pycascades.com/ - cfp: '2021-10-24 23:59:59' - start: 2022-02-05 - end: 2022-02-07 - date: February 05 – 07, 2022 - place: Online +- conference: PyCon Latin America + alt_name: PyCon LatAm + year: 2019 + link: https://web.archive.org/web/20190829043747/https://www.pylatam.org/ + cfp_link: https://web.archive.org/web/20201027035946/https://www.papercall.io/pyconlatam + cfp: '2019-05-31 23:59:00' + place: Puerto Vallarta, Mexico + start: 2019-08-29 + end: 2019-08-31 sub: PY + location: + - title: PyCon Latin America 2019 + latitude: 20.6407176 + longitude: -105.220306 -- title: Python Web Conference - year: 2022 - id: pythonwebconference2022 - link: https://2022.pythonwebconf.com/ - cfp: '2021-11-01 23:59:59' - start: 2022-03-21 - end: 2022-03-26 - date: March 21 – 26, 2022 - timezone: UTC+0 +- conference: Python Web Conference + year: 2019 + link: https://web.archive.org/web/20191220043242/https://2019.indypy.org/webconf/ + cfp_link: https://web.archive.org/web/20210922133652/https://www.papercall.io/indypy-web-conf-2019 + cfp: '2019-07-19 05:07:00' + timezone: UTC place: Online + start: 2019-08-23 + end: 2019-08-23 sub: WEB -- title: Kiwi PyCon XI - year: 2022 - id: pyconNZ22 - link: https://kiwipycon.nz/ - cfp: '2021-11-30 23:59:00' - start: 2022-08-19 - end: 2022-08-21 - date: August 19-21, 2022 - timezone: Pacific/Auckland - place: Ōtautahi Christchurch, New Zealand +- conference: Kiwi PyCon + alt_name: Kiwi PyCon X + year: 2019 + link: https://web.archive.org/web/20190616093942/https://python.nz/ + cfp: '2019-06-23 23:59:00' + place: Wellington, New Zealand + start: 2019-08-23 + end: 2019-08-25 sub: PY + location: + - title: Kiwi PyCon 2019 + latitude: -41.2887953 + longitude: 174.7772114 -- title: PyCon US - year: 2022 - id: pyconUS22 - link: https://us.pycon.org/2022/ - cfp: '2021-12-20 23:59:00' - start: 2022-04-27 - end: 2022-05-03 - date: April 27 – May 3, 2022 - place: Salt Lake City, US +- conference: PyBay + year: 2019 + link: https://web.archive.org/web/20190815015012/http://pybay.com/ + cfp_link: https://pybay2019cfp.hubb.me/ + cfp: '2019-05-12 23:59:00' + tutorial_deadline: '2019-05-12 23:59:00' + place: San Francisco, USA + start: 2019-08-15 + end: 2019-08-19 sub: PY + location: + - title: PyBay 2019 + latitude: 37.7681571 + longitude: -122.392929 -- title: PyCon DE & PyData Berlin - year: 2022 - id: pyconde2022 - link: https://2022.pycon.de/ - cfp: '2022-01-16 23:59:59' - start: 2022-04-11 - end: 2022-04-14 - date: April 11 – 14, 2022 - timezone: Europe/Berlin +- conference: PyCon South Korea + alt_name: PyCon Korea + year: 2019 + link: http://web.archive.org/web/20190403222443/https://www.pycon.kr/2019/ + cfp: '2019-04-19 23:59:00' + cfp_ext: '2019-04-26 23:59:00' + place: Seoul, South Korea + start: 2019-08-15 + end: 2019-08-18 + sub: PY + location: + - title: PyCon South Korea 2019 + latitude: 37.5534363 + longitude: 126.9697994 + +- conference: PyCon Africa + year: 2019 + link: https://web.archive.org/web/20190905014317/https://africa.pycon.org/ + cfp_link: https://web.archive.org/web/20190528155625/https://africa.pycon.org/speaking/ + cfp: '2019-06-01 23:59:00' + tutorial_deadline: '2019-06-01 23:59:00' + place: Accra, Ghana + start: 2019-08-06 + end: 2019-08-10 + sponsor: https://web.archive.org/web/20200408054059/https://africa.pycon.org/sponsor/ + sub: PY + location: + - title: PyCon Africa 2019 + latitude: 5.5571096 + longitude: -0.2012376 + +- conference: PyCon Amazônia + year: 2019 + link: https://web.archive.org/web/20200116144142/https://amazonia.python.org.br/ + cfp_link: https://web.archive.org/web/20220902154029/https://speakerfight.com/events/3a-pycon-amazonia-2019-porto-velhoro/ + cfp: '2019-07-31 23:55:00' + place: Porto Velho, Brazil + start: 2019-08-03 + end: 2019-08-04 + sub: PY + location: + - title: PyCon Amazônia 2019 + latitude: -8.7494525 + longitude: -63.8735438 + +- conference: PyData Delhi + alt_name: Pydata New Delhi + year: 2019 + link: https://web.archive.org/web/20190818153520/http://pydata.org/delhi2019/ + cfp: '2019-06-30 23:59:00' + place: New Delhi, India + start: 2019-08-03 + end: 2019-08-04 + sub: DATA + location: + - title: PyData Delhi 2019 + latitude: 28.6138954 + longitude: 77.2090057 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2019 + link: https://web.archive.org/web/20190808014405/https://2019.pycon-au.org/ + cfp: '2019-05-05 23:59:00' + place: Sydney, Australia + start: 2019-08-02 + end: 2019-08-06 + sponsor: https://web.archive.org/web/20190426053748/https://2019.pycon-au.org/sponsor/ + sub: PY + location: + - title: PyCon Australia 2019 + latitude: -33.8751704 + longitude: 151.19974848099355 + +- conference: DjangoCon Australia + alt_name: DjangoCon AU + year: 2019 + link: https://web.archive.org/web/20190801103059/https://2019.djangocon.com.au/ + cfp: '2019-05-05 23:59:00' + place: Sydney, Australia + start: 2019-08-02 + end: 2019-08-02 + sub: WEB + note: Specialist track at PyCon Australia + location: + - title: DjangoCon Australia 2019 + latitude: -33.8751704 + longitude: 151.19974848099355 + +- conference: Python in Astronomy + year: 2019 + link: https://openastronomy.org/pyastro/2019/ + cfp: '2019-01-31 23:59:00' + place: Baltimore, USA + start: 2019-07-29 + end: 2019-08-02 + sub: DATA + location: + - title: Python in Astronomy 2019 + latitude: 39.2908816 + longitude: -76.610759 + +- conference: PyOhio + year: 2019 + link: https://web.archive.org/web/20190725015606/https://www.pyohio.org/2019/ + cfp_link: https://pyohio.org/cfp + cfp: '2019-05-12 23:59:00' + tutorial_deadline: '2019-05-12 23:59:00' + place: Columbus, USA + start: 2019-07-27 + end: 2019-07-28 + sponsor: https://pyohio.org/2019/sponsorship + sub: PY + location: + - title: PyOhio 2019 + latitude: 39.9622601 + longitude: -83.0007065 + +- conference: Wagtail Space US + year: 2019 + link: https://web.archive.org/web/20190617195844/https://us.wagtail.space/ + cfp: None + place: Philadelphia, USA + start: 2019-07-25 + end: 2019-07-26 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space US 2019 + latitude: 39.9533 + longitude: -75.198 + +- conference: Python Nordeste + year: 2019 + link: https://web.archive.org/web/20210414205846/https://2019.pythonnordeste.org/ + cfp: '2019-05-07 23:00:00' + timezone: America/Recife + place: Recife, Brazil + start: 2019-07-19 + end: 2019-07-21 + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2019 + latitude: -8.05389 + longitude: -34.88111 + +- conference: PyData London + year: 2019 + link: https://web.archive.org/web/20190405192005/http://pydata.org/london2019/ + cfp: '2019-04-19 23:59:00' + place: London, UK + start: 2019-07-12 + end: 2019-07-15 + sub: DATA + location: + - title: PyData London 2019 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: EuroPython + year: 2019 + link: https://web.archive.org/web/20190711015008/https://ep2019.europython.eu/ + cfp: '2019-05-12 23:59:59' + timezone: Europe/Zurich + place: Basel, Switzerland + start: 2019-07-08 + end: 2019-07-14 + sub: PY + location: + - title: EuroPython 2019 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: SciPy US + alt_name: SciPy + year: 2019 + link: https://web.archive.org/web/20190710161403/https://www.scipy2019.scipy.org/ + cfp: '2019-02-15 23:59:00' + timezone: America/Chicago + place: Austin, US + start: 2019-07-08 + end: 2019-07-14 + sub: SCIPY + location: + - title: SciPy US 2019 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: Caipyra + year: 2019 + link: https://web.archive.org/web/20190717090447/http://caipyra.python.org.br/ + cfp: Cancelled + place: São Carlos, Brazil + start: 2019-07-07 + end: 2019-07-11 + sub: PY + note: Cancelled due to COVID-19 + location: + - title: Caipyra 2019 + latitude: -22.0180395 + longitude: -47.891154 + +- conference: PyDay Pereira + year: 2019 + link: https://web.archive.org/web/20200923073841/https://pereira.pyday.co/ + cfp: None + place: Pereira, Colombia + start: 2019-06-29 + end: 2019-06-29 + sub: DAY + location: + - title: PyDay Pereira 2019 + latitude: 4.8143159 + longitude: -75.6946778 + +- conference: PyDay NEA + year: 2019 + link: https://web.archive.org/web/20200924174130/https://eventos.python.org.ar/events/pydaynea2019/ + cfp: None + place: Resistencia, Argentina + start: 2019-06-29 + end: 2019-06-29 + sub: DAY + location: + - title: PyDay NEA 2019 + latitude: -27.4511235 + longitude: -58.9865196 + +- conference: PyCon Russia + year: 2019 + link: https://web.archive.org/web/20230715073901/https://pycon.ru/ + cfp: '2019-05-01 23:59:00' + place: Tarusa, Russia + start: 2019-06-24 + end: 2019-06-25 + sub: PY + location: + - title: PyCon Russia 2019 + latitude: 54.7293536 + longitude: 37.1815538 + +- conference: GeoPython + year: 2019 + link: https://web.archive.org/web/20190111155256/https://2019.geopython.net/ + cfp: '2019-02-28 23:59:00' + place: Basel, Switzerland + start: 2019-06-24 + end: 2019-06-26 + sponsor: https://web.archive.org/web/20240812061744/http://2019.geopython.net/GeoPython_Sponsoring_2019_lowres.pdf + sub: GEO + location: + - title: GeoPython 2019 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: PyCon Thailand + year: 2019 + link: https://web.archive.org/web/20190602072052/http://th.pycon.org/en/ + cfp: '2019-05-31 23:59:00' + place: Bangkok, Thailand + start: 2019-06-16 + end: 2019-06-17 + sub: PY + location: + - title: PyCon Thailand 2019 + latitude: 13.7524938 + longitude: 100.4935089 + +- conference: PyLondinium + year: 2019 + link: https://web.archive.org/web/20190613014403/https://pylondinium.org/ + cfp: '2019-04-11 23:59:00' + place: London, UK + start: 2019-06-14 + end: 2019-06-16 + sub: PY + location: + - title: PyLondinium 2019 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyCon Czechia + alt_name: PyCon CZ + year: 2019 + link: https://web.archive.org/web/20190130011628/https://cz.pycon.org/2019/ + cfp_link: https://web.archive.org/web/20210518170623/https://cz.pycon.org/2019/proposals/ + cfp: '2019-02-17 23:59:00' + cfp_ext: '2019-03-07' + place: Ostrava, Czechia + start: 2019-06-14 + end: 2019-06-16 + sponsor: https://cz.pycon.org/2019/static/pyconcz-2019-sponsorship-prospectus.pdf + sub: PY + location: + - title: PyCon Czechia 2019 + latitude: 49.8349139 + longitude: 18.2820084 + +- conference: PyCon Israel + year: 2019 + link: https://web.archive.org/web/20190120010757/https://il.pycon.org/2019/ + cfp: '2019-04-01 23:59:00' + place: Ramat Gan, Israel + start: 2019-06-02 + end: 2019-06-05 + sub: PY + location: + - title: PyCon Israel 2019 + latitude: 32.0686867 + longitude: 34.8246812 + +- conference: Python Serbia + year: 2019 + link: https://web.archive.org/web/20190326165724/https://pyser.org + cfp_link: https://web.archive.org/web/20211027143649/https://pyser.org/cfp + cfp: '2019-05-05 23:59:00' + place: Novi Sad, Serbia + start: 2019-06-01 + end: 2019-06-01 + sub: PY + location: + - title: Python Serbia 2019 + latitude: 45.2551338 + longitude: 19.8451756 + +- conference: PyCon Web + year: 2019 + link: https://web.archive.org/web/20190814160022/https://pyconweb.com/ + cfp: '2019-03-15 00:00:00' + place: Munich, Germany + start: 2019-05-25 + end: 2019-05-26 + sub: WEB + location: + - title: PyCon Web 2019 + latitude: 48.1371079 + longitude: 11.5753822 + +- conference: PyCon KyuShu + year: 2019 + link: https://web.archive.org/web/20190417080624/https://kyushu.pycon.jp/2019/ + cfp_link: https://web.archive.org/web/20190331214336/https://docs.google.com/forms/d/e/1FAIpQLSe05S0tA6yupwqeCVafm06RgYA42EbG9W6x2t5zFgKe4L4_hA/viewform + cfp: '2019-03-31 23:59:00' + place: Okinawa, Japan + start: 2019-05-18 + end: 2019-05-18 + sub: PY + location: + - title: PyCon KyuShu 2019 + latitude: 26.4748948 + longitude: 127.91146866408414 + +- conference: PyCon mini Sapporo + year: 2019 + link: https://web.archive.org/web/20190518044754/https://sapporo.pycon.jp/2019/ + cfp: '2019-03-31 23:59:00' + place: Sapporo, Japan + start: 2019-05-11 + end: 2019-05-11 + sub: PY + location: + - title: PyCon mini Sapporo 2019 + latitude: 43.061936 + longitude: 141.3542924 + +- conference: PyData Amsterdam + year: 2019 + link: https://web.archive.org/web/20210724114427/http://pydata.org/amsterdam2019/ + cfp: '2019-03-03 23:59:00' + place: Amsterdam, Netherlands + start: 2019-05-10 + end: 2019-05-12 + sub: DATA + location: + - title: PyData Amsterdam 2019 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: PyGrunn + year: 2019 + link: https://web.archive.org/web/20190608055024/http://www.pygrunn.org/ + cfp: '2019-02-01 23:59:00' + place: Groningen, Netherlands + start: 2019-05-10 + end: 2019-05-10 + sub: PY + location: + - title: PyGrunn 2019 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyDays Vienna + year: 2019 + link: https://web.archive.org/web/20190706080705/https://www.pydays.at/ + cfp_link: https://web.archive.org/web/20201108001255/https://www.pydays.at/cfp/ + cfp: '2019-03-25 23:59:00' + place: Vienna, Austria + start: 2019-05-03 + end: 2019-05-04 + sub: DAY,PY + location: + - title: PyDays Vienna 2019 + latitude: 48.1857192 + longitude: 16.4221587 + +- conference: PyCamp Argentina + year: 2019 + link: https://wiki.python.org.ar/PyCamp/2019/ + cfp: None + place: San Rafael, Argentina + start: 2019-05-02 + end: 2019-05-05 + sub: CAMP + location: + - title: PyCamp Argentina 2019 + latitude: -34.6126025 + longitude: -68.330514 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2019 + link: https://web.archive.org/web/20190415234356/https://www.pycon.it/en/ + cfp_link: https://web.archive.org/web/20190603095459/https://www.pycon.it/en/call-for-proposals/ + cfp: '2019-01-06 23:59:00' + place: Florence, Italy + start: 2019-05-02 + end: 2019-05-05 + sponsor: https://web.archive.org/web/20220126093606/https://pycon.it/en/sponsor + sub: PY + location: + - title: PyCon Italia 2019 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon US + year: 2019 + link: https://web.archive.org/web/20190503063302/https://us.pycon.org/2019/ + cfp_link: https://web.archive.org/web/20190331042834/https://us.pycon.org/2019/speaking/ + cfp: '2019-01-03 23:59:00' + tutorial_deadline: '2018-11-26 23:59:00' + place: Cleveland, USA + start: 2019-05-01 + end: 2019-05-10 + sponsor: https://web.archive.org/web/20190330221944/https://us.pycon.org/2019/sponsors/prospectus/ + sub: PY + location: + - title: PyCon US 2019 + latitude: 41.4996574 + longitude: -81.6936772 + +- conference: Python Sudeste + year: 2019 + link: https://web.archive.org/web/20190428171204/https://2019.pythonsudeste.org/ + cfp_link: https://web.archive.org/web/20211202024731/https://speakerfight.com/events/python-sudeste-2019-palestras/ + cfp: '2019-03-15 00:00:00' + place: Vitória, Brasil + start: 2019-04-26 + end: 2019-04-28 + sub: PY + location: + - title: Python Sudeste 2019 + latitude: -20.3200917 + longitude: -40.3376682 + +- conference: SciPy Japan + year: 2019 + link: https://web.archive.org/web/20190427005257/http://www.scipyjapan2019.scipy.org/ + cfp_link: https://easychair.org/cfp/SciPyJapan2019 + cfp: '2019-02-22 23:59:00' + place: Tokyo, Japan + start: 2019-04-23 + end: 2019-04-24 + sub: SCIPY + location: + - title: SciPy Japan 2019 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyTexas + year: 2019 + link: https://web.archive.org/web/20190417145918/https://www.pytexas.org/2019/ + cfp: '2019-02-03 23:59:00' + place: Austin, USA + start: 2019-04-13 + end: 2019-04-14 + sub: PY + location: + - title: PyTexas 2019 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: DjangoCon Europe + year: 2019 + link: https://web.archive.org/web/20190405121021/https://2019.djangocon.eu/ + cfp: '2019-01-20 23:59:00' + place: Copenhagen, Denmark + start: 2019-04-10 + end: 2019-04-14 + sub: WEB + location: + - title: DjangoCon Europe 2019 + latitude: 55.6867243 + longitude: 12.5700724 + +- conference: Moscow Python Conf++ + alt_name: MoscowPythonConf++ + year: 2019 + link: https://web.archive.org/web/20190404034605/http://mpc2019.tilda.ws/ + cfp: '2019-02-04 23:59:00' + place: Moscow, Russia + start: 2019-04-05 + end: 2019-04-05 + sub: PY + location: + - title: Moscow Python Conf++ 2019 + latitude: 55.625578 + longitude: 37.6063916 + +- conference: IndyPy Automate Conf + year: 2019 + link: https://web.archive.org/web/20210227152420/https://2019.indypy.org/automate/ + cfp: None + place: Indiana, USA + start: 2019-03-22 + end: 2019-03-22 + sub: PY + location: + - title: IndyPy Automate Conf 2019 + latitude: 40.3270127 + longitude: -86.1746933 + +- conference: PyCon Slovakia + alt_name: PyCon SK + year: 2019 + link: https://web.archive.org/web/20200807013346/https://2019.pycon.sk/ + cfp: '2019-02-14 23:59:00' + place: Bratislava, Slovakia + start: 2019-03-22 + end: 2019-03-24 + sub: PY + location: + - title: PyCon Slovakia 2019 + latitude: 48.1516988 + longitude: 17.1093063 + +- conference: PyCon Odessa + year: 2019 + link: https://web.archive.org/web/20220815150941/https://pyconodessa.com/en/2019/ + cfp: '2019-01-01 23:59:00' + place: Odessa, Ukraine + start: 2019-03-16 + end: 2019-03-16 + sub: PY + location: + - title: PyCon Odessa 2019 + latitude: 46.4843023 + longitude: 30.7322878 + +- conference: Wagtail Space Netherlands + year: 2019 + link: https://web.archive.org/web/20180830234810/https://www.wagtail.space/ + cfp: None + place: Arnhem, Netherlands + start: 2019-03-13 + end: 2019-03-15 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space Netherlands 2019 + latitude: 51.984257 + longitude: 5.9108573 + +- conference: Python Pizza Berlin + alt_name: Berlin Python Pizza + year: 2019 + link: https://web.archive.org/web/20190228024911/https://berlin.python.pizza/ + cfp: '2019-01-23 23:59:00' place: Berlin, Germany - sub: PY,PYDATA \ No newline at end of file + start: 2019-02-23 + end: 2019-02-23 + sub: PY + location: + - title: Python Pizza Berlin 2019 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyCon Asia Pacific + alt_name: PyCon Philippines + year: 2019 + link: https://web.archive.org/web/20190424124008/https://pycon.python.ph/ + cfp_link: https://web.archive.org/web/20240514194127/https://docs.google.com/forms/d/e/1FAIpQLSebxOMYx9ohAJFVMjBzKhcrzUfKSJxdnRrQbePcYLYNWg1EPg/closedform + cfp: '2018-12-23 23:59:00' + place: Manila, Philippines + start: 2019-02-23 + end: 2019-02-24 + sponsor: https://web.archive.org/web/20240329155454/https://docs.google.com/forms/d/e/1FAIpQLSfZ7g2QxEpA13QvvHUXvLHcQ0KAiJBEidDMY5UpRRPs_bb4gA/viewform + sub: PY + location: + - title: PyCon Asia Pacific 2019 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2019 + link: https://web.archive.org/web/20190219060618/https://pycon.python.ph/ + cfp_link: https://web.archive.org/web/20240514194127/https://docs.google.com/forms/d/e/1FAIpQLSebxOMYx9ohAJFVMjBzKhcrzUfKSJxdnRrQbePcYLYNWg1EPg/closedform + cfp: '2018-12-23 23:59:00' + place: Manila, Philippines + start: 2019-02-23 + end: 2019-02-24 + sub: PY + location: + - title: PyCon Philippines 2019 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCascades + year: 2019 + link: https://web.archive.org/web/20190221030506/https://2019.pycascades.com/ + cfp_link: https://web.archive.org/web/20180822003701/https://www.papercall.io/pycascades-2019 + cfp: '2018-10-21 23:59:00' + place: Seattle, USA + start: 2019-02-23 + end: 2019-02-25 + sponsor: https://web.archive.org/web/20210622113958/https://2019.pycascades.com/become-a-sponsor/ + sub: PY + location: + - title: PyCascades 2019 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2019 + link: https://web.archive.org/web/20181121113217/https://na.pycon.org/ + cfp: '2018-12-28 23:59:00' + place: Windhoek, Namibia + start: 2019-02-19 + end: 2019-02-21 + sub: PY + location: + - title: PyCon Namibia 2019 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: PyCaribbean + year: 2019 + link: https://web.archive.org/web/20190211053513/http://pycaribbean.com/ + cfp_link: https://web.archive.org/web/20210125195809/https://www.papercall.io/pycaribbean-2019 + cfp: '2018-11-15 23:59:00' + place: Santo Domingo, Dominican Republic + start: 2019-02-16 + end: 2019-02-17 + sub: PY + location: + - title: PyCaribbean 2019 + latitude: 18.4801972 + longitude: -69.942111 + +- conference: PyCon Belarus + year: 2019 + link: https://web.archive.org/web/20190223084649/https://by.pycon.org/ + cfp_link: https://papercall.io/pyconby + cfp: '2018-12-24 23:59:00' + place: Minsk, Belarus + start: 2019-02-15 + end: 2019-02-17 + sponsor: https://drive.google.com/file/d/1DEY7aYs7byXUwZLozHhoHs8uuLHq_la1/view + sub: PY + location: + - title: PyCon Belarus 2019 + latitude: 53.9024716 + longitude: 27.5618225 + +- conference: PyTennessee + year: 2019 + link: https://web.archive.org/web/20190301154334/http://www.pytennessee.org/ + cfp_link: https://web.archive.org/web/20190302101156/https://www.papercall.io/pytn2019 + cfp: '2018-11-01 23:59:00' + tutorial_deadline: '2018-11-01 23:59:00' + place: Nashville, USA + start: 2019-02-09 + end: 2019-02-10 + sponsor: https://pytennessee.org/prospectus + sub: PY + location: + - title: PyTennessee 2019 + latitude: 36.1622767 + longitude: -86.7742984 + +- conference: PyCon Colombia + year: 2019 + link: https://web.archive.org/web/20190208183622/https://www.pycon.co/ + cfp_link: https://papercall.io/pycon-colombia-2019-talks + cfp: '2018-09-01 23:59:00' + tutorial_deadline: '2018-09-01 23:59:00' + place: Medellin, Colombia + start: 2019-02-08 + end: 2019-02-10 + sub: PY + location: + - title: PyCon Colombia 2019 + latitude: 6.2697018 + longitude: -75.60252574475943 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2019 + link: https://fosdem.org/2019/schedule/track/python/ + cfp: '2018-12-01 23:59:00' + place: Brussels, Belgium + start: 2019-02-03 + end: 2019-02-03 + sub: PY + location: + - title: FOSDEM 2019 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: PyData Miami + year: 2019 + link: https://web.archive.org/web/20190519073219/https://pydata.org/miami2019/ + cfp: '2018-07-31 23:59:00' + place: Miami, USA + start: 2019-01-09 + end: 2019-01-11 + sub: DATA + location: + - title: PyData Miami 2019 + latitude: 25.7741728 + longitude: -80.19362 diff --git a/_data/conferences.yml b/_data/conferences.yml index 74978cb4493..79a78caaf2b 100644 --- a/_data/conferences.yml +++ b/_data/conferences.yml @@ -1,497 +1,967 @@ --- -- title: Python Web Conference - year: 2023 - id: pythonwebconference2023 - link: https://pythonwebconference.com/ - cfp: '2022-10-01 23:00:00' - start: 2023-03-13 - end: 2023-03-17 - date: March 13 – 17, 2023 - timezone: UTC+0 - place: Online - sub: WEB -- title: Scipy India - year: 2021 - id: pyconIN21 - link: https://scipy.in/2021 - cfp: '2022-01-07 23:59:00' - start: 2022-01-21 - end: 2022-01-22 - date: January 21 - 22, 2022 - timezone: Asia/Kolkata +- conference: PyCon Lithuania + year: 2027 + link: https://pycon.lt/2027/ + cfp_link: https://pycon.lt/2027/cfp + cfp: '2027-01-13 23:59:00' + place: Vilnius, Lithuania + start: 2027-04-28 + end: 2027-04-30 + sub: PY + location: + - title: PyCon Lithuania 2027 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: PyCon Wroclaw + year: 2026 + link: https://www.pyconwroclaw.com/ + cfp_link: https://cfp.pyconwroclaw.com/pycon-wroclaw-2026/cfp + cfp: '2026-09-30 23:59:00' + timezone: Europe/Warsaw + place: Wroclaw, Poland + start: 2026-11-20 + end: 2026-11-21 + sponsor: https://www.pyconwroclaw.com/#sponsors + twitter: pyconwroclaw + youtube: https://www.youtube.com/embed/NL9296S0mkM + sub: PY + location: + - title: PyCon Wroclaw 2026 + latitude: 51.1089776 + longitude: 17.0326689 + +- conference: PyCon Namibia + year: 2027 + link: https://na.pycon.org/ + cfp: '2026-09-21 01:59:00' + timezone: Africa/Windhoek + place: Windhoek, Namibia + start: 2027-02-19 + end: 2027-02-25 + mastodon: https://hachyderm.io/@PyConNA + bluesky: https://bsky.app/profile/pyconna.bsky.social + sub: PY + location: + - title: PyCon Namibia 2027 + latitude: -22.5597 + longitude: 17.0832 + +- conference: Wagtail Space + year: 2026 + link: https://wagtail.org/wagtail-space-2026/ + cfp_link: https://pretalx.com/wagtail-space-2026/cfp + cfp: '2026-09-11 23:59:00' + timezone: UTC place: Online - sub: SCIPY + start: 2026-11-18 + end: 2026-11-20 + sub: WEB -- title: PyCon DE & PyData Berlin - year: 2023 - id: pyconde2023 - link: https://2023.pycon.de/ - cfp: TBA - start: 2023-04-17 - end: 2023-04-19 - date: April 17 – 19, 2023 - timezone: Europe/Berlin - place: Berlin, Germany - sub: PY,PYDATA - -- title: PyCon Italy - year: 2022 - id: pyconitaly22 - link: https://pycon.it/en - cfp: '2022-01-16 23:59:59' - start: 2022-06-02 - end: 2022-06-06 - date: June 02 – 06, 2022 - place: Florence, Italy - sub: PY - -- title: PyCon Iran - year: 2022 - id: pyconiran2022 - link: https://ir.pycon.org/?lang=en - cfp: '2022-02-04 23:59:59' - start: 2022-02-16 - end: 2022-02-19 - date: February 16 – 19, 2022 - timezone: Asia/Tehran - place: null - sub: PY - -- title: SciPy US - year: 2022 - id: scipyUS22 - link: https://conference.scipy.org/ - cfp: '2022-02-22 23:59:00' - start: 2022-07-11 - end: 2022-07-17 - date: July 11 – 17, 2022 - timezone: America/Chicago - place: Austin, Texas, United States +- conference: Python Pizza Istanbul + alt_name: Istanbul Python Pizza + year: 2026 + link: https://istanbul.python.pizza/ + cfp_link: https://istanbul.python.pizza/cfp/ + cfp: '2026-08-25 23:59:00' + place: Istanbul, Turkey + start: 2026-11-14 + end: 2026-11-14 + sponsor: https://istanbul.python.pizza/sponsors/ + twitter: pythonpizzaist + sub: PY + location: + - title: Python Pizza Istanbul 2026 + latitude: 41.1088 + longitude: 29.0176 + +- conference: PyCon Netherlands + alt_name: PyCon NL + year: 2026 + link: https://pycon-nl.org/ + cfp_link: https://forms.gle/iiFnW8oZ8p9do4TR7 + cfp: '2026-08-23 23:59:00' + place: Utrecht, Netherlands + start: 2026-10-15 + end: 2026-10-15 + sponsor: https://www.pycon-nl.org/call-for-sponsors + mastodon: https://mastodon.social/@pycon_nl/ + sub: PY + location: + - title: PyCon Netherlands 2026 + latitude: 52.090833 + longitude: 5.121667 + +- conference: Django Day Copenhagen + year: 2026 + link: https://2026.djangoday.dk/ + cfp_link: https://2026.djangoday.dk/cfp/ + cfp: '2026-08-16 23:59:59' + timezone: Europe/Copenhagen + place: Copenhagen, Denmark + start: 2026-10-02 + end: 2026-10-02 + sponsor: https://2026.djangoday.dk/#supporters + mastodon: https://fosstodon.org/@djangodenmark + sub: WEB + location: + - title: Django Day Copenhagen 2026 + latitude: 50.0478 + longitude: 12.5604627 + +- conference: PyHEP.dev + alt_name: PyHEP + year: 2026 + link: https://indico.nikhef.nl/event/7873/ + cfp: '2026-08-14 23:59:00' + timezone: Europe/Amsterdam + place: Amsterdam, Netherlands + start: 2026-09-07 + end: 2026-09-09 sub: SCIPY - -- title: GeoPython - year: 2022 - id: geopython2022 - link: https://2022.geopython.net/ - cfp: '2022-02-28 12:00:00' - start: 2022-06-20 - end: 2022-06-23 - date: June 20 – 23, 2022 - place: Basel, Switzerland & Online + location: + - title: PyHEP.dev 2026 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2026 + link: https://za.pycon.org/ + cfp_link: https://za.pycon.org/pages/speaking/how_to_apply/ + cfp: '2026-08-14 23:59:00' + tutorial_deadline: '2026-08-14 23:59:00' + timezone: Africa/Johannesburg + place: Rondebosch, South Africa + start: 2026-10-14 + end: 2026-10-18 + twitter: PyConZA + mastodon: https://fosstodon.org/@PyConZA sub: PY - -- title: PyCon Estonia - year: 2022 - id: pyconestonia22 - link: https://pycon.ee/ - cfp: '2022-04-01 23:59:59' - start: 2022-08-25 - end: 2022-08-26 - date: August 25 – 26, 2022 - timezone: Europe/Tallinn - place: Tallinn, Estonia + location: + - title: PyCon South Africa 2026 + latitude: -33.959834 + longitude: 18.473872 + +- conference: PyData Global + year: 2026 + link: https://pydata.org/global2026/ + cfp: '2026-08-03 23:59:00' + cfp_ext: '2026-08-24 23:59:00' + workshop_deadline: '2026-08-03 23:59:00' + tutorial_deadline: '2026-08-03 23:59:00' + place: Online + start: 2026-12-08 + end: 2026-12-10 + sponsor: https://pydata.org/global2026/sponsor + finaid: https://pydata.org/global2026/about#diversity + sub: DATA + +- conference: Plone Conference + year: 2026 + link: https://2026.ploneconf.org/ + cfp_link: https://2026.ploneconf.org/call-for-proposals + cfp: '2026-07-31 23:59:00' + place: Maastricht, Netherlands + start: 2026-09-21 + end: 2026-09-27 + sponsor: https://2026.ploneconf.org/sponsors + twitter: ploneconf + mastodon: https://plone.social/@ploneconf + bluesky: https://bsky.app/profile/plone.org + youtube: https://www.youtube.com/@plonecms + sub: WEB + location: + - title: Plone Conference 2026 + latitude: 50.8513682 + longitude: 5.6909725 + +- conference: PyCon France + year: 2026 + link: https://www.pycon.fr/2026/en/ + cfp_link: https://cfp.pycon.fr/pyconfr-2026/cfp + cfp: '2026-07-31 23:59:00' + place: Biarritz, France + start: 2026-10-29 + end: 2026-11-01 + sponsor: https://www.pycon.fr/2026/en/support.html + mastodon: https://mamot.fr/@AFPy sub: PY - -- title: EuroPython - year: 2022 - id: europython2022 - link: https://www.europython.eu/ - cfp: '2022-04-03 23:59:59' - start: 2022-07-11 - end: 2022-07-18 - date: July 11 – 18, 2022 + location: + - title: PyCon France 2026 + latitude: 43.4711437 + longitude: -1.5527266 + +- conference: PyCon Ireland + year: 2026 + link: https://2026.pycon.ie/ + cfp_link: https://sessionize.com/pycon-ireland-2026/ + cfp: '2026-07-31 23:59:00' + cfp_ext: '2026-08-30 23:59:00' place: Dublin, Ireland + start: 2026-10-17 + end: 2026-10-17 sub: PY - -- title: PyCon Kenya Conference - year: 2022 - id: pyconkenyaconference2022 - link: https://www.pyconke.org/ - cfp: '2022-04-15 23:59:59' - start: 2022-05-06 - end: 2022-05-08 - date: May 06 – 08, 2022 + location: + - title: PyCon Ireland 2026 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyBay + year: 2026 + link: https://pybay.org/ + cfp_link: https://pybay.org/speaking/ + cfp: '2026-07-31 23:59:00' + timezone: America/Los_Angeles + place: San Francisco, USA + start: 2026-10-03 + end: 2026-10-03 + sponsor: https://pybay.org/sponsors/sponsor-us/ + sub: PY + location: + - title: PyBay 2026 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyCon Hong Kong + year: 2026 + link: https://www.pycon.hk/ + cfp: '2026-06-20 23:59:59' + timezone: Asia/Hong_Kong + place: Hong Kong, China + start: 2026-11-14 + end: 2026-11-15 + twitter: pyconhk + sub: PY + note: Conference dates are tentative pending official confirmation. + location: + - title: PyCon Hong Kong 2026 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: Python Nordeste + alt_name: PyNE + year: 2026 + link: https://pythonnordeste.org/ + cfp: '2026-06-19 23:59:00' + timezone: America/Bahia + place: Fortaleza, Brazil + start: 2026-08-13 + end: 2026-08-15 + sub: PY + location: + - title: Python Nordeste 2026 + latitude: -3.7319 + longitude: -38.5269 + +- conference: Python Ho + year: 2026 + link: https://2026.pythonho.com/ + cfp_link: https://sessionize.com/pyho-2026/ + cfp: '2026-06-15 23:59:00' + timezone: Africa/Accra + place: Ho, Ghana + start: 2026-10-23 + end: 2026-10-24 + sponsor: https://2026.pythonho.com/sponsors + sub: PY + location: + - title: Python Ho 2026 + latitude: 6.6126598 + longitude: 0.4688932 + +- conference: PyCon Kenya + year: 2026 + link: https://www.pycon.ke/ + cfp_link: https://cfp.pycon.ke/pycon-kenya-2026/cfp + cfp: '2026-06-10 00:00:00' timezone: Africa/Nairobi - place: Nairobi, Kenia - sub: PY - -- title: PyCon APAC - year: 2022 - id: pyconapac2022 - link: https://tw.pycon.org/ - cfp: '2022-04-15 23:59:59' - start: 2022-09-03 - end: 2022-09-05 - date: September 03 – 05, 2022 - place: Taiwan - sub: PY - -- title: PyCon Israel - year: 2022 - id: pyconisrael2022 - link: https://pycon.org.il/2022/ - cfp: '2022-04-30 23:59:59' - start: 2022-06-28 - end: 2022-06-30 - date: June 28 – 30, 2022 - timezone: Asia/Jerusalem - place: Ramat-Gan, Israel - sub: PY - -- title: PyCon Colombia - year: 2022 - id: pyconcolombia2022 - link: https://2022.pycon.co/ - cfp: '2022-04-30 23:59:59' - start: 2022-07-09 - end: 2022-07-11 - date: July 09 – 11, 2022 - timezone: America/Bogota - place: Online + place: Nairobi, Kenya + start: 2026-08-28 + end: 2026-08-29 + sponsor: https://www.pycon.ke/sponsors sub: PY - -- title: PyCon LT - year: 2022 - id: pyconlt2022 - link: http://pycon.lt/ - cfp: '2022-05-07 23:59:00' - start: 2022-05-26 - end: 2022-05-28 - date: May 26 – 28, 2022 - timezone: Europe/Vilnius - place: Vilnius, Lithuania + location: + - title: PyCon Kenya 2026 + latitude: -1.2136405 + longitude: 36.87930533266044 + +- conference: PyBeach + year: 2026 + link: https://2026.pybeach.org/ + cfp_link: https://pretalx.com/pybeach2026/cfp + cfp: '2026-06-07 23:59:00' + cfp_ext: '2026-06-08 23:59:00' + timezone: America/Los_Angeles + place: Santa Monica, USA + start: 2026-10-24 + end: 2026-10-24 + mastodon: https://fosstodon.org/@pybeach + bluesky: https://bsky.app/profile/pybeach.bsky.social sub: PY - -- title: PyConEs - year: 2022 - id: pycones22 - link: https://2022.es.pycon.org/ - cfp: '2022-05-31 23:59:59' - start: 2022-09-30 - end: 2022-10-03 - date: September 30 – 03, 2022 - timezone: Europe/Madrid - place: Granada, Spain - sub: PY - -- title: DjangoCon Europe - year: 2022 - id: djangoEU22 - link: https://2022.djangocon.eu/ - cfp: '2022-05-31 23:59:00' - start: 2022-12-12 - end: 2022-12-14 - date: September 21-25 2022 - timezone: Europe/Lisbon - place: Porto, Portugal - sub: WEB - -- title: DjangoCon US - year: 2022 - id: djangoCon2022 - link: https://2022.djangocon.us - cfp: '2022-06-11 07:31:00' - start: 2022-10-16 - end: 2022-10-21 - date: October 16 - 21, 2022 + location: + - title: PyBeach 2026 + latitude: 34.0194704 + longitude: -118.491227 + +- conference: PyTorch Conference + year: 2026 + link: https://events.linuxfoundation.org/pytorch-conference-north-america/ + cfp_link: https://sessionize.com/pytorch-conference-north-america-2026/ + cfp: '2026-06-07 23:59:00' timezone: America/Los_Angeles - place: San Diego, USA - sub: WEB - -- title: PyCon Japan - year: 2022 - id: pyconjp2022 - link: https://2022.pycon.jp/ - cfp: '2022-06-12 23:59:59' - start: 2022-10-14 - end: 2022-10-17 - date: October 14 – 17, 2022 - place: Tokyo, Japan - sub: PY - -- title: euroSciPy - year: 2022 - id: scipyEU22 - link: https://euroscipy.org/2022/ - cfp: '2022-06-13 23:59:59' - start: 2022-08-29 - end: 2022-09-02 - date: Aug 29 – Sep 2, 2022 + place: San Jose, USA + start: 2026-10-20 + end: 2026-10-21 + sub: DATA + note: Separate poster session CfP open until 2026-07-26. + location: + - title: PyTorch Conference 2026 + latitude: 37.3382082 + longitude: -121.8863286 + +- conference: PyCon Ghana + year: 2026 + link: https://gh.pycon.org/2026/ + cfp: '2026-06-06 23:59:00' + timezone: Africa/Accra + place: Accra, Ghana + start: 2026-08-20 + end: 2026-08-22 + sponsor: https://gh.pycon.org/2026/sponsors/ + sub: PY + location: + - title: PyCon Ghana 2026 + latitude: 5.5571096 + longitude: -0.2012376 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2026 + link: https://tw.pycon.org/2026/ + cfp_link: https://tw.pycon.org/2026/en-us/speaking/cfp + cfp: '2026-06-01 23:59:59' + place: Taipei, Taiwan + start: 2026-10-17 + end: 2026-10-18 + sponsor: https://tw.pycon.org/2026/en-us/sponsor + sub: PY + location: + - title: PyCon Taiwan 2026 + latitude: 25.033 + longitude: 121.5654 + +- conference: PyCon Togo + year: 2026 + link: https://pycontg.pytogo.org/ + cfp: '2026-05-31 18:00:00' + place: Lomé, Togo + start: 2026-08-28 + end: 2026-08-30 + sponsor: https://pycontg.pytogo.org/partners + youtube: https://www.youtube.com/@KwekuTech + sub: PY + location: + - title: PyCon Togo 2026 + latitude: 6.130419 + longitude: 1.215829 + +- conference: PyCon Japan + year: 2026 + link: https://2026.pycon.jp/ + cfp_link: https://pretalx.com/pyconjp2026/cfp + cfp: '2026-06-01 15:00:00' + timezone: Asia/Tokyo + place: Hiroshima, Japan + start: 2026-08-21 + end: 2026-08-22 + sponsor: https://2026.pycon.jp/en/sponsors + sub: PY + location: + - title: PyCon Japan 2026 + latitude: 34.3917241 + longitude: 132.4517589 + +- conference: Swiss Python Summit + year: 2026 + link: https://python-summit.ch/ + cfp_link: https://www.python-summit.ch/cfp/ + cfp: '2026-05-31 23:59:00' + cfp_ext: '2026-06-15 23:59:00' timezone: Europe/Zurich - place: Basel, Switzerland - sub: SCIPY - -- title: PyBay - year: 2022 - id: pybay22 - link: https://pybay.com/ - cfp: '2022-06-29 23:59:00' - start: 2022-09-10 - end: 2022-09-10 - date: September 10, 2022 - timezone: America/Los_Angeles - place: San Francisco, USA + place: Rapperswil, Switzerland + start: 2026-10-22 + end: 2026-10-23 + sponsor: https://www.python-summit.ch/sponsoring/ + twitter: pythonsummit + sub: PY,DATA + note: 'Day 1: General Python Day; Day 2: Data Science Day' + location: + - title: Swiss Python Summit 2026 + latitude: 47.223987 + longitude: 8.8173 + +- conference: PyCon Indonesia + year: 2026 + link: https://pycon.id/ + cfp_link: https://www.papercall.io/pyconid2026 + cfp: '2026-05-31 17:00:00' + timezone: UTC + place: Jakarta, Indonesia + start: 2026-08-08 + end: 2026-08-09 + sponsor: https://drive.google.com/file/d/1YVBx9KNewNCUyfgLhoNT9aM05sCaCvSG/view sub: PY - -- title: Pydata Yerevan - year: 2022 - id: pydataYerevan22 - link: https://pydata.org/yerevan2022 - cfp: '2022-06-30 23:59:00' - start: 2022-08-12 - end: 2022-08-13 - date: August 12 - 13, 2022 - timezone: Asia/Yerevan - place: Yerevan, Armenia - sub: PYDATA - -- title: PyCon Slovakia - year: 2022 - id: pyconsk2022 - link: https://2022.pycon.sk/en/ - cfp: '2022-06-30 23:59:59' - start: 2022-09-09 - end: 2022-09-12 - date: September 09 – 12, 2022 - timezone: Europe/Bratislava - place: Bratislava, Slovakia - sub: PY - -- title: PyCon Portugal - year: 2022 - id: pyconportugal2022 - link: https://2022.pycon.pt/ - cfp: '2022-06-30 23:59:00' - start: 2022-09-24 - end: 2022-09-25 - date: September 24 – 25, 2022 - timezone: Europe/Lisbon - place: Porto, Portugal - sub: PY - -- title: PyCon UK - year: 2022 - id: pyconUK22 - link: https://2022.pyconuk.org/ - cfp: '2022-07-02 16:59:59' - start: 2022-09-16 - end: 2022-09-18 - date: September 16 – 18, 2022 - timezone: Europe/London - place: Cardiff, United Kingdom - sub: PY - -- title: PyCon Brasil - year: 2022 - id: pyconBR22 - link: https://2022.pythonbrasil.org.br/ - cfp: '2022-07-03 23:59:00' - start: 2022-10-17 - end: 2022-10-23 - date: October 17 – 23, 2022 - timezone: America/Manaus - place: Manaus, Brasil - sub: PY - -- title: PyCon Korea - year: 2022 - id: pyconKR22 - link: https://2022.pycon.kr/ - cfp: '2022-07-14 23:59:00' - start: 2022-10-01 - end: 2022-10-02 - date: October 1 – 2, 2022 + location: + - title: PyCon Indonesia 2026 + latitude: -6.1753 + longitude: 106.8249 + +- conference: Python Brasil + year: 2026 + link: https://2026.pythonbrasil.org.br/ + cfp_link: https://talks.python.org.br/pybr26/cfp + cfp: '2026-05-24 00:00:00' + timezone: America/Sao_Paulo + place: Florianópolis, Brazil + start: 2026-10-14 + end: 2026-10-19 + mastodon: https://pynews.com.br/@pythonbrasil + sub: PY + location: + - title: Python Brasil 2026 + latitude: -27.5953778 + longitude: -48.5480367 + +- conference: PyCon Spain + year: 2026 + link: https://2026.es.pycon.org/en/ + cfp_link: https://pretalx.com/pycones-2026/ + cfp: '2026-05-17 23:59:00' + timezone: Europe/Madrid + place: Barcelona, Spain + start: 2026-11-06 + end: 2026-11-08 + sponsor: https://2026.es.pycon.org/en/sponsors/#about + finaid: https://2026.es.pycon.org/en/becas + bluesky: https://bsky.app/profile/es.pycon.org + sub: PY + location: + - title: PyCon Spain 2026 + latitude: 41.3866666 + longitude: 2.1636166 + +- conference: PyCon Russia + year: 2026 + link: https://www.pycon.ru/ + cfp_link: https://www.pycon.ru/cfp + cfp: '2026-05-15 23:59:00' + timezone: Europe/Moscow + place: Moscow, Russia + start: 2026-07-24 + end: 2026-07-25 + sponsor: https://www.pycon.ru/partneram + sub: PY + location: + - title: PyCon Russia 2026 + latitude: 55.7558 + longitude: 37.6173 + +- conference: PyCon Greece + year: 2026 + link: https://pycon.gr/ + cfp: '2026-05-10 23:59:00' + cfp_ext: '2026-05-17 23:59:00' + timezone: Europe/Athens + place: Athens, Greece + start: 2026-10-12 + end: 2026-10-13 + youtube: https://www.youtube.com/@pycongreece + sub: PY + location: + - title: PyCon Greece 2026 + latitude: 37.9755648 + longitude: 23.7348324 + +- conference: PyCon South Korea + alt_name: PyCon.KR + year: 2026 + link: https://2026.pycon.kr/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSeK_uM8byFE45mzWi3TLNzJm937vE6lYBmO4BchBW59wL3V9A/viewform?usp=header + cfp: '2026-05-09 23:59:59' + cfp_ext: '2026-06-14 23:59:59' timezone: Asia/Seoul - place: South Korea - sub: PY - -- title: SciPy Latin America - year: 2022 - id: scipyLatAm22 - link: https://pythoncientifico.ar/ - cfp: '2022-07-31 23:59:00' - start: 2022-09-26 - end: 2022-09-28 - date: September, 26-28, 2022 - timezone: America/Argentina - place: Salta, Argentina - sub: SCIPY - -- title: Python at Scale - year: 2022 - id: pythonatscale22 - link: https://www.pythonatscale.com/ - cfp: '2022-08-01 23:59:59' - start: 2022-10-27 - end: 2022-10-29 - date: October 27 – 29, 2022 - timezone: America/Chicago - place: Texas, USA and Online - sub: PYDATA - -- title: PyCon Ghana - year: 2022 - id: pyconGhana22 - link: http://gh.pycon.org/ - cfp: '2022-08-08 23:59:00' - start: 2022-10-13 - end: 2022-10-15 - date: October, 13-15, 2022 - timezone: Africa/Accra - place: Accra, Ghana + place: Seoul, South Korea + start: 2026-08-15 + end: 2026-08-17 + sponsor: https://2026.pycon.kr/sponsor/apply + twitter: PyConKR sub: PY - -- title: Pydata Miami - year: 2022 - id: pydataMiami22 - link: https://pydata.org/miami2022/ - cfp: '2022-08-08 23:59:00' - start: 2022-09-22 - end: 2022-09-22 - date: September 22, 2022 + location: + - title: PyCon Korea + latitude: 37.5580558199932 + longitude: 126.998311394625 + +- conference: PyCon Latin America + alt_name: PyCon LatAm + year: 2026 + link: https://www.pylatam.org/ + cfp: '2026-04-30 23:59:00' + place: Turrialba, Costa Rica + start: 2026-08-20 + end: 2026-08-23 + sub: PY + location: + - title: PyCon Latam 2026 + latitude: 9.7843604 + longitude: -83.4995932 + +- conference: PyCon Portugal + year: 2026 + link: https://2026.pycon.pt/ + cfp_link: https://pretalx.evolutio.pt/pycon-portugal-2026/cfp + cfp: '2026-04-30 23:59:00' + place: Aveiro, Portugal + start: 2026-09-03 + end: 2026-09-05 + sponsor: https://pycon.pt/sponsors/sponsorship/ + finaid: https://2026.pycon.pt/information/grants/ + youtube: https://www.youtube.com/@pyconportugal + sub: PY + location: + - title: PyCon Portugal 2026 + latitude: 40.640496 + longitude: -8.6537841 + +- conference: PyCon Colombia + year: 2026 + link: https://2026.pycon.co/ + cfp_link: https://2026.pycon.co/#/call-for-proposals + cfp: '2026-04-28 23:59:00' + cfp_ext: '2026-05-12 23:59:00' + tutorial_deadline: '2026-05-12 23:59:00' + place: Medellín, Colombia + start: 2026-07-24 + end: 2026-07-26 + sponsor: https://2026.pycon.co/#/sponsors + finaid: https://2026.pycon.co/scholarships + sub: PY + location: + - title: PyCon Colombia 2026 + latitude: 6.2443382 + longitude: -75.573553 + +- conference: Black Python Devs Leadership Summit + year: 2026 + link: https://blackpythondevs.com/bpd-events/black-python-devs-leadership-summit-2026-ohio.html + cfp_link: https://pretalx.com/pyohio-2026/submit/?track=6985-black-python-devs-leadership-summit + cfp: '2026-04-20 23:59:00' + place: Cleveland, USA + start: 2026-07-24 + end: 2026-07-24 + sub: PY + location: + - title: Black Python Devs Leadership Summit 2026 + latitude: 41.4996574 + longitude: -81.6936772 + +- conference: PyCon Cameroon + year: 2026 + link: https://pycon.pythoncameroon.org/ + cfp_link: https://sessionize.com/pycon-camerooon-2026/ + cfp: '2026-04-20 23:59:00' + timezone: Africa/Douala + place: Yaoundé, Cameroon + start: 2026-09-17 + end: 2026-09-19 + sub: PY + location: + - title: PyCon Cameroon 2026 + latitude: 3.8689867 + longitude: 11.5213344 + +- conference: PyOhio + year: 2026 + link: https://pyohio.org/2026/ + cfp_link: https://pretalx.com/pyohio-2026/cfp + cfp: '2026-04-20 08:00:00' timezone: America/New_York - place: Miami, Florida, USA - sub: PYDATA - -- title: PyCon Poland - year: 2022 - id: pyconPL22 - link: https://pl.pycon.org/2022 - cfp: '2022-08-13 23:59:00' - start: 2022-11-03 - end: 2022-11-06 - date: November 3 – 6, 2022 + place: Cleveland, USA + start: 2026-07-25 + end: 2026-07-26 + sponsor: https://www.pyohio.org/2026/PyOhio-2026-Sponsorship-Prospectus.pdf + mastodon: https://fosstodon.org/@pyohio + sub: PY + location: + - title: PyOhio 2026 + latitude: 41.4996574 + longitude: -81.6936772 + +- conference: PyData Amsterdam + year: 2026 + link: https://amsterdam.pydata.org/ + cfp_link: https://pretalx.com/pydata-amsterdam2026/cfp + cfp: '2026-04-19 23:59:00' + timezone: Europe/Amsterdam + place: Amsterdam, Netherlands + start: 2026-09-10 + end: 2026-09-11 + sub: DATA + location: + - title: PyData Amsterdam 2026 + latitude: 52.4036 + longitude: 4.8901 + +- conference: PyCon Africa + year: 2026 + link: https://africa.pycon.org/ + cfp_link: https://africa.pycon.org/2026/talks/proposals/ + cfp: '2026-04-16 23:59:00' + place: Kampala, Uganda + start: 2026-10-07 + end: 2026-10-11 + sponsor: https://africa.pycon.org/2026/sponsor-us/ + finaid: https://africa.pycon.org/2026/opportunity-grants/ + mastodon: https://mastodon.social/@pyconafrica + youtube: https://www.youtube.com/embed/nH9fLYR0Kfo + sub: PY + location: + - title: PyCon Africa 2026 + latitude: 0.3177137 + longitude: 32.5813539 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2026 + link: https://2026.pycon.org.au/ + cfp_link: https://pretalx.com/pycon-au-2026/cfp + cfp: '2026-03-30 21:59:00' + timezone: Australia/Brisbane + place: Brisbane, Australia + start: 2026-08-26 + end: 2026-08-30 + sponsor: https://2026.pycon.org.au/sponsor + finaid: https://2026.pycon.org.au/attend/financial-assistance + mastodon: https://mastodon.pycon.org.au/@pyconau + bluesky: https://bsky.app/profile/pyconau.bsky.social + sub: PY + location: + - title: PyCon Australia 2026 + latitude: -27.4689682 + longitude: 153.0234991 + +- conference: DjangoCon US + year: 2026 + link: https://2026.djangocon.us/ + cfp_link: https://pretalx.com/djangocon-us-2026/cfp + cfp: '2026-03-16 11:00:00' + cfp_ext: '2026-03-23 11:00:00' + timezone: America/Chicago + place: Chicago, USA + start: 2026-08-24 + end: 2026-08-28 + sponsor: https://2026.djangocon.us/sponsors/ + mastodon: https://fosstodon.org/@djangocon + sub: WEB + location: + - title: DjangoCon US 2026 + latitude: 41.8755616 + longitude: -87.6244212 + +- conference: SciPy US + alt_name: SciPy + year: 2026 + link: https://www.scipy2026.scipy.org/ + cfp_link: https://pretalx.com/scipy-2026/cfp + cfp: '2026-02-25 15:20:00' + cfp_ext: '2026-03-04 23:59:00' + tutorial_deadline: '2026-03-04 23:59:00' + timezone: America/Chicago + place: Minneapolis, USA + start: 2026-07-13 + end: 2026-07-19 + sponsor: https://www.scipy2026.scipy.org/s/SciPy26-SponsorProspectus-wn87.pdf + finaid: https://docs.google.com/forms/d/e/1FAIpQLSdVD-AHPDcoVF4FPKdaWDTS9NyZtGym0KxoKf6AnWxv0MIiWg/viewform + mastodon: https://mastodon.social/@SciPyConf + sub: SCIPY + location: + - title: SciPy US 2026 + latitude: 44.9772995 + longitude: -93.2654692 + +- conference: EuroPython + year: 2026 + link: https://ep2026.europython.eu/ + cfp_link: https://ep2026.europython.eu/cfp + cfp: '2026-02-15 23:55:00' + tutorial_deadline: '2026-02-15 23:59:00' + place: Kraków, Poland + start: 2026-07-13 + end: 2026-07-19 + sponsor: https://ep2026.europython.eu/sponsors + finaid: https://ep2026.europython.eu/finaid + twitter: EuroPython + mastodon: https://fosstodon.org/@europython + sub: PY + location: + - title: EuroPython 2026 + latitude: 50.0478 + longitude: 19.9314 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2026 + link: https://pl.pycon.org/2026/ + cfp_link: https://pyconpl.confreg.pl/events/67-pycon-pl-2026 + cfp: '2026-02-15 23:59:59' + tutorial_deadline: '2026-02-15 23:59:00' timezone: Europe/Warsaw place: Gliwice, Poland + start: 2026-08-27 + end: 2026-08-30 sub: PY - -- title: PyCon ZA - year: 2022 - id: pyconZA22 - link: https://za.pycon.org/ - cfp: '2022-08-19 23:59:00' - start: 2022-10-13 - end: 2022-10-14 - date: October 13 – 14, 2022 - place: Durban, South Africa - sub: PY - -- title: Pydata NYC - year: 2022 - id: pydataNYC22 - link: https://pydata.org/nyc2022/ - cfp: '2022-08-24 23:59:00' - start: 2022-11-09 - end: 2022-11-11 - date: November 09 – 11, 2022 - timezone: America/New_York - place: New York, NY, USA - sub: PYDATA - -- title: PyCon Ireland - year: 2022 - id: pyconIE22 - link: https://python.ie/pycon-2022/ - cfp: '2022-08-29 23:59:00' - start: 2022-11-12 - end: 2022-11-13 - date: November 12 – 13, 2022 - timezone: Europe/Dublin - place: Dublin, Ireland - sub: PY - -- title: PyCon Sweden - year: 2022 - id: pyconsweden22 - link: http://www.pycon.se - cfp: '2022-09-11 23:59:59' - start: 2022-11-03 - end: 2022-11-05 - date: November 03 – 05, 2022 + location: + - title: PyCon Poland 2026 + latitude: 50.294113 + longitude: 18.6657306 + +- conference: EuroSciPy + year: 2026 + link: https://euroscipy.org/ + cfp_link: https://euroscipy.org/call-for-proposals/ + cfp: '2026-02-08 23:59:00' + cfp_ext: '2026-03-01 23:59:00' + tutorial_deadline: '2026-02-22 23:59:00' + timezone: Europe/Berlin + place: Krakow, Poland + start: 2026-07-18 + end: 2026-07-23 + sub: SCIPY + location: + - title: EuroSciPy 2026 + latitude: 50.061389 + longitude: 19.938333 + +- conference: PyCon Sweden + year: 2026 + link: https://pycon.se/ + cfp_link: https://pretalx.com/pycon-sweden-2026/ + cfp: '2025-08-23 23:59:00' timezone: Europe/Stockholm place: Stockholm, Sweden + start: 2026-11-19 + end: 2026-11-20 + sponsor: https://pycon.se/#sponsorship + mastodon: https://unsplash.com/@micaelwidell?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText + youtube: https://www.youtube.com/c/PyConSweden sub: PY - -- title: PyData Tel Aviv - year: 2022 - id: pydataTelAviv22 - link: https://pydata.org/telaviv2022/ - cfp: '2022-09-12 23:59:00' - start: 2022-12-13 - end: 2022-12-13 - date: December 13th, 2022 - timezone: Asia/Jerusalem - place: Tel Aviv, Israel - sub: PYDATA - -- title: Pydata Eindhoven - year: 2022 - id: pydataEindhoven22 - link: https://pydata.org/eindhoven2022/ - cfp: '2022-11-02 23:59:00' - start: 2022-12-02 - end: 2022-12-02 - date: December 2, 2022 - timezone: Europe/Netherlands - place: Eindhoven, Netherlands - sub: PYDATA - -- title: Pydata Global - year: 2022 - id: pydataGlobal22 - link: https://pydata.org/global2022/ - cfp: '2022-09-12 23:59:00' - start: 2022-12-01 - end: 2022-12-03 - date: December 1 – 3, 2022 - timezone: UTC - place: Online - sub: PYDATA - -- title: Pyjamas Conf - year: 2022 - id: pyjamasconf22 - link: https://pyjamas.live - cfp: '2022-09-19 23:59:00' - start: 2022-11-26 - end: 2022-11-27 - date: November, 26-27, 2022 + location: + - title: PyCon Sweden 2026 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon Austria + year: 2027 + link: https://pycon.at/ + cfp: TBA + timezone: Europe/Vienna + place: Eisenstadt, Austria + start: 2027-04-25 + end: 2027-04-26 + mastodon: https://mastodon.social/@pycon_austria + sub: PY + location: + - title: PyCon Austria 2027 + latitude: 47.8454821 + longitude: 16.5249288 + +- conference: PyCon Germany + alt_name: PyCon Germany + year: 2027 + link: https://2027.pycon.de/ + cfp: TBA + timezone: Europe/Berlin + place: Heidelberg, Germany + start: 2027-04-20 + end: 2027-04-22 + sponsor: https://2027.pycon.de/sponsoring/ + mastodon: https://fosstodon.org/@pyconde + sub: PY,DATA + location: + - title: PyCon Germany & PyData Conference 2027 + latitude: 49.4093582 + longitude: 8.694724 + +- conference: SciPy India + year: 2026 + link: https://scipy.in/2026/ + cfp: '2026-10-19 23:59:00' + cfp_link: https://cfp.scipy.in/scipy-india-2026/cfp + timezone: Asia/Kolkata + place: Chennai, India + start: 2026-12-19 + end: 2026-12-20 + sponsor: https://scipy.in/2026/sponsor.html + mastodon: https://fosstodon.org/@scipyindia + bluesky: https://bsky.app/profile/scipy.in + youtube: https://www.youtube.com/@scipy-india + sub: SCIPY + location: + - title: SciPy India 2026 + latitude: 12.9917014 + longitude: 80.2295271 + +- conference: Python E-Commerce Forum + year: 2026 + link: https://codehut.co.uk/2026/ + cfp: TBA + place: Edinburgh, UK + start: 2026-11-26 + end: 2026-11-28 + sub: PY + location: + - title: Python E-Commerce Forum 2026 + latitude: 55.9533456 + longitude: -3.1883749 + +- conference: XtremePython + year: 2026 + link: https://xtremepython.dev/ + cfp: TBA place: Online + start: 2026-11-17 + end: 2026-11-17 sub: PY - full_name: Laziest Conference ever - note: Support any language of talks -- title: PyCon US - year: 2023 - id: pyconus23 - link: https://us.pycon.org/2023/ +- conference: PyCon Tanzania + alt_name: Python Tanzania Conference + year: 2026 + link: https://pycon.or.tz/ cfp: TBA - start: 2023-04-19 - end: 2023-04-28 - date: April 19 – 28, 2023 - place: Salt Lake City, Utah, USA + place: Dar Es Salaam, Tanzania + start: 2026-11-14 + end: 2026-11-16 sub: PY - -- title: PyCon Bolivia - year: 2022 - id: pyconbolivia22 - link: https://pycon.pybol.org/ + location: + - title: PyCon Tanzania 2026 + latitude: -6.8160837 + longitude: 39.2803583 + +- conference: FastAPI Conference + year: 2026 + link: https://fastapiconf.com/ cfp: TBA - start: 2022-12-09 - end: 2022-12-10 - date: December 9 - 10, 2022 - place: Cochabamba, Bolivia + place: Amsterdam, The Netherlands + start: 2026-10-28 + end: 2026-10-28 sub: PY - -- title: PyCon Namibia - year: 2023 - id: pyconnamibia23 - link: https://na.pycon.org + location: + - title: FastAPI Conference 2026 + latitude: 52.3730796 + longitude: 4.8924534 + +- conference: PyCon Panamá + year: 2026 + link: https://pycon.pa/2026/ cfp: TBA - start: 2023-02-21 - end: 2023-02-23 - date: February 21 - 23, 2023 - place: Windhoek, Namibia - timezone: Africa/Windhoek + place: Panama City, Panamá + start: 2026-10-22 + end: 2026-10-23 sub: PY + location: + - title: PyCon Panamá 2026 + latitude: 8.9714493 + longitude: -79.5341802 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2026 + link: https://pycon.ee/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSewbFKG6BEsGXR9ilgsW1wqfmzRR0Pf9XDO5WXTFhrcgrrN3g/viewform + cfp: Cancelled + cfp_ext: '2026-02-28 23:59:00' + place: Tallinn, Estonia + start: 2026-10-08 + end: 2026-10-09 + sponsor: https://pycon.ee/#sponsors + sub: PY + location: + - title: PyCon Estonia 2026 + latitude: 59.4372155 + longitude: 24.7453688 + +- conference: EARL + year: 2026 + link: https://earl-conference.com/ + cfp: TBA + timezone: Europe/London + place: Brighton, UK + start: 2026-10-06 + end: 2026-10-08 + sponsor: https://earl-conference.com/earl-archive/sponsors/ + youtube: https://www.youtube.com/channel/UCytOFkoZJfinB9rdRIOfRow?view_as=subscriber + sub: BIZ + location: + - title: EARL 2026 + latitude: 50.8214626 + longitude: -0.1400561 + +- conference: Pythoncamp Rügen + year: 2026 + link: https://barcamps.eu/pythoncamp-ruegen-2026/ + cfp: TBA + timezone: Europe/Berlin + place: Rügen, Germany + start: 2026-09-26 + end: 2026-09-27 + sponsor: https://barcamps.eu/pythoncamp-ruegen-2026/sponsoren + sub: CAMP + location: + - title: Pythoncamp Rügen 2026 + latitude: 54.4529015 + longitude: 13.3882344 + +- conference: PyHEP + year: 2026 + link: https://indico.cern.ch/category/7971/ + cfp: TBA + timezone: Europe/Zurich + place: Geneva, Switzerland + start: 2026-09-07 + end: 2026-09-09 + sub: PY + location: + - title: PyHEP 2026 + latitude: 46.2047169 + longitude: 6.1423106290939335 + +- conference: PyCamp Leipzig + year: 2026 + link: https://barcamps.eu/python-barcamp-leipzig-2026/ + cfp: TBA + timezone: Europe/Berlin + place: Leipzig, Germany + start: 2026-08-01 + end: 2026-08-02 + sub: CAMP + location: + - title: PyCamp Leipzig 2026 + latitude: 51.3406321 + longitude: 12.3747329 + +- conference: PyCon Armenia + alt_name: PyData PyCon Armenia + year: 2026 + link: https://pycon.am/ + cfp: TBA + timezone: Asia/Yerevan + place: Yerevan, Armenia + start: 2026-07-24 + end: 2026-07-25 + sponsor: https://pycon.am/#sponsors + sub: PY,DATA + location: + - title: PyData PyCon Armenia 2026 + latitude: 40.1777112 + longitude: 44.5126233 diff --git a/_data/legacy.yml b/_data/legacy.yml new file mode 100644 index 00000000000..d60861dd906 --- /dev/null +++ b/_data/legacy.yml @@ -0,0 +1,7651 @@ +--- + +- conference: Wagtail Space US + year: 2018 + link: https://web.archive.org/web/20180531043322/https://us.wagtail.space/ + cfp: None + place: Philadelphia, USA + start: 2018-06-14 + end: 2018-06-16 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space US 2018 + latitude: 39.9533 + longitude: -75.198 + +- conference: Wagtail Space Netherlands + year: 2018 + link: https://web.archive.org/web/20171219231516/http://www.wagtail.space/ + cfp: None + place: Arnhem, Netherlands + start: 2018-03-14 + end: 2018-03-16 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space Netherlands 2018 + latitude: 51.984257 + longitude: 5.9108573 + +- conference: Wagtail Space Netherlands + year: 2017 + link: https://web.archive.org/web/20161222235503/https://www.wagtail.space/ + cfp: None + place: Arnhem, Netherlands + start: 2017-03-21 + end: 2017-03-25 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space Netherlands 2017 + latitude: 51.984257 + longitude: 5.9108573 + +- conference: Wagtail Space Minsk + year: 2018 + link: https://minsk.wagtail.space/ + cfp: None + place: Minsk, Belarus + start: 2018-10-27 + end: 2018-10-28 + mastodon: https://fosstodon.org/@wagtail + sub: WEB + location: + - title: Wagtail Space Minsk 2018 + latitude: 53.8901239 + longitude: 27.5693855 + +- conference: Swiss Python Summit + year: 2018 + link: https://web.archive.org/web/20180205001500/http://www.python-summit.ch/ + cfp: '2017-10-31 23:59:00' + place: Rapperswil, Switzerland + start: 2018-02-16 + end: 2018-02-16 + sub: PY + location: + - title: Swiss Python Summit 2018 + latitude: 47.2266532 + longitude: 8.8164042 + +- conference: Swiss Python Summit + year: 2017 + link: https://web.archive.org/web/20170214143104/http://www.python-summit.ch/ + cfp: '2016-10-31 23:59:00' + place: Rapperswil, Switzerland + start: 2017-02-17 + end: 2017-02-17 + sub: PY + location: + - title: Swiss Python Summit 2017 + latitude: 47.2266532 + longitude: 8.8164042 + +- conference: Swiss Python Summit + year: 2016 + link: https://web.archive.org/web/20160316131658/http://www.python-summit.ch/ + cfp: '2015-10-31 23:59:00' + place: Rapperswil, Switzerland + start: 2016-02-05 + end: 2016-02-06 + sub: PY + location: + - title: Swiss Python Summit 2016 + latitude: 47.2266532 + longitude: 8.8164042 + +- conference: SciPy US + alt_name: SciPy + year: 2018 + link: https://web.archive.org/web/20190625030722/https://scipy2018.scipy.org/ + cfp: '2018-02-15 23:59:00' + place: Austin, USA + start: 2018-07-09 + end: 2018-07-15 + sub: SCIPY + location: + - title: SciPy US 2018 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2017 + link: https://web.archive.org/web/20190502153803/https://scipy2017.scipy.org/ + cfp: '2017-03-27 23:59:00' + timezone: America/Chicago + place: Austin, USA + start: 2017-07-10 + end: 2017-07-16 + sub: SCIPY + location: + - title: SciPy US 2017 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2016 + link: https://web.archive.org/web/20190505024043/https://scipy2016.scipy.org/ + cfp: '2016-04-01 23:59:00' + place: Austin, USA + start: 2016-07-10 + end: 2016-07-16 + sub: SCIPY + location: + - title: SciPy US 2016 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2015 + link: https://web.archive.org/web/20190625031421/https://scipy2015.scipy.org/ + cfp: '2015-04-10 23:59:00' + place: Austin, USA + start: 2015-07-06 + end: 2015-07-12 + sub: SCIPY + location: + - title: SciPy US 2015 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2014 + link: https://web.archive.org/web/20140625194831/https://conference.scipy.org/scipy2014/ + cfp: '2014-04-01 23:59:00' + place: Austin, USA + start: 2014-07-06 + end: 2014-07-12 + sub: SCIPY + location: + - title: SciPy US 2014 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2013 + link: https://web.archive.org/web/20130621023952/http://conference.scipy.org/scipy2013/ + cfp: '2013-03-20 23:59:00' + place: Austin, USA + start: 2013-06-24 + end: 2013-06-29 + sub: SCIPY + location: + - title: SciPy US 2013 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2012 + link: https://web.archive.org/web/20120621023952/http://conference.scipy.org/scipy2012/ + cfp: '2012-04-30 23:59:00' + place: Austin, USA + start: 2012-07-16 + end: 2012-07-21 + sub: SCIPY + location: + - title: SciPy US 2012 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2011 + link: https://web.archive.org/web/20110621023952/http://conference.scipy.org/scipy2011/ + cfp: '2011-04-24 23:59:00' + place: Austin, USA + start: 2011-07-11 + end: 2011-07-16 + sub: SCIPY + location: + - title: SciPy US 2011 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2010 + link: https://web.archive.org/web/20100621023952/http://conference.scipy.org/scipy2010/ + cfp: '2010-04-11 23:59:00' + place: Austin, USA + start: 2010-06-28 + end: 2010-07-03 + sub: SCIPY + location: + - title: SciPy US 2010 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: SciPy US + alt_name: SciPy + year: 2009 + link: https://web.archive.org/web/20090621023952/http://conference.scipy.org/scipy2009/ + cfp: '2009-07-03 23:59:00' + place: Pasadena, USA + start: 2009-08-18 + end: 2009-08-23 + sub: SCIPY + location: + - title: SciPy US 2009 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy US + alt_name: SciPy + year: 2008 + link: https://web.archive.org/web/20080621023952/http://conference.scipy.org/scipy2008/ + cfp: '2008-06-30 23:59:00' + place: Pasadena, USA + start: 2008-08-19 + end: 2008-08-24 + sub: SCIPY + location: + - title: SciPy US 2008 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy US + alt_name: SciPy + year: 2007 + link: https://web.archive.org/web/20070426090312/http://www.scipy.org/SciPy2007 + cfp: '2007-07-27 23:59:00' + place: Pasadena, USA + start: 2007-08-14 + end: 2007-08-18 + sub: SCIPY + location: + - title: SciPy US 2007 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy US + alt_name: SciPy + year: 2006 + link: https://web.archive.org/web/20060805100237/http://www.scipy.org/SciPy2006/ + cfp: '2006-07-07 23:59:00' + place: Pasadena, USA + start: 2006-08-17 + end: 2006-08-18 + sub: SCIPY + location: + - title: SciPy US 2006 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy US + alt_name: SciPy + year: 2005 + link: https://web.archive.org/web/20111021085638/http://scipy.org/Developer_Zone/Conferences/SciPy2005 + cfp: '2005-07-29 23:59:00' + place: Pasadena, USA + start: 2005-09-22 + end: 2005-09-23 + sub: SCIPY + location: + - title: SciPy US 2005 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy US + alt_name: SciPy + year: 2004 + link: https://web.archive.org/web/20041210084850/http://www.scipy.org/wikis/scipy04 + cfp: '2004-07-23 23:59:00' + place: Pasadena, USA + start: 2004-09-02 + end: 2004-09-03 + sub: SCIPY + location: + - title: SciPy US 2004 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy US + alt_name: SciPy Workshop + year: 2003 + link: https://web.archive.org/web/20031207151811/http://www.scipy.org/site_content/scipy03/ + cfp: None + place: Pasadena, USA + start: 2003-09-11 + end: 2003-09-12 + sub: SCIPY + location: + - title: SciPy US 2003 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy US + alt_name: SciPy Workshop + year: 2002 + link: https://web.archive.org/web/20021030003450/http://www.scipy.org/site_content/scipy02/ + cfp: None + place: Pasadena, USA + start: 2002-09-05 + end: 2002-09-06 + sub: SCIPY + location: + - title: SciPy US 2002 + latitude: 34.1476507 + longitude: -118.144155 + +- conference: SciPy Latin America + alt_name: SciPyLA + year: 2018 + link: https://web.archive.org/web/20180518213755/http://conf.scipyla.org/scipyla2018/ + cfp: '2018-07-22 00:07:00' + timezone: UTC + place: Curitiba, Brazil + start: 2018-08-29 + end: 2018-09-01 + sub: SCIPY + location: + - title: SciPy Latin America 2018 + latitude: -25.4295963 + longitude: -49.2712724 + +- conference: SciPy Latin America + alt_name: SciPyLA + year: 2016 + link: https://web.archive.org/web/20160518213755/http://conf.scipyla.org/scipyla2016/ + cfp: '2016-04-08 23:59:00' + place: Florianópolis, Brazil + start: 2016-05-16 + end: 2016-05-20 + sub: SCIPY + location: + - title: SciPy Latin America 2016 + latitude: -27.5973002 + longitude: -48.5496098 + +- conference: SciPy Latin America + year: 2015 + link: https://web.archive.org/web/20150508131405/http://conf.scipyla.org/ + cfp: '2015-04-13 23:59:00' + place: Posadas, Argentina + start: 2015-05-20 + end: 2015-05-22 + sub: SCIPY + location: + - title: SciPy Latin America 2015 + latitude: -27.4035083 + longitude: -55.949711812781445 + +- conference: SciPy Latin America + alt_name: SciPyCon Argentina + year: 2014 + link: https://web.archive.org/web/20141016082426/http://scipycon.com.ar/ + cfp: None + place: Bahía Blanca, Argentina + start: 2014-10-20 + end: 2014-10-24 + sub: SCIPY + location: + - title: SciPy Latin America 2014 + latitude: -38.7176522 + longitude: -62.2654871 + +- conference: SciPy Latin America + alt_name: SciPyCon Argentina + year: 2013 + link: https://web.archive.org/web/20210307212917/https://www.scipy.lat/conf/2013/ + cfp: None + place: Puerto Madryn, Argentina + start: 2013-05-16 + end: 2013-05-18 + sub: SCIPY + location: + - title: SciPy Latin America 2013 + latitude: -42.7729674 + longitude: -65.0366104 + +- conference: SciPy India + year: 2018 + link: https://web.archive.org/web/20190424124043/https://scipy.in/2018 + cfp: '2018-12-03 23:59:00' + place: Mumbai, India + start: 2018-12-21 + end: 2018-12-22 + sub: SCIPY + location: + - title: SciPy India 2018 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: SciPy India + year: 2017 + link: https://web.archive.org/web/20171005212148/http://scipy.in/2017 + cfp: '2017-11-10 23:59:00' + place: Mumbai, India + start: 2017-11-29 + end: 2017-11-30 + sub: SCIPY + location: + - title: SciPy India 2017 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: SciPy India + year: 2016 + link: https://web.archive.org/web/20170629091110/http://scipy.in/2016 + cfp: '2016-11-28 23:59:00' + place: Mumbai, India + start: 2016-12-10 + end: 2016-12-11 + sub: SCIPY + location: + - title: SciPy India 2016 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: SciPy India + year: 2015 + link: https://web.archive.org/web/20151222204316/http://scipy.in/2015 + cfp: '2015-10-15 23:59:00' + place: Mumbai, India + start: 2015-12-14 + end: 2015-12-16 + sub: SCIPY + location: + - title: SciPy India 2015 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: SciPy India + year: 2014 + link: https://web.archive.org/web/20141222103930/http://scipy.in/2014 + cfp: '2014-10-15 23:59:00' + place: Mumbai, India + start: 2014-12-05 + end: 2014-12-07 + sub: SCIPY + location: + - title: SciPy India 2014 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: SciPy India + year: 2013 + link: https://web.archive.org/web/20131023113605/http://scipy.in/2013 + cfp: '2013-12-02 23:59:00' + place: Mumbai, India + start: 2013-12-13 + end: 2013-12-15 + sub: SCIPY + location: + - title: SciPy India 2013 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: SciPy India + year: 2012 + link: https://web.archive.org/web/20140108235207/http://scipy.in/2012 + cfp: '2012-11-01 23:59:00' + place: Mumbai, India + start: 2012-12-27 + end: 2012-12-29 + sub: SCIPY + location: + - title: SciPy India 2012 + latitude: 18.9733536 + longitude: 72.82810491917377 + +- conference: RuPy + alt_name: RuPy - Budapest Edition + year: 2013 + link: https://web.archive.org/web/20130820170135/http://13.rupy.eu/ + cfp: '2013-07-31 23:59:00' + place: Budapest, Hungary + start: 2013-10-11 + end: 2013-10-13 + sub: PY + location: + - title: RuPy 2013 + latitude: 47.48138955 + longitude: 19.14609412691246 + +- conference: RuPy + alt_name: RuPy - Brazil Edition + year: 2012 + link: https://web.archive.org/web/20121205070033/http://rupy.com.br/ + cfp: '2012-07-31 23:59:00' + place: São Paulo, Brazil + start: 2012-12-08 + end: 2012-12-09 + sub: PY + location: + - title: RuPy 2012 + latitude: -1.2043218 + longitude: -47.1583944 + +- conference: RuPy + alt_name: RuPy - Brno Edition + year: 2012 + link: https://web.archive.org/web/20121207203445/http://12.rupy.eu/ + cfp: '2012-07-31 23:59:00' + place: Brno, Czechia + start: 2012-11-16 + end: 2012-11-18 + sub: PY + location: + - title: RuPy 2012 + latitude: 49.1922443 + longitude: 16.6113382 + +- conference: Rencontres django + year: 2010 + link: https://web.archive.org/web/20110301023828/http://rencontres.django-fr.org/2010/ + cfp: None + place: Marseille, France + start: 2010-04-24 + end: 2010-04-25 + sub: WEB + location: + - title: Rencontres django 2010 + latitude: 43.2961743 + longitude: 5.3699525 + +- conference: PyWaw Summit + year: 2015 + link: https://web.archive.org/web/20160324001812/http://summit.pywaw.org/2015/ + cfp: '2015-03-31 23:59:00' + place: Warsaw, Poland + start: 2015-05-25 + end: 2015-05-26 + sub: PY + location: + - title: PyWaw Summit 2015 + latitude: 52.2319581 + longitude: 21.0067249 + +- conference: Python Weekend Romania + year: 2014 + link: https://web.archive.org/web/20141018180902/http://conference.ropython.org/ + cfp: None + place: Iași, Romania + start: 2014-10-18 + end: 2014-10-19 + sub: PY + location: + - title: Python Weekend Romania 2014 + latitude: 47.1615416 + longitude: 27.5837224 + +- conference: Python Unconference + year: 2016 + link: https://web.archive.org/web/20160923012718/http://www.pyunconf.de/ + cfp: None + place: Hamburg, Germany + start: 2016-09-09 + end: 2016-09-12 + sub: PY + location: + - title: Python Unconference 2016 + latitude: 53.5672881 + longitude: 9.941726150411604 + +- conference: Python Unconference + year: 2015 + link: https://web.archive.org/web/20150906234810/http://www.pyunconf.de/ + cfp: None + place: Hamburg, Germany + start: 2015-09-04 + end: 2015-09-07 + sub: PY + location: + - title: Python Unconference 2015 + latitude: 53.5672881 + longitude: 9.941726150411604 + +- conference: Python Unconference + year: 2014 + link: https://web.archive.org/web/20150906234810/http://www.pyunconf.de/ + cfp: None + place: Hamburg, Germany + start: 2014-11-29 + end: 2014-12-01 + sub: PY + location: + - title: Python Unconference 2014 + latitude: 53.5672881 + longitude: 9.941726150411604 + +- conference: Python Sul + alt_name: Python Sul (Brazil) + year: 2017 + link: https://web.archive.org/web/20170902194604/http://pythonsul.org/ + cfp_link: https://web.archive.org/web/20170816000716/http://speakerfight.com/events/python-sul-2017-palestras/ + cfp: '2017-03-30 00:00:00' + place: Caxias do Sul, Brazil + start: 2017-09-08 + end: 2017-09-10 + sub: PY + location: + - title: Python Sul 2017 + latitude: -29.1685045 + longitude: -51.1796385 + +- conference: Python Serbia + year: 2018 + link: https://web.archive.org/web/20180326165724/https://pyser.org + cfp: '2018-05-06 23:59:00' + place: Novi Sad, Serbia + start: 2018-06-09 + end: 2018-06-09 + sub: PY + location: + - title: Python Serbia 2018 + latitude: 45.2551338 + longitude: 19.8451756 + +- conference: Python San Sebastian + year: 2018 + link: https://web.archive.org/web/20181008223234/http://pyss18.pyss.org/ + cfp: '2018-09-15 23:59:00' + place: Kursaal, Spain + start: 2018-10-12 + end: 2018-10-15 + sub: PY + location: + - title: Python San Sebastian 2018 + latitude: 43.3222716 + longitude: -1.9856145 + +- conference: Python San Sebastian + year: 2017 + link: https://web.archive.org/web/20170909095524/http://pyss17.pyss.org/ + cfp: '2017-09-01 23:59:00' + place: San Sebastián, Spain + start: 2017-10-06 + end: 2017-10-08 + sub: PY + location: + - title: Python San Sebastian 2017 + latitude: 43.3224219 + longitude: -1.9838889 + +- conference: Python San Sebastian + year: 2016 + link: http://pyss16.pyss.org/ + cfp: '2017-08-31 23:59:00' + place: San Sebastian, Spain + start: 2016-09-30 + end: 2016-10-03 + sub: PY + location: + - title: Python San Sebastian 2016 + latitude: 43.3224219 + longitude: -1.9838889 + +- conference: Python San Sebastian + year: 2015 + link: https://web.archive.org/web/20150805095718/http://pyss15.pyss.org/en/ + cfp: '2015-09-25 23:59:00' + place: San Sebastian, Spain + start: 2015-10-24 + end: 2015-10-25 + sub: PY + location: + - title: Python San Sebastian 2015 + latitude: 43.3224219 + longitude: -1.9838889 + +- conference: Python San Sebastian + year: 2014 + link: https://web.archive.org/web/20150109142404/http://www.pyss.org/ + cfp: '2014-08-31 23:59:00' + place: San Sebastian, Spain + start: 2014-09-26 + end: 2014-09-29 + sub: PY + location: + - title: Python San Sebastian 2014 + latitude: 43.3224219 + longitude: -1.9838889 + +- conference: Python Nordeste + year: 2018 + link: https://web.archive.org/web/20181220005202/https://2018.pythonnordeste.org/ + cfp_link: https://web.archive.org/web/20210516001802/https://speakerfight.com/events/python-nordeste-2018-24-25-e-26-de-maio-campina-grandepb-palestras/ + cfp: '2018-04-20 23:00:00' + cfp_ext: '2018-04-27 23:55:00' + timezone: America/Recife + place: Campina Grande, Brazil + start: 2018-05-24 + end: 2018-05-26 + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2018 + latitude: -7.23056 + longitude: -35.88111 + +- conference: Python Nordeste + year: 2017 + link: https://web.archive.org/web/20170609010039/http://2017.pythonnordeste.org/ + cfp_link: https://web.archive.org/web/20170429161113/http://speakerfight.com/events/palestras-python-nordeste-2017-sao-luis-ma/ + cfp: '2017-04-10 23:55:00' + timezone: America/Recife + place: São Luís, Brazil + start: 2017-06-08 + end: 2017-06-10 + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2017 + latitude: -2.5307316 + longitude: -44.3068265 + +- conference: Python Nordeste + year: 2016 + link: https://web.archive.org/web/20160614023844/http://2016.pythonnordeste.org/ + cfp_link: https://web.archive.org/web/20160612043438/http://speakerfight.com/events/python-nordeste-2016/ + cfp: '2016-05-07 23:55:00' + timezone: America/Recife + place: São Luís, Brazil + start: 2016-06-09 + end: 2016-06-11 + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2016 + latitude: -2.5307316 + longitude: -44.3068265 + +- conference: Python Nordeste + year: 2015 + link: https://web.archive.org/web/20150428210556/http://2015.pythonnordeste.org/ + cfp_link: https://speakerfight.com/events/python-nordeste-2015/ + cfp: '2015-03-27 12:00:00' + timezone: America/Recife + place: Natal, Brazil + start: 2015-05-15 + end: 2015-06-16 + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2015 + latitude: -5.7944777 + longitude: -35.2119324 + +- conference: Python Nordeste + year: 2014 + link: https://web.archive.org/web/20140411192842/http://2014.pythonnordeste.org/ + cfp: '2014-03-31 23:55:00' + timezone: America/Recife + place: Salvador, Brazil + start: 2014-05-01 + end: 2014-05-03 + twitter: pythonnordeste + sub: PY + location: + - title: Python Nordeste 2014 + latitude: -5.7944777 + longitude: -35.2119324 + +- conference: Python Nordeste + year: 2013 + link: https://web.archive.org/web/20160708210325/http://2013.pythonnordeste.org/ + cfp: '2013-03-01 00:00:00' + place: Fortaleza, Brazil + start: 2013-05-24 + end: 2013-05-25 + sub: PY + location: + - title: Python Nordeste 2013 + latitude: -3.7304512 + longitude: -38.5217989 + +- conference: Python Namibia + year: 2015 + link: https://web.archive.org/web/20150201083907/http://python-namibia.org/ + cfp: '2014-12-15 23:59:00' + place: Windhoek, Namibia + start: 2015-02-02 + end: 2015-02-05 + sub: PY + location: + - title: Python Namibia 2015 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: Python in finance + year: 2013 + link: https://web.archive.org/web/20130815205435/http://python-in-finance.com/ + cfp: None + place: New York, USA + start: 2013-04-05 + end: 2013-04-05 + sub: PY + location: + - title: Python in finance 2013 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: Python in Astronomy + year: 2018 + link: https://openastronomy.org/pyastro/2018/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSeMA_t_fD86AJ0v2dI5iRgsQOoIW7ZavsnRd6JTi_LTHlrEeQ/closedform + cfp: '2017-10-16 23:59:00' + place: New York, USA + start: 2018-04-30 + end: 2018-05-04 + sub: DATA + location: + - title: Python in Astronomy 2018 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: Python in Astronomy + year: 2017 + link: https://openastronomy.org/pyastro/2017/ + cfp: '2016-12-09 23:59:00' + place: Leiden, Netherlands + start: 2017-05-08 + end: 2017-05-12 + sub: DATA + location: + - title: Python in Astronomy 2017 + latitude: 52.1594747 + longitude: 4.4908843 + +- conference: Python in Astronomy + year: 2016 + link: https://web.archive.org/web/20160905071450/http://openastronomy.org/pyastro/2016/ + cfp: '2015-12-06 23:59:00' + place: Seattle, USA + start: 2016-03-21 + end: 2016-03-25 + sub: DATA + location: + - title: Python in Astronomy 2016 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: Python in Astronomy + year: 2015 + link: https://web.archive.org/web/20160905071445/http://openastronomy.org/pyastro/2015/ + cfp: '2014-12-10 23:59:00' + place: Leiden, Netherlands + start: 2015-04-20 + end: 2015-04-24 + sub: DATA + location: + - title: Python in Astronomy 2015 + latitude: 52.1594747 + longitude: 4.4908843 + +- conference: Python Brasil + alt_name: PythonBrasil[14] + year: 2018 + link: https://web.archive.org/web/20180816032212/https://2018.pythonbrasil.org.br/ + cfp: '2018-10-14 23:59:00' + place: Natal, Brazil + start: 2018-10-17 + end: 2018-10-22 + sub: PY + location: + - title: Python Brasil 2018 + latitude: -5.7944777 + longitude: -35.2119324 + +- conference: Python Brasil + alt_name: PythonBrasil[13] + year: 2017 + link: https://web.archive.org/web/20170929071852/http://2017.pythonbrasil.org.br/ + cfp: '2017-06-25 23:59:00' + place: Belo Horizonte, Brazil + start: 2017-10-06 + end: 2017-10-11 + sub: PY + location: + - title: Python Brasil 2017 + latitude: -19.9227318 + longitude: -43.9450948 + +- conference: Python Brasil + alt_name: PythonBrasil[12] + year: 2016 + link: https://web.archive.org/web/20161016045439/http://2016.pythonbrasil.org.br/ + cfp: '2016-08-31 23:59:00' + place: Florianópolis, Brazil + start: 2016-10-13 + end: 2016-10-18 + sub: PY + location: + - title: Python Brasil 2016 + latitude: -27.5973002 + longitude: -48.5496098 + +- conference: Python Brasil + alt_name: PythonBrasil[11] + year: 2015 + link: https://web.archive.org/web/20150614065213/http://pythonbrasil.github.io/pythonbrasil11-site/ + cfp: '2015-09-01 23:59:00' + place: Sao Jose dos Campos, Brazil + start: 2015-10-13 + end: 2015-10-17 + sub: PY + location: + - title: Python Brasil 2015 + latitude: -23.1867782 + longitude: -45.8854538 + +- conference: Python Brasil + alt_name: PythonBrasil[10] + year: 2014 + link: https://web.archive.org/web/20141207142807/http://2014.pythonbrasil.org.br/ + cfp: '2014-08-10 23:59:00' + cfp_ext: '2014-08-15 23:59:00' + place: Porto de Galinhas, Brazil + extra_places: + - Recife, Brazil + start: 2014-11-04 + end: 2014-11-09 + sub: PY + location: + - title: Python Brasil 2014 + latitude: -8.5046818 + longitude: -35.0049962 + - title: Python Brasil 2014 + latitude: -8.05389 + longitude: -34.88111 + +- conference: Python Brasil + alt_name: PythonBrasil[9] + year: 2013 + link: https://web.archive.org/web/20130530100705/http://2013.pythonbrasil.org.br/ + cfp: '2013-07-31 23:59:00' + place: Brasilia, Brazil + start: 2013-09-30 + end: 2013-10-06 + sub: PY + note: The conference was held in conjunction with Plone Conference + location: + - title: Python Brasil 2013 + latitude: -10.3333333 + longitude: -53.2 + +- conference: Python Brasil + alt_name: PythonBrasil[8] + year: 2012 + link: https://web.archive.org/web/20121117085723/http://2012.pythonbrasil.org.br/ + cfp: '2012-09-30 23:59:00' + place: Rio de Janeiro, Brazil + start: 2012-11-21 + end: 2012-11-24 + sub: PY + location: + - title: Python Brasil 2012 + latitude: -22.9110137 + longitude: -43.2093727 + +- conference: Python Brasil + alt_name: PythonBrasil[7] + year: 2011 + link: https://web.archive.org/web/20120827060031/http://2011.pythonbrasil.org.br/ + cfp: '2011-08-19 23:59:00' + place: Sao Paulo, Brazil + start: 2011-09-29 + end: 2011-10-01 + sub: PY + location: + - title: Python Brasil 2011 + latitude: -23.5506507 + longitude: -46.6333824 + +- conference: Python Brasil + alt_name: PythonBrasil[6] + year: 2010 + link: https://web.archive.org/web/20100713080631/http://www.pythonbrasil.org.br/2010 + cfp: '2010-08-08 23:59:00' + place: Curitiba, Brazil + start: 2010-10-21 + end: 2010-10-23 + sub: PY + location: + - title: Python Brasil 2010 + latitude: -25.4295963 + longitude: -49.2712724 + +- conference: Python Brasil + alt_name: PythonBrasil[5] + year: 2009 + link: https://web.archive.org/web/20090911141327/http://www.pythonbrasil.org.br/2009 + cfp: '2009-08-03 23:59:00' + place: Caxias do Sul, Brazil + start: 2009-09-10 + end: 2009-09-12 + sub: PY + location: + - title: Python Brasil 2009 + latitude: -29.1685045 + longitude: -51.1796385 + +- conference: Python Brasil + alt_name: PythonBrasil[4] + year: 2008 + link: https://web.archive.org/web/20100407073701/https://pythonbrasil.org.br/2008 + cfp: '2008-07-27 23:59:00' + place: Rio de Janeiro, Brazil + start: 2008-09-18 + end: 2008-09-20 + sub: PY + location: + - title: Python Brasil 2008 + latitude: -22.9110137 + longitude: -43.2093727 + +- conference: Python Brasil + alt_name: PythonBrasil[3] + year: 2007 + link: https://web.archive.org/web/20100124021234/http://www.pythonbrasil.org.br/2007 + cfp: '2007-07-27 23:59:00' + place: Joinville, Brazil + start: 2007-08-30 + end: 2007-09-01 + sub: PY + location: + - title: Python Brasil 2007 + latitude: -26.3044898 + longitude: -48.8486726 + +- conference: Python Brasil + alt_name: PythonBrasil[2] + year: 2006 + link: https://web.archive.org/web/20130227195656/http://old.pythonbrasil.org.br/2006 + cfp: '2006-05-05 23:59:00' + place: Brasilia, Brazil + start: 2006-06-01 + end: 2006-06-02 + sub: PY + location: + - title: Python Brasil 2006 + latitude: -10.3333333 + longitude: -53.2 + +- conference: Python Brasil + alt_name: PythonBrasil[1] + year: 2005 + link: https://web.archive.org/web/20130227195656/http://old.pythonbrasil.org.br/2005 + cfp: '2005-03-03 23:59:00' + place: Campinas, Brazil + start: 2005-04-28 + end: 2005-04-29 + sub: PY + location: + - title: Python Brasil 2005 + latitude: -22.9056391 + longitude: -47.059564 + +- conference: PyTexas + year: 2017 + link: https://web.archive.org/web/20170215012500/https://www.pytexas.org/2017/ + cfp: '2017-10-04 23:59:00' + place: Austin, USA + start: 2017-11-18 + end: 2017-11-19 + sub: PY + location: + - title: PyTexas 2017 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyTexas + year: 2015 + link: https://web.archive.org/web/20151126002517/https://www.pytexas.org/2015/ + cfp: '2015-07-19 23:59:00' + place: College Station, USA + start: 2015-09-25 + end: 2015-09-27 + sub: PY + location: + - title: PyTexas 2015 + latitude: 30.6183939 + longitude: -96.3455991 + +- conference: PyTexas + year: 2014 + link: https://web.archive.org/web/20140911084119/https://www.pytexas.org/2014/ + cfp: '2014-08-22 23:59:00' + place: College Station, USA + start: 2014-10-03 + end: 2014-10-05 + sub: PY + location: + - title: PyTexas 2014 + latitude: 30.6183939 + longitude: -96.3455991 + +- conference: PyTennessee + year: 2018 + link: https://web.archive.org/web/20180324221914/https://www.pytennessee.org + cfp: '2017-11-01 23:59:00' + place: Nashville, USA + start: 2018-02-10 + end: 2018-02-12 + sub: PY + location: + - title: PyTennessee 2018 + latitude: 36.1622767 + longitude: -86.7742984 + +- conference: PyTennessee + year: 2017 + link: https://web.archive.org/web/20170609204820/http://www.pytennessee.org/ + cfp: '2017-11-15 23:59:00' + place: Nashville, USA + start: 2017-02-04 + end: 2017-02-05 + sub: PY + location: + - title: PyTennessee 2017 + latitude: 36.1622767 + longitude: -86.7742984 + +- conference: PyTennessee + year: 2015 + link: https://web.archive.org/web/20141230143801/https://www.pytennessee.org/ + cfp_link: https://pytennessee.tumblr.com/post/98889311773/cfp-opens-today-and-more-tickets-are-available + cfp: '2014-11-15 23:59:00' + place: Nashville, USA + start: 2015-02-06 + end: 2015-02-08 + sub: PY + location: + - title: PyTennessee 2015 + latitude: 36.1622767 + longitude: -86.7742984 + +- conference: PyTennessee + year: 2014 + link: https://web.archive.org/web/20141230143801/https://www.pytennessee.org/ + cfp_link: https://pytennessee.tumblr.com/post/62716977420/call-for-proposals-october-1st + cfp: '2013-11-01 23:59:00' + place: Nashville, USA + start: 2014-02-22 + end: 2014-02-23 + sub: PY + location: + - title: PyTennessee 2014 + latitude: 36.1622767 + longitude: -86.7742984 + +- conference: PySangamam + year: 2018 + link: https://web.archive.org/web/20181120212752/https://pysangamam.org/ + cfp: '2018-07-01 23:59:00' + place: Tamil Nadu, India + start: 2018-09-07 + end: 2018-09-08 + sub: PY + location: + - title: PySangamam 2018 + latitude: 10.9094334 + longitude: 78.3665347 + +- conference: PyPOA + year: 2014 + link: https://web.archive.org/web/20140531064837/http://pypoa.org/ + cfp: None + place: Porto Alegre, Brasil + start: 2014-06-07 + end: 2014-06-07 + sub: PY + location: + - title: PyPOA 2014 + latitude: -30.0324999 + longitude: -51.2303767 + +- conference: PyParis + year: 2018 + link: https://web.archive.org/web/20181107132342/http://www.pyparis.org/ + cfp: '2018-09-30 23:59:00' + cfp_ext: '2018-10-07' + place: Paris, France + start: 2018-11-14 + end: 2018-11-15 + sub: PY + location: + - title: PyParis 2018 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyParis + year: 2017 + link: https://web.archive.org/web/20170610194931/http://www.pyparis.org/ + cfp: '2017-04-17 23:59:00' + place: Paris, France + start: 2017-06-12 + end: 2017-06-13 + sub: PY + location: + - title: PyParis 2017 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyOhio + year: 2017 + link: https://web.archive.org/web/20180129225635/http://www.pyohio.org/2017/ + cfp: '2017-05-25 23:59:00' + cfp_ext: https://www.pyohio.org/2017/call-for-proposals/ + place: Columbus, USA + start: 2017-07-29 + end: 2017-07-30 + sub: PY + location: + - title: PyOhio 2017 + latitude: 39.9622601 + longitude: -83.0007065 + +- conference: PyOhio + year: 2016 + link: https://web.archive.org/web/20160727174037/http://www.pyohio.org/ + cfp_link: https://web.archive.org/web/20160719173616/http://pyohio.org/call-for-proposals/ + cfp: '2016-06-04 23:59:00' + place: Columbus, USA + start: 2016-07-30 + end: 2016-07-31 + sub: PY + location: + - title: PyOhio 2016 + latitude: 39.9622601 + longitude: -83.0007065 + +- conference: PyOhio + year: 2015 + link: https://web.archive.org/web/20150623064947/http://www.pyohio.org/ + cfp_link: https://web.archive.org/web/20150713224810/http://www.pyohio.org/call-for-proposals/ + cfp: '2015-06-01 23:59:00' + place: Columbus, OH + start: 2015-08-01 + end: 2015-08-02 + sub: PY + location: + - title: PyOhio 2015 + latitude: 39.9622601 + longitude: -83.0007065 + +- conference: PyOhio + year: 2014 + link: https://web.archive.org/web/20140428063228/http://www.pyohio.org/ + cfp_link: https://web.archive.org/web/20140703230003/http://www.pyohio.org/call-for-proposals/ + cfp: '2014-05-15 23:59:00' + place: Columbus, USA + start: 2014-07-26 + end: 2014-07-27 + sub: PY + location: + - title: PyOhio 2014 + latitude: 39.9622601 + longitude: -83.0007065 + +- conference: PyOhio + year: 2013 + link: https://web.archive.org/web/20130603222509/http://pyohio.org/ + cfp_link: https://web.archive.org/web/20130507054648/http://pyohio.org/call-for-proposals/ + cfp: '2013-06-01 23:59:00' + place: Ohio Union, USA + start: 2013-07-27 + end: 2013-07-28 + sub: PY + location: + - title: PyOhio 2013 + latitude: 39.997660499999995 + longitude: -83.00853211561488 + +- conference: PyOhio + year: 2012 + link: https://web.archive.org/web/20120603222509/http://pyohio.org/ + cfp_link: https://web.archive.org/web/20120507054648/http://pyohio.org/call-for-proposals/ + cfp: '2012-06-15 23:59:00' + place: Ohio Union, USA + start: 2012-07-28 + end: 2012-07-29 + sub: PY + location: + - title: PyOhio 2012 + latitude: 39.997660499999995 + longitude: -83.00853211561488 + +- conference: PyOhio + year: 2011 + link: https://web.archive.org/web/20110603222509/http://pyohio.org/ + cfp_link: https://web.archive.org/web/20110507054648/http://pyohio.org/call-for-proposals/ + cfp: '2011-06-03 23:59:00' + place: Ohio Union, USA + start: 2011-07-30 + end: 2011-07-31 + sub: PY + location: + - title: PyOhio 2011 + latitude: 39.997660499999995 + longitude: -83.00853211561488 + +- conference: PyOhio + year: 2010 + link: https://web.archive.org/web/20100603222509/http://pyohio.org/ + cfp_link: https://web.archive.org/web/20091215100607/http://wiki.python.org/moin/PyOhio/CallForProposals + cfp: '2010-05-10 23:59:00' + place: Ohio Union, USA + start: 2010-07-31 + end: 2010-08-01 + sub: PY + location: + - title: PyOhio 2010 + latitude: 39.997660499999995 + longitude: -83.00853211561488 + +- conference: PyOhio + year: 2009 + link: https://web.archive.org/web/20090603222509/http://pyohio.org/ + cfp: '2009-05-15 23:59:00' + place: Ohio Union, USA + start: 2009-07-25 + end: 2009-07-26 + sub: PY + location: + - title: PyOhio 2009 + latitude: 39.997660499999995 + longitude: -83.00853211561488 + +- conference: PyOhio + year: 2008 + link: https://web.archive.org/web/20080603222509/http://pyohio.org/ + cfp_link: https://web.archive.org/web/20110812023502/http://wiki.python.org/moin/PyOhio2008/CallForProposals + cfp: '2008-06-15 23:59:00' + place: Ohio Union, USA + start: 2008-07-27 + end: 2008-07-28 + sub: PY + location: + - title: PyOhio 2008 + latitude: 39.997660499999995 + longitude: -83.00853211561488 + +- conference: PyMunich + alt_name: PyCon Germany + year: 2016 + link: https://web.archive.org/web/20161015212639/http://www.pymunich.com/ + cfp: '2016-09-12 00:00:00' + timezone: Europe/Berlin + place: Munich, Germany + start: 2016-10-28 + end: 2016-10-30 + sub: PY + location: + - title: PyCon Germany 2016 + latitude: 48.1371079 + longitude: 11.5753822 + +- conference: PyLondinium + year: 2018 + link: https://web.archive.org/web/20180503095204/https://pylondinium.org/ + cfp_link: https://web.archive.org/web/20180503095204/https://www.papercall.io/pylondinium + cfp: '2018-04-15 23:59:00' + place: London, UK + start: 2018-06-08 + end: 2018-06-10 + sub: PY + location: + - title: PyLondinium 2018 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyHPC + year: 2018 + link: https://web.archive.org/web/20201023081255/https://www.dlr.de/sc/desktopdefault.aspx/tabid-12954/22625_read-52397/ + cfp: '2018-09-09 23:59:00' + place: Dallas, USA + start: 2018-11-12 + end: 2018-11-12 + sub: SCIPY + location: + - title: PyHPC 2018 + latitude: 32.7762719 + longitude: -96.7968559 + +- conference: PyHPC + year: 2017 + link: https://web.archive.org/web/20171116191554/http://www.dlr.de/sc/desktopdefault.aspx/tabid-11992/21071_read-48990 + cfp: '2017-09-01 23:59:00' + place: Denver, USA + start: 2017-11-12 + end: 2017-11-13 + sub: SCIPY + location: + - title: PyHPC 2017 + latitude: 39.7392364 + longitude: -104.984862 + +- conference: PyHPC + year: 2016 + link: https://web.archive.org/web/20161109035636/http://www.dlr.de/sc/desktopdefault.aspx/tabid-11229/19729_read-46082/ + cfp: '2014-09-05 23:59:00' + cfp_ext: '2014-09-12 23:59:00' + place: Salt Lake City, USA + start: 2016-11-14 + end: 2016-11-14 + sub: SCIPY + location: + - title: PyHPC 2016 + latitude: 40.7596198 + longitude: -111.886797 + +- conference: PyHPC + year: 2015 + link: https://web.archive.org/web/20150829112426/http://www.dlr.de/sc/desktopdefault.aspx/tabid-10388/17849_read-42322 + cfp: '2015-09-04 23:59:00' + place: Austin, USA + start: 2015-11-15 + end: 2015-11-15 + sub: SCIPY + location: + - title: PyHPC 2015 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: PyHPC + year: 2014 + link: https://web.archive.org/web/20141117032857/http://www.dlr.de/sc/desktopdefault.aspx/tabid-9506/16384_read-40102 + cfp: '2014-09-05 23:59:00' + cfp_ext: '2014-09-12 23:59:00' + place: New Orleans, USA + start: 2014-11-17 + end: 2014-11-18 + sub: SCIPY + location: + - title: PyHPC 2014 + latitude: 29.9759983 + longitude: -90.0782127 + +- conference: PyHPC + year: 2013 + link: https://web.archive.org/web/20131118193245/http://www.dlr.de/sc/desktopdefault.aspx/tabid-8685/14943_read-37157/ + cfp: '2013-09-20 23:59:00' + place: Denver, USA + start: 2013-11-18 + end: 2013-11-18 + sub: SCIPY + location: + - title: PyHPC 2013 + latitude: 39.7392364 + longitude: -104.984862 + +- conference: PyHPC + year: 2012 + link: https://web.archive.org/web/20121115022259/http://www.dlr.de/sc/desktopdefault.aspx/tabid-8028/13765_read-34936/ + cfp: '2012-09-14 23:59:00' + place: Salt Lake City, USA + start: 2012-11-16 + end: 2012-11-16 + sub: SCIPY + location: + - title: PyHPC 2012 + latitude: 40.7596198 + longitude: -111.886797 + +- conference: PyHPC + year: 2011 + link: https://web.archive.org/web/20130923035222/http://www.dlr.de/sc/desktopdefault.aspx/tabid-7632/12996_read-32676/ + cfp: '2011-09-19 23:59:00' + place: Seattle, USA + start: 2011-11-18 + end: 2011-11-18 + sub: SCIPY + location: + - title: PyHPC 2011 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: PyHEP + year: 2018 + link: https://web.archive.org/web/20180818114457/https://indico.cern.ch/event/694818/ + cfp: None + place: Sofia, Bulgaria + start: 2018-07-07 + end: 2018-07-08 + sub: SCIPY + location: + - title: PyHEP 2018 + latitude: 42.6977028 + longitude: 23.3217359 + +- conference: PyGrunn + year: 2017 + link: https://web.archive.org/web/20170608055024/http://www.pygrunn.org/ + cfp: '2017-02-01 23:59:00' + place: Groningen, Netherlands + start: 2017-05-19 + end: 2017-05-19 + sub: PY + location: + - title: PyGrunn 2017 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGrunn + year: 2016 + link: https://web.archive.org/web/20160608055024/http://www.pygrunn.org/ + cfp: '2016-03-15 23:59:00' + place: Groningen, Netherlands + start: 2016-05-13 + end: 2016-05-13 + sub: PY + location: + - title: PyGrunn 2016 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGrunn + year: 2015 + link: https://web.archive.org/web/20150608055024/http://www.pygrunn.org/ + cfp: '2015-02-01 23:59:00' + place: Groningen, Netherlands + start: 2015-05-22 + end: 2015-05-22 + sub: PY + location: + - title: PyGrunn 2015 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGrunn + year: 2014 + link: https://web.archive.org/web/20141221190438/http://www.pygrunn.org/ + cfp: '2014-04-01 23:59:00' + place: Groningen, Netherlands + start: 2014-05-09 + end: 2014-05-10 + sub: PY + location: + - title: PyGrunn 2014 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGrunn + year: 2013 + link: https://web.archive.org/web/20130814185329/http://www.pygrunn.org/ + cfp: '2013-04-15 12:00:00' + timezone: Europe/Amsterdam + place: Groningen, Netherlands + start: 2013-05-10 + end: 2013-05-10 + sub: PY + location: + - title: PyGrunn 2013 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGrunn + year: 2012 + link: https://web.archive.org/web/20120608055024/http://www.pygrunn.org/ + cfp: None + place: Groningen, Netherlands + start: 2012-05-11 + end: 2012-05-11 + sub: PY + location: + - title: PyGrunn 2012 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGrunn + year: 2011 + link: https://web.archive.org/web/20110608055024/http://www.pygrunn.org/ + cfp_link: https://pygrunn-paylogic.blogspot.com/2011/04/call-for-speakers.html + cfp: None + place: Groningen, Netherlands + start: 2011-05-20 + end: 2011-05-20 + sub: PY + location: + - title: PyGrunn 2011 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGrunn + year: 2010 + link: https://web.archive.org/web/20100608055024/http://www.pygrunn.org/ + cfp: None + place: Groningen, Netherlands + start: 2010-05-09 + end: 2010-05-09 + sub: PY + location: + - title: PyGrunn 2010 + latitude: 53.2190652 + longitude: 6.5680077 + +- conference: PyGotham TV + year: 2018 + link: https://web.archive.org/web/20181002121351/https://2018.pygotham.org/ + cfp_link: https://web.archive.org/web/20181003091856/https://www.papercall.io/pygotham-2018 + cfp: '2018-05-21 23:59:00' + place: New York, USA + start: 2018-10-05 + end: 2018-10-06 + sub: PY + location: + - title: PyGotham TV 2018 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyGotham TV + year: 2017 + link: https://web.archive.org/web/20171009205218/https://2017.pygotham.org + cfp_link: https://web.archive.org/web/20170718060725/https://www.papercall.io/pygotham-2017 + cfp: '2017-07-18 16:00:00' + place: New York, USA + start: 2017-10-06 + end: 2017-10-08 + sub: PY + location: + - title: PyGotham TV 2017 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyGotham TV + year: 2016 + link: https://web.archive.org/web/20160910192756/https://2016.pygotham.org/ + cfp_link: https://web.archive.org/web/20180922124549/https://2016.pygotham.org/talks/call-for-proposals/ + cfp: '2016-05-16 00:00:00' + place: New York, USA + start: 2016-07-16 + end: 2016-07-17 + sub: PY + location: + - title: PyGotham TV 2016 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyGotham TV + year: 2015 + link: https://web.archive.org/web/20150817161836/http://pygotham.org/2015/ + cfp_link: https://web.archive.org/web/20150817162010/https://pygotham.org/2015/talks/call-for-proposals/ + cfp: '2015-06-21 00:00:00' + place: New York, USA + start: 2015-08-15 + end: 2015-08-16 + sub: PY + location: + - title: PyGotham TV 2015 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyGotham TV + year: 2014 + link: https://web.archive.org/web/20140814202802/http://pygotham.org/ + cfp_link: https://web.archive.org/web/20150206035307/http://pygotham.org/talks/call-for-proposals/ + cfp: '2014-06-27 00:00:00' + place: New York, USA + start: 2014-08-16 + end: 2014-08-17 + sub: PY + location: + - title: PyGotham TV 2014 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyGotham TV + alt_name: PyGotham II + year: 2012 + link: https://web.archive.org/web/20120620005159/https://pygotham.org// + cfp: '2012-03-31 23:59:00' + place: New York, USA + start: 2012-06-08 + end: 2012-06-09 + sub: PY + location: + - title: PyGotham TV 2012 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyGotham TV + year: 2011 + link: https://web.archive.org/web/20111024041916/http://pygotham.org/ + cfp: '2011-05-15 23:59:00' + place: New York, USA + start: 2011-09-16 + end: 2011-09-17 + sub: PY + location: + - title: PyGotham TV 2011 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyDelhi + year: 2016 + link: https://web.archive.org/web/20160223145838/http://conference.pydelhi.org/ + cfp: '2016-02-08 23:59:00' + place: New Delhi, India + start: 2016-03-05 + end: 2016-03-05 + sub: PY + location: + - title: PyDelhi 2016 + latitude: 28.6138954 + longitude: 77.2090057 + +- conference: PyDays Vienna + year: 2018 + link: https://web.archive.org/web/20180430140857/https://www.pydays.at/ + cfp_link: https://web.archive.org/web/20201108001255/https://www.pydays.at/cfp/ + cfp: '2018-03-26 23:59:00' + place: Vienna, Austria + start: 2018-05-04 + end: 2018-05-05 + sub: DAY,PY + location: + - title: PyDays Vienna 2018 + latitude: 48.2391664 + longitude: 16.3774409 + +- conference: PyDays Vienna + year: 2017 + link: https://web.archive.org/web/20170508050023/http://pydays.at/ + cfp_link: https://web.archive.org/web/20170324235437/https://pydays.at/_static/cfp.html + cfp: '2017-03-20 23:59:00' + place: Vienna, Austria + start: 2017-05-05 + end: 2017-05-06 + sub: DAY,PY + location: + - title: PyDays Vienna 2017 + latitude: 48.2391664 + longitude: 16.3774409 + +- conference: PyDay Tenerife + alt_name: PyDay TF + year: 2018 + link: https://pythoncanarias.es/events/pydaytf18/ + cfp_link: https://pythoncanarias.es/events/pydaytf18/cfp/ + cfp: None + place: Tenerife, Spain + start: 2018-11-17 + end: 2018-11-17 + sub: PY + location: + - title: PyDay TF 2018 + latitude: 28.2935785 + longitude: -16.621447121144122 + +- conference: PyDay Quito + year: 2016 + link: https://web.archive.org/web/20160302102219/http://pythonquito.tk/ + cfp: '2016-02-28 23:59:00' + place: Quito, Ecuador + start: 2016-03-08 + end: 2016-03-09 + sub: DAY + location: + - title: PyDay Quito 2016 + latitude: -0.2201641 + longitude: -78.5123274 + +- conference: PyDay Piura + year: 2016 + link: https://web.archive.org/web/20160806062921/http://pythonpiura.org/primer-pyday-en-piura/ + cfp: None + place: Piura, Peru + start: 2016-08-20 + end: 2016-08-20 + sub: DAY + location: + - title: PyDay Piura 2016 + latitude: -5.0 + longitude: -80.333333 + +- conference: PyDay Mexico + year: 2018 + link: https://pythondaymx.github.io/ + cfp_link: https://web.archive.org/web/20180717155533/https://www.papercall.io/pydaymx2018 + cfp: '2018-09-01 23:09:00' + place: Guadalajara, Mexico + start: 2018-11-30 + end: 2018-12-01 + sub: DAY + location: + - title: PyDay Mexico 2018 + latitude: 20.6720375 + longitude: -103.338396 + +- conference: PyDay Mexico + year: 2017 + link: https://web.archive.org/web/20170605152219/http://pythonday.mx/ + cfp_link: https://www.papercall.io/pythondaymx + cfp: '2017-05-07 12:00:00' + place: Mexico City, Mexico + start: 2017-06-10 + end: 2017-06-10 + sub: DAY + location: + - title: PyDay Mexico 2017 + latitude: 19.4326296 + longitude: -99.1331785 + +- conference: PyDay Loja + year: 2016 + link: https://web.archive.org/web/20160418094309/http://pythonecuador.org/ + cfp: None + place: Guayaquil, Ecuador + start: 2016-04-01 + end: 2016-04-01 + sub: DAY + location: + - title: PyDay Loja 2016 + latitude: -2.1900563 + longitude: -79.8868741 + +- conference: PyDay Formosa + year: 2015 + link: https://web.archive.org/web/20150206085357/http://pyday.forsol.org.ar/ + cfp: '2015-01-07 23:59:00' + place: Formosa, Argentina + start: 2015-02-14 + end: 2015-02-14 + sub: DAY + location: + - title: PyDay Formosa 2015 + latitude: -24.5955306 + longitude: -60.4289718 + +- conference: PyDay Cali + year: 2018 + link: https://web.archive.org/web/20231204095020/https://www.calidev.co/eventos/pyday/cali-2018/ + cfp_link: https://www.papercall.io/pyday-cali + cfp: '2018-09-30 08:09:10' + place: Cali, Colombia + start: 2018-10-27 + end: 2018-10-27 + sub: DAY + location: + - title: PyDay Cali 2018 + latitude: 3.4520339 + longitude: -76.5329352 + +- conference: PyDay Asunción + year: 2015 + link: https://web.archive.org/web/20150326072907/http://pyday.pythonpy.org/ + cfp: None + place: Asunción, Paraguay + start: 2015-03-28 + end: 2015-03-28 + sub: DAY + location: + - title: PyDay Asunción 2015 + latitude: -25.2800459 + longitude: -57.6343814 + +- conference: PyData Washington DC + year: 2018 + link: https://web.archive.org/web/20181007055823/http://pydata.org/dc2018/cfp + cfp: '2018-08-11 23:59:00' + timezone: America/New_York + place: Washington DC, USA + start: 2018-11-16 + end: 2018-11-18 + sub: DATA + location: + - title: PyData Washington DC 2018 + latitude: 38.8950368 + longitude: -77.0365427 + +- conference: PyData Washington DC + year: 2016 + link: https://web.archive.org/web/20161007055823/http://pydata.org/dc2016/ + cfp: '2016-08-01 23:59:00' + timezone: America/New_York + place: Washington DC, USA + start: 2016-10-07 + end: 2016-10-09 + sub: DATA + location: + - title: PyData Washington DC 2016 + latitude: 38.8950368 + longitude: -77.0365427 + +- conference: PyData Warsaw + year: 2018 + link: https://web.archive.org/web/20210923203834/https://pydata.org/warsaw2018/ + cfp: '2018-07-31 23:59:00' + place: Warsaw, Poland + start: 2018-11-18 + end: 2018-11-21 + sub: DATA + location: + - title: PyData Warsaw 2018 + latitude: 52.2319581 + longitude: 21.0067249 + +- conference: PyData Warsaw + year: 2017 + link: https://web.archive.org/web/20170312132232/http://pydata.org/warsaw2017/ + cfp_link: https://web.archive.org/web/20170312131955/http://pydata.org/warsaw2017/cfp/ + cfp: '2017-07-31 23:59:00' + place: Warsaw, Poland + start: 2017-10-19 + end: 2017-10-20 + sub: DATA + location: + - title: PyData Warsaw 2017 + latitude: 52.2319581 + longitude: 21.0067249 + +- conference: PyData Silicon Valley + year: 2014 + link: https://web.archive.org/web/20140502023505/http://pydata.org/sv2014/ + cfp: '2014-03-31 23:59:00' + cfp_ext: '2014-04-06 23:59:00' + place: Menlo Park, USA + start: 2014-05-02 + end: 2014-05-04 + sub: DATA + location: + - title: PyData Silicon Valley 2014 + latitude: 37.4519671 + longitude: -122.177992 + +- conference: PyData Silicon Valley + year: 2013 + link: https://web.archive.org/web/20130304203036/http://sv2013.pydata.org/ + cfp: '2013-01-15 23:59:00' + place: Santa Clara, USA + start: 2013-03-18 + end: 2013-03-20 + sub: DATA + location: + - title: PyData Silicon Valley 2013 + latitude: 37.2333253 + longitude: -121.6846349 + +- conference: PyData Seattle + year: 2017 + link: https://web.archive.org/web/20170606194443/http://pydata.org/seattle2017/ + cfp_link: https://web.archive.org/web/20170707164717/https://pydata.org/seattle2017/cfp/ + cfp: '2017-05-01 23:59:00' + place: Redmond, USA + start: 2017-07-05 + end: 2017-07-07 + sub: DATA + location: + - title: PyData Seattle 2017 + latitude: 47.6694141 + longitude: -122.1238767 + +- conference: PyData Seattle + year: 2015 + link: https://web.archive.org/web/20151113023843/http://pydata.org/Seattle2015/ + cfp_link: https://pydata.org/seattle2015/cfp/ + cfp: '2015-05-11 23:59:00' + place: Seattle, USA + start: 2015-07-24 + end: 2015-07-26 + sub: DATA + location: + - title: PyData Seattle 2015 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: PyData San Francisco + year: 2016 + link: https://web.archive.org/web/20160813002829/http://pydata.org/sfo2016/ + cfp: '2016-07-18 23:59:59' + place: San Francisco, USA + start: 2016-08-12 + end: 2016-08-14 + sub: DATA + location: + - title: PyData San Francisco 2016 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyData Sam Luis + year: 2017 + link: https://web.archive.org/web/20181105044946/https://pydata.org/sanluis2017/ + cfp: '2017-09-22 23:59:00' + place: San Luis, Argentina + start: 2017-11-16 + end: 2017-11-18 + sub: DATA + location: + - title: PyData Sam Luis 2017 + latitude: -33.2762202 + longitude: -65.9515546 + +- conference: PyData Paris + year: 2017 + link: https://web.archive.org/web/20170405012143/https://pyparis.org/ + cfp: '2017-04-17 23:59:00' + place: Paris, France + start: 2016-06-12 + end: 2016-06-13 + sub: DATA + location: + - title: PyData Paris 2017 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyData Paris + year: 2016 + link: https://web.archive.org/web/20160602152545/http://pydata.org/paris2016/ + cfp: '2016-05-15 23:59:00' + cfp_ext: '2016-05-20' + place: Paris, France + start: 2016-06-14 + end: 2016-06-15 + sub: DATA + location: + - title: PyData Paris 2016 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyData Paris + year: 2015 + link: https://web.archive.org/web/20150405053552/http://pydataparis.joinux.org/ + cfp: '2015-03-03 23:59:00' + place: Paris, France + start: 2015-04-03 + end: 2015-04-03 + sub: DATA + location: + - title: PyData Paris 2015 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyData NYC + year: 2018 + link: https://web.archive.org/web/20180924054748/https://pydata.org/nyc2018/ + cfp: '2018-08-15 23:59:00' + place: New York, USA + start: 2018-10-17 + end: 2018-10-19 + sub: DATA + location: + - title: PyData NYC 2018 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyData NYC + year: 2017 + link: https://web.archive.org/web/20170817062616/https://pydata.org/nyc2017/ + cfp: '2017-09-22 23:59:00' + place: New York, USA + start: 2017-11-27 + end: 2017-11-30 + sub: DATA + location: + - title: PyData NYC 2017 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyData NYC + year: 2015 + link: https://web.archive.org/web/20160613032308/http://pydata.org/nyc2015/ + cfp: '2015-09-15 23:59:00' + place: New York, USA + start: 2015-11-09 + end: 2015-11-11 + sub: DATA + location: + - title: PyData NYC 2015 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyData NYC + year: 2013 + link: https://web.archive.org/web/20131111203506/http://pydata.org/nyc2013/ + cfp: '2013-09-16 23:59:00' + place: New York, USA + start: 2013-11-08 + end: 2013-11-11 + sub: DATA + location: + - title: PyData NYC 2013 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyData NYC + year: 2012 + link: https://web.archive.org/web/20121015200957/http://nyc2012.pydata.org/ + cfp: None + timezone: America/New_York + place: New York, USA + start: 2012-10-26 + end: 2012-11-28 + sponsor: https://web.archive.org/web/20210821045751/https://pydata.org/nyc2012/sponsors/becoming/ + sub: DATA + location: + - title: PyData NYC 2012 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: PyData Madrid + year: 2016 + link: https://web.archive.org/web/20160412080402/http://pydata.org/madrid2016/ + cfp: '2016-02-21 23:59:00' + place: Madrid, Spain + start: 2016-04-08 + end: 2016-04-10 + sub: DATA + location: + - title: PyData Madrid 2016 + latitude: 40.4167047 + longitude: -3.7035825 + +- conference: PyData Los Angeles + year: 2018 + link: https://web.archive.org/web/20180924054904/https://pydata.org/la2018/ + cfp_link: https://web.archive.org/web/20180818024415/https://pydata.org/la2018/cfp/ + cfp: '2018-08-19 23:59:00' + place: Los Angeles, USA + start: 2018-10-21 + end: 2018-10-23 + sub: DATA + location: + - title: PyData Los Angeles 2018 + latitude: 34.0536909 + longitude: -118.242766 + +- conference: PyData London + year: 2018 + link: https://web.archive.org/web/20180506090238/https://pydata.org/london2018/ + cfp_link: https://web.archive.org/web/20180214042529/https://pydata.org/london2018/cfp/ + cfp: '2018-03-02 23:59:00' + place: London, UK + start: 2018-04-26 + end: 2018-04-29 + sub: DATA + location: + - title: PyData London 2018 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyData London + year: 2017 + link: https://web.archive.org/web/20170606204024/http://pydata.org/london2017/ + cfp_link: https://web.archive.org/web/20170226122558/https://pydata.org/london2017/cfp + cfp: '2017-02-24 23:59:00' + timezone: Europe/London + place: London, UK + start: 2017-05-05 + end: 2017-05-07 + sub: DATA + location: + - title: PyData London 2017 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyData London + year: 2016 + link: https://web.archive.org/web/20160515034159/http://pydata.org/london2016/ + cfp: '2016-03-07 23:59:00' + place: London, UK + start: 2016-05-06 + end: 2016-05-08 + sub: DATA + location: + - title: PyData London 2016 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyData London + year: 2015 + link: https://web.archive.org/web/20160222211712/http://pydata.org/london2015/ + cfp: '2015-05-18 23:59:00' + place: London, UK + start: 2015-06-19 + end: 2015-06-21 + sub: DATA + location: + - title: PyData London 2015 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyData London + year: 2014 + link: https://web.archive.org/web/20140214193445/http://pydata.org/ldn2014 + cfp: '2014-01-30 23:59:00' + place: London, UK + start: 2014-02-21 + end: 2014-02-23 + sub: DATA + location: + - title: PyData London 2014 + latitude: 51.5074456 + longitude: -0.1277653 + +- conference: PyData Florence + year: 2017 + link: https://web.archive.org/web/20170405012143/http://pydata.it/ + cfp: '2017-02-12 23:59:00' + place: Florence, Italy + start: 2017-04-07 + end: 2017-04-09 + sub: DATA + location: + - title: PyData Florence 2017 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyData Florence + year: 2016 + link: https://web.archive.org/web/20160405012143/http://pydata.it/ + cfp: '2016-02-09 23:59:00' + place: Florence, Italy + start: 2016-04-15 + end: 2016-04-17 + sub: DATA + location: + - title: PyData Florence 2016 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyData Delhi + year: 2018 + link: https://web.archive.org/web/20180818153520/http://pydata.org/delhi2018/ + cfp_link: https://web.archive.org/web/20180714122043/http://delhi.pydata.org/blog/announcing-pydd18/ + cfp: '2018-06-20 23:59:00' + place: New Delhi, India + start: 2018-08-11 + end: 2018-08-12 + sub: DATA + location: + - title: PyData Delhi 2018 + latitude: 28.6138954 + longitude: 77.2090057 + +- conference: PyData Delhi + year: 2017 + link: https://web.archive.org/web/20210416150353/http://pydata.org/delhi2017/ + cfp: '2017-08-05 23:59:00' + place: New Delhi, India + start: 2017-09-02 + end: 2017-09-03 + sub: DATA + location: + - title: PyData Delhi 2017 + latitude: 28.6138954 + longitude: 77.2090057 + +- conference: PyData Dallas + year: 2015 + link: https://pydata.org/dal2015/ + cfp_link: https://pydata.org/dal2015/cfp/ + cfp: '2015-03-08 23:59:00' + place: Plano, USA + start: 2015-04-24 + end: 2015-04-26 + sub: DATA + location: + - title: PyData Dallas 2015 + latitude: 33.0136764 + longitude: -96.6925096 + +- conference: PyData Cordoba + year: 2018 + link: https://web.archive.org/web/20180924054609/https://pydata.org/cordoba2018/ + cfp: '2018-07-30 23:59:59' + place: Cordoba, Argentina + start: 2018-09-29 + end: 2018-09-30 + sub: DATA + location: + - title: PyData Cordoba 2018 + latitude: -31.4166867 + longitude: -64.1834193 + +- conference: PyData Cologne + year: 2016 + link: https://web.archive.org/web/20161205091341/http://pydata.org/cologne2016/ + cfp: Cancelled + place: Cologne, Germany + start: 2016-11-28 + end: 2016-11-30 + sub: DATA + note: The conference was cancelled due to a fire in the convention center. + location: + - title: PyData Cologne 2016 + latitude: 53.328784 + longitude: 13.072966153528762 + +- conference: PyData Chicago + year: 2016 + link: https://web.archive.org/web/20160828224731/http://pydata.org/chicago2016/ + cfp_link: https://web.archive.org/web/20160505220124/https://pydata.org/chicago2016/cfp/ + cfp: '2016-06-13 23:59:59' + place: Chicago, USA + start: 2016-08-26 + end: 2016-08-28 + sub: DATA + location: + - title: PyData Chicago 2016 + latitude: 41.8755616 + longitude: -87.6244212 + +- conference: PyData Carolinas + year: 2016 + link: https://web.archive.org/web/20160909163256/http://pydata.org/carolinas2016/ + cfp: '2016-07-17 23:59:00' + place: Research Triangle Park, USA + start: 2016-09-14 + end: 2016-09-16 + sub: DATA + location: + - title: PyData Carolinas 2016 + latitude: 35.8923773 + longitude: -78.86588989367681 + +- conference: PyData Boston + year: 2013 + link: https://web.archive.org/web/20130720075327/http://pydata.org/bos2013/ + cfp: '2013-06-03 23:59:00' + place: Cambridge, USA + start: 2013-07-27 + end: 2013-07-28 + sub: DATA + location: + - title: PyData Boston 2013 + latitude: 42.3655767 + longitude: -71.1040018 + +- conference: PyData Berlin + year: 2018 + link: https://web.archive.org/web/20190112064656/https://pydata.org/berlin2018/ + cfp: '2018-03-31 23:59:59' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2018-07-06 + end: 2018-07-08 + sub: DATA + location: + - title: PyData Berlin 2018 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyData Berlin + year: 2017 + link: https://web.archive.org/web/20170623225603/http://pydata.org/berlin2017/ + cfp: '2017-04-23 23:59:59' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2017-06-30 + end: 2017-07-02 + sub: DATA + location: + - title: PyData Berlin 2017 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyData Berlin + year: 2016 + link: https://web.archive.org/web/20160521214556/http://pydata.org/berlin2016/ + cfp: '2016-03-08 23:59:00' + place: Berlin, Germany + start: 2016-05-20 + end: 2016-05-21 + sub: DATA + location: + - title: PyData Berlin 2016 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyData Berlin + year: 2015 + link: https://web.archive.org/web/20150520195754/http://pydata.org/berlin2015/ + cfp: '2015-04-30 23:59:59' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2015-05-29 + end: 2015-05-30 + sub: DATA + location: + - title: PyData Berlin 2015 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyData Berlin + year: 2014 + link: https://web.archive.org/web/20230328013334/https://pydata.org/berlin2014/ + cfp: '2014-05-12 23:59:59' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2014-07-26 + end: 2014-07-28 + sub: DATA + location: + - title: PyData Berlin 2014 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: PyData Barcelona + alt_name: PyData BCN + year: 2017 + link: https://web.archive.org/web/20170313045143/http://pydata.org/barcelona2017/ + cfp: '2017-04-09 23:59:00' + place: Barcelona, Spain + start: 2017-05-19 + end: 2017-05-22 + sub: DATA + location: + - title: PyData Barcelona 2017 + latitude: 41.3828939 + longitude: 2.1774322 + +- conference: PyData Amsterdam + year: 2018 + link: https://web.archive.org/web/20210805170103/https://pydata.org/amsterdam2018/ + cfp: '2018-03-04 23:59:00' + place: Amsterdam, Netherlands + start: 2018-05-25 + end: 2018-05-27 + sub: DATA + location: + - title: PyData Amsterdam 2018 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: PyData Amsterdam + year: 2017 + link: https://web.archive.org/web/20170120092836/http://pydata.org/amsterdam2017/ + cfp: '2017-03-05 23:59:00' + place: Amsterdam, Netherlands + start: 2017-04-08 + end: 2017-04-09 + sub: DATA + location: + - title: PyData Amsterdam 2017 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: PyData Amsterdam + year: 2016 + link: https://web.archive.org/web/20160313045857/http://pydata.org/amsterdam2016/ + cfp_link: https://web.archive.org/web/20160316230926/http://pydata.org/amsterdam2016/cfp/ + cfp: '2016-02-14 23:59:00' + place: Amsterdam, Netherlands + start: 2016-03-12 + end: 2016-03-13 + sub: DATA + location: + - title: PyData Amsterdam 2016 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: PyConf Hyderabad + year: 2017 + link: https://web.archive.org/web/20171008124816/http://pyconf.hydpy.org/ + cfp_link: https://web.archive.org/web/20171008124816/https://pyconfhyd.talkfunnel.com/2017/ + cfp: '2017-08-31 23:59:00' + place: Hyderabad, India + start: 2017-10-07 + end: 2017-10-08 + sub: PY + location: + - title: PyConf Hyderabad 2017 + latitude: 17.4454957 + longitude: 78.34854697544472 + +- conference: PyCon Zimbabwe + year: 2018 + link: https://web.archive.org/web/20180825103507/http://zw.pycon.org/ + cfp_link: https://web.archive.org/web/20201029122759/https://www.papercall.io/pyconzim2018 + cfp: '2018-09-19 16:09:00' + timezone: Africa/Harare + place: Harare, Zimbabwe + start: 2018-10-19 + end: 2018-10-20 + sub: PY + location: + - title: PyCon Zimbabwe 2018 + latitude: -17.8567035 + longitude: 31.0601584 + +- conference: PyCon Zimbabwe + year: 2017 + link: https://web.archive.org/web/20170825103507/http://zw.pycon.org/ + cfp: '2017-08-15 23:59:00' + place: Harare, Zimbabwe + start: 2017-08-23 + end: 2017-08-26 + sub: PY + location: + - title: PyCon Zimbabwe 2017 + latitude: -17.8567035 + longitude: 31.0601584 + +- conference: PyCon Web + year: 2018 + link: https://web.archive.org/web/20180817005719/https://pyconweb.com/ + cfp: Cancelled + place: Munich, Germany + start: 2018-06-30 + end: 2018-07-02 + sub: PY + location: + - title: PyCon Web 2018 + latitude: 48.1371079 + longitude: 11.5753822 + +- conference: PyCon Web + year: 2017 + link: https://web.archive.org/web/20170621095045/https://pyconweb.com/ + cfp: '2017-03-15 00:00:00' + place: Munich, Germany + start: 2017-05-27 + end: 2017-05-28 + sub: WEB + location: + - title: PyConWeb 2017 + latitude: 48.1371079 + longitude: 11.5753822 + +- conference: PyCon US + year: 2018 + link: https://web.archive.org/web/20180509145212/https://us.pycon.org/2018/ + cfp: '2018-01-03 23:59:00' + place: Cleveland, USA + start: 2018-05-09 + end: 2018-05-17 + sub: PY + location: + - title: PyCon US 2018 + latitude: 41.4996574 + longitude: -81.6936772 + +- conference: PyCon US + year: 2017 + link: https://web.archive.org/web/20170608061733/https://us.pycon.org/2017/ + cfp: '2017-01-03 23:59:59' + place: Portland, USA + start: 2017-05-17 + end: 2017-05-25 + sub: PY + location: + - title: PyCon US 2017 + latitude: 45.5202471 + longitude: -122.674194 + +- conference: PyCon US + year: 2016 + link: https://web.archive.org/web/20160602041511/https://us.pycon.org/2016/ + cfp: '2015-01-03 23:59:00' + place: Portland, USA + start: 2016-05-28 + end: 2016-06-05 + sub: PY + location: + - title: PyCon US 2016 + latitude: 45.5202471 + longitude: -122.674194 + +- conference: PyCon US + year: 2015 + link: https://web.archive.org/web/20150404081943/https://us.pycon.org/2015/ + cfp: '2014-09-15 23:59:00' + place: Montreal, Canada + start: 2015-04-08 + end: 2015-04-16 + sub: PY + location: + - title: PyCon US 2015 + latitude: 45.5031824 + longitude: -73.5698065 + +- conference: PyCon US + year: 2014 + link: https://web.archive.org/web/20140409001111/https://us.pycon.org/2014/ + cfp: '2013-09-15 23:59:00' + place: Montreal, Canada + start: 2014-04-09 + end: 2014-04-17 + sub: PY + location: + - title: PyCon US 2014 + latitude: 45.5031824 + longitude: -73.5698065 + +- conference: PyCon US + year: 2013 + link: https://web.archive.org/web/20130327104545/https://us.pycon.org/2013/ + cfp: '2012-09-28 23:59:00' + place: Santa Clara, USA + start: 2013-03-13 + end: 2013-03-21 + sub: PY + location: + - title: PyCon US 2013 + latitude: 37.2333253 + longitude: -121.6846349 + +- conference: PyCon US + year: 2012 + link: https://web.archive.org/web/20120319021157/https://us.pycon.org/2012/ + cfp: '2011-10-12 23:59:00' + place: Santa Clara, USA + start: 2012-03-07 + end: 2012-03-15 + sub: PY + location: + - title: PyCon US 2012 + latitude: 37.2333253 + longitude: -121.6846349 + +- conference: PyCon US + year: 2011 + link: https://web.archive.org/web/20101126050309/http://us.pycon.org/2011/about/ + cfp: '2010-11-01 23:59:00' + place: Atlanta, USA + start: 2011-03-09 + end: 2011-03-17 + sub: PY + location: + - title: PyCon US 2011 + latitude: 33.7489924 + longitude: -84.3902644 + +- conference: PyCon US + year: 2010 + link: https://web.archive.org/web/20090813153340/http://us.pycon.org/2010/about/ + cfp: '2009-10-01 23:59:00' + place: Atlanta, USA + start: 2010-02-17 + end: 2010-02-25 + sub: PY + location: + - title: PyCon US 2010 + latitude: 33.7489924 + longitude: -84.3902644 + +- conference: PyCon US + year: 2009 + link: https://web.archive.org/web/20090221061927/http://us.pycon.org/2009/about/ + cfp: '2009-11-03 23:59:00' + place: Chicago, USA + start: 2009-03-25 + end: 2009-04-02 + sub: PY + location: + - title: PyCon US 2009 + latitude: 41.8755616 + longitude: -87.6244212 + +- conference: PyCon US + year: 2008 + link: https://web.archive.org/web/20080906013119/http://us.pycon.org/2008/about/ + cfp: '2008-11-16 23:59:00' + place: Chicago, USA + start: 2008-03-13 + end: 2008-03-20 + sub: PY + location: + - title: PyCon US 2008 + latitude: 41.8755616 + longitude: -87.6244212 + +- conference: PyCon US + alt_name: PyCon TX + year: 2007 + link: https://web.archive.org/web/20060908054034/http://us.pycon.org/TX2007/HomePage + cfp: '2006-10-31 23:59:00' + place: Dallas, USA + start: 2007-02-22 + end: 2007-03-01 + sub: PY + location: + - title: PyCon US 2007 + latitude: 32.7762719 + longitude: -96.7968559 + +- conference: PyCon US + alt_name: PyCon TX + year: 2006 + link: https://web.archive.org/web/20060209040004/http://us.pycon.org/TX2006/HomePage + cfp: '2005-10-31 23:59:00' + place: Addison, USA + start: 2006-02-23 + end: 2006-03-02 + sub: PY + location: + - title: PyCon US 2006 + latitude: 41.931696 + longitude: -87.9889556 + +- conference: PyCon US + alt_name: PyCon DC + year: 2005 + link: https://web.archive.org/web/20050421013434/http://www.pycon.org/dc2005 + cfp: '2004-12-31 23:59:00' + place: Washington DC, USA + start: 2005-03-19 + end: 2005-03-25 + sub: PY + location: + - title: PyCon US 2005 + latitude: 38.8950368 + longitude: -77.0365427 + +- conference: PyCon US + alt_name: PyCon DC + year: 2004 + link: https://web.archive.org/web/20040401171437/http://pycon.org/dc2004/ + cfp: '2004-01-15 23:59:00' + place: Washington DC, USA + start: 2004-03-20 + end: 2004-03-26 + sub: PY + location: + - title: PyCon US 2004 + latitude: 38.8950368 + longitude: -77.0365427 + +- conference: PyCon US + alt_name: PyCon DC + year: 2003 + link: https://web.archive.org/web/20051108055842/http://wiki.python.org/moin/PyConDC2003 + cfp: '2002-12-15 23:59:00' + cfp_ext: '2003-01-15 23:59:00' + place: Washington DC, USA + start: 2003-03-26 + end: 2003-03-28 + sub: PY + location: + - title: PyCon US 2003 + latitude: 38.8950368 + longitude: -77.0365427 + +- conference: PyCon Uruguay + year: 2013 + link: https://web.archive.org/web/20130208161148/http://uy.pycon.org/ + cfp: '2013-09-20 23:59:00' + place: Montevideo, Uruguay + start: 2013-11-01 + end: 2013-11-02 + sub: PY + location: + - title: PyCon Uruguay 2013 + latitude: -34.9058916 + longitude: -56.1913095 + +- conference: PyCon Uruguay + year: 2012 + link: https://web.archive.org/web/20121001005855/http://uy.pycon.org/ + cfp: '2012-10-01 23:59:00' + place: Montevideo, Uruguay + start: 2012-11-10 + end: 2012-11-11 + sub: PY + location: + - title: PyCon Uruguay 2012 + latitude: -34.9058916 + longitude: -56.1913095 + +- conference: PyCon Ukraine + alt_name: PyCon UA + year: 2017 + link: https://web.archive.org/web/20170607211814/https://ua.pycon.org/ + cfp_link: https://web.archive.org/web/20240514194249/https://docs.google.com/forms/d/e/1FAIpQLSe9bXTjHlxV6pMcJZikeJPM7E5c2hVJvSORMKJJx1raoxchow/closedform + cfp: '2017-03-10 00:00:00' + timezone: Europe/Kiev + place: Lviv City, Ukraine + start: 2017-04-08 + end: 2017-04-09 + finaid: https://web.archive.org/web/20240514194243/https://docs.google.com/forms/d/e/1FAIpQLSeCcOQ9XBtd9-Y1_lt-KeQyDeR9OxryB4Ak0UJpwQLAF_n3KQ/viewform + sub: PY + location: + - title: PyCon Ukraine 2017 + latitude: 49.84823555 + longitude: 24.010960304611388 + +- conference: PyCon Ukraine + alt_name: PyCon UA + year: 2016 + link: https://web.archive.org/web/20160419232557/http://ua.pycon.org/ + cfp_link: http://goo.gl/forms/MDMtGniWVB + cfp: '2016-03-31 23:59:00' + place: Lviv, Ukraine + start: 2016-04-23 + end: 2016-04-24 + sub: PY + location: + - title: PyCon Ukraine 2016 + latitude: 49.841952 + longitude: 24.0315921 + +- conference: PyCon Ukraine + alt_name: PyCon UA + year: 2012 + link: https://web.archive.org/web/20120419232557/http://ua.pycon.org/ + cfp: '2012-09-20 23:59:00' + place: Kiew, Ukraine + start: 2012-10-20 + end: 2012-10-22 + sub: PY + location: + - title: PyCon Ukraine 2012 + latitude: 50.4500336 + longitude: 30.5241361 + +- conference: PyCon UK + year: 2018 + link: https://web.archive.org/web/20180612191355/https://2018.pyconuk.org/ + cfp: '2018-06-15 23:59:00' + place: Cardiff, UK + start: 2018-09-15 + end: 2018-09-19 + sub: PY + location: + - title: PyCon UK 2018 + latitude: 51.4816546 + longitude: -3.1791934 + +- conference: PyCon UK + year: 2017 + link: https://web.archive.org/web/20171023090724/http://2017.pyconuk.org/ + cfp: '2017-08-10 23:59:00' + place: Cardiff, UK + start: 2017-10-26 + end: 2017-10-30 + sub: PY + location: + - title: PyCon UK 2017 + latitude: 51.4816546 + longitude: -3.1791934 + +- conference: PyCon UK + year: 2016 + link: https://web.archive.org/web/20160915163722/http://2016.pyconuk.org/ + cfp: '2016-06-08 23:59:00' + place: Cardiff, UK + start: 2016-09-15 + end: 2016-09-19 + sub: PY + location: + - title: PyCon UK 2016 + latitude: 51.4816546 + longitude: -3.1791934 + +- conference: PyCon UK + year: 2015 + link: https://web.archive.org/web/20150706194946/http://www.pyconuk.org/ + cfp: '2015-06-19 23:59:00' + place: Coventry, UK + start: 2015-09-18 + end: 2015-09-21 + sub: PY + location: + - title: PyCon UK 2015 + latitude: 52.4081812 + longitude: -1.510477 + +- conference: PyCon UK + year: 2014 + link: https://web.archive.org/web/20140615103455/http://www.pyconuk.org/ + cfp: '2014-08-19 00:00:00' + timezone: Europe/London + place: Coventry, UK + start: 2014-09-19 + end: 2014-09-22 + sub: PY + location: + - title: PyCon UK 2014 + latitude: 52.4081812 + longitude: -1.510477 + +- conference: PyCon UK + year: 2013 + link: https://web.archive.org/web/20130612041903/http://www.pyconuk.org/ + cfp: '2013-08-19 00:00:00' + timezone: Europe/London + place: Coventry, UK + start: 2013-09-20 + end: 2013-09-23 + sub: PY + location: + - title: PyCon UK 2013 + latitude: 52.4081812 + longitude: -1.510477 + +- conference: PyCon UK + year: 2012 + link: https://web.archive.org/web/20120902022819/http://www.pyconuk.org/ + cfp: '2012-08-19 00:00:00' + timezone: Europe/London + place: Coventry, UK + start: 2012-09-28 + end: 2012-10-01 + sub: PY + location: + - title: PyCon UK 2012 + latitude: 52.4081812 + longitude: -1.510477 + +- conference: PyCon UK + year: 2011 + link: https://web.archive.org/web/20110727192434/http://www.pyconuk.org/ + cfp: Cancelled + timezone: Europe/London + place: Coventry, UK + start: 2011-09-24 + end: 2011-09-25 + sub: PY + note: Cancelled due to multiple issues + location: + - title: PyCon UK 2011 + latitude: 52.4081812 + longitude: -1.510477 + +- conference: PyCon UK + alt_name: PyCon UK Unconference + year: 2010 + link: https://web.archive.org/web/20110720142211/http://www.pyconuk.org/ + cfp: '2010-10-15 23:59:00' + timezone: Europe/London + place: Birmingham, UK + start: 2010-10-16 + end: 2010-10-16 + sub: PY + note: UnConference + location: + - title: PyCon UK 2010 + latitude: 52.4796992 + longitude: -1.9026911 + +- conference: PyCon UK + alt_name: PyCon UK Unconference + year: 2009 + link: https://web.archive.org/web/20090927081122/http://www.pyconuk.org/ + cfp: '2009-09-04 23:59:00' + timezone: Europe/London + place: Birmingham, UK + start: 2009-09-05 + end: 2009-09-05 + sub: PY + note: UnConference + location: + - title: PyCon UK 2009 + latitude: 52.4796992 + longitude: -1.9026911 + +- conference: PyCon UK + year: 2008 + link: https://web.archive.org/web/20080630193740/http://www.pyconuk.org/ + cfp_link: https://web.archive.org/web/20080510194926/http://www.pyconuk.org/callforpapers.html + cfp: '2008-07-01 23:59:00' + timezone: Europe/London + place: Birmingham, UK + start: 2008-09-12 + end: 2008-09-14 + sub: PY + location: + - title: PyCon UK 2008 + latitude: 52.4796992 + longitude: -1.9026911 + +- conference: PyCon UK + year: 2007 + link: https://web.archive.org/web/20070630193740/http://www.pyconuk.org/ + cfp: '2007-07-14 23:59:00' + place: Birmingham, UK + start: 2007-09-08 + end: 2007-09-09 + sub: PY + location: + - title: PyCon UK 2007 + latitude: 52.4796992 + longitude: -1.9026911 + +- conference: PyCon Thailand + year: 2018 + link: https://web.archive.org/web/20180805015539/https://th.pycon.org/en/ + cfp: '2018-04-17 23:59:00' + place: Thon Buri, Thailand + start: 2018-06-16 + end: 2018-06-18 + sub: PY + location: + - title: PyCon Thailand 2018 + latitude: 13.7263574 + longitude: 100.4891324 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2018 + link: https://web.archive.org/web/20181111081053/https://tw.pycon.org/2018/en-us/ + cfp: '2018-03-11 23:59:00' + place: Taipei, Taiwan + start: 2018-06-01 + end: 2018-06-02 + sub: PY + location: + - title: PyCon Taiwan 2018 + latitude: 25.0375198 + longitude: 121.5636796 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2017 + link: https://web.archive.org/web/20170222053338/https://tw.pycon.org/2017/en-us/ + cfp: '2017-03-12 23:59:00' + place: Taipei, Taiwan + start: 2017-06-09 + end: 2017-06-12 + sub: PY + location: + - title: PyCon Taiwan 2017 + latitude: 25.0375198 + longitude: 121.5636796 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2016 + link: https://web.archive.org/web/20160612014248/https://tw.pycon.org/2016/en-us/ + cfp: '2016-03-08 23:59:00' + place: Taipei, Taiwan + start: 2016-06-03 + end: 2016-06-05 + sub: PY + location: + - title: PyCon Taiwan 2016 + latitude: 25.0420743 + longitude: 121.61404600926753 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2013 + link: https://web.archive.org/web/20130118053814/http://tw.pycon.org/en/2013/ + cfp: '2013-03-10 23:59:00' + place: Taipei, Taiwan + start: 2013-05-25 + end: 2013-05-26 + sub: PY + location: + - title: PyCon Taiwan 2013 + latitude: 25.0420743 + longitude: 121.61404600926753 + +- conference: PyCon Taiwan + alt_name: PyCon TW + year: 2012 + link: https://web.archive.org/web/20120118053814/http://tw.pycon.org/en/ + cfp: '2012-04-02 23:59:00' + place: Taipei, Taiwan + start: 2012-06-09 + end: 2012-06-10 + sub: PY + location: + - title: PyCon Taiwan 2012 + latitude: 25.0420743 + longitude: 121.61404600926753 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2018 + link: https://web.archive.org/web/20181214135925/http://www.pycon.se/ + cfp: '2018-10-16 23:59:00' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2018-12-12 + end: 2018-12-12 + sub: PY + location: + - title: PyCon Sweden 2018 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2017 + link: https://web.archive.org/web/20170510015840/http://www.pycon.se/ + cfp: '2017-06-15 23:59:00' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2017-09-06 + end: 2017-09-06 + sub: PY + location: + - title: PyCon Sweden 2017 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2016 + link: https://web.archive.org/web/20160223113301/http://www.pycon.se/ + cfp: '2016-02-29 23:59:00' + place: Stockholm, Sweden + start: 2016-05-09 + end: 2016-05-11 + sub: PY + location: + - title: PyCon Sweden 2016 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2015 + link: https://web.archive.org/web/20150325001531/http://www.pycon.se/ + cfp: '2015-02-16 23:59:00' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2015-05-12 + end: 2015-05-13 + sub: PY + location: + - title: PyCon Sweden 2015 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon Sweden + alt_name: PyCon SE + year: 2014 + link: https://web.archive.org/web/20140508180555/http://2014.pycon.se/ + cfp: '2014-03-16 23:59:00' + timezone: Europe/Stockholm + place: Stockholm, Sweden + start: 2014-05-20 + end: 2014-05-21 + sub: PY + location: + - title: PyCon Sweden 2014 + latitude: 59.3251172 + longitude: 18.0710935 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2018 + link: https://web.archive.org/web/*/https://2018.es.pycon.org/ + cfp_link: https://web.archive.org/web/20240822193129/https://www.papercall.io/pycones2018 + cfp: '2018-07-06 23:59:00' + place: Malaga, Spain + start: 2018-10-05 + end: 2018-10-07 + sub: PY + location: + - title: PyCon Spain 2018 + latitude: 36.7213028 + longitude: -4.4216366 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2017 + link: https://web.archive.org/web/20210730132833/https://2017.es.pycon.org/ + cfp_link: https://web.archive.org/web/20171002035405/https://2017.es.pycon.org/es/blog/convocatoria-para-enviar-propuestas-pycones-2017/ + cfp: '2017-06-08 23:59:00' + place: Caceres, Spain + start: 2017-09-22 + end: 2017-09-25 + sub: PY + location: + - title: PyCon Spain 2017 + latitude: 39.759172500000005 + longitude: -6.1379457147709005 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2016 + link: https://web.archive.org/web/20160928191952/http://2016.es.pycon.org/es/ + cfp_link: https://web.archive.org/web/20160629053320/http://2016.es.pycon.org/es/proposals/submit/ + cfp: '2016-07-15 00:00:00' + place: Almeria, Spain + start: 2016-10-07 + end: 2016-10-09 + sub: PY + location: + - title: PyCon Spain 2016 + latitude: 36.8414197 + longitude: -2.4628135 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2015 + link: https://web.archive.org/web/20150615002459/http://2015.es.pycon.org/ + cfp: '2015-09-01 00:00:00' + place: Valencia, Spain + start: 2015-11-20 + end: 2015-11-22 + sub: PY + location: + - title: PyCon Spain 2015 + latitude: 39.4697065 + longitude: -0.3763353 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2014 + link: https://web.archive.org/web/20141117163834/http://2014.es.pycon.org/ + cfp: '2014-09-10 23:59:00' + place: Madrid, Spain + start: 2014-11-08 + end: 2014-11-09 + sub: PY + location: + - title: PyCon Spain 2014 + latitude: 40.4167047 + longitude: -3.7035825 + +- conference: PyCon Spain + alt_name: PyCon ES + year: 2013 + link: https://web.archive.org/web/20131117163834/http://2013.es.pycon.org/ + cfp_link: https://web.archive.org/web/20130629150535/http://2013.es.pycon.org/#call4papers + cfp: '2013-09-15 23:59:00' + place: Madrid, Spain + start: 2013-11-22 + end: 2013-11-24 + sub: PY + location: + - title: PyCon Spain 2013 + latitude: 40.4167047 + longitude: -3.7035825 + +- conference: PyCon South Korea + alt_name: PyCon Korea + year: 2018 + link: http://web.archive.org/web/20180304011806/https://www.pycon.kr/2018/ + cfp: '2018-05-13 23:59:00' + place: Seoul, South Korea + start: 2018-08-15 + end: 2018-08-20 + sub: PY + location: + - title: PyCon South Korea 2018 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: PyCon South Korea + alt_name: PyCon Korea + year: 2017 + link: http://web.archive.org/web/20170304011806/https://www.pycon.kr/2017/ + cfp: '2017-05-27 23:59:00' + place: Seoul, South Korea + start: 2017-08-12 + end: 2017-08-15 + sub: PY + location: + - title: PyCon South Korea 2017 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: PyCon South Korea + alt_name: PyCon KR + year: 2015 + link: https://web.archive.org/web/20150826062755/http://www.pycon.kr/2015/ + cfp: '2015-04-07 23:59:00' + place: Seoul, South Korea + start: 2015-08-29 + end: 2015-08-30 + sub: PY + location: + - title: PyCon South Korea 2015 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: PyCon South Korea + alt_name: PyCon KR + year: 2014 + link: https://web.archive.org/web/20140716074223/http://www.pycon.kr/ + cfp: '2014-07-06 23:59:00' + place: Seoul, Korea + start: 2014-08-30 + end: 2014-08-30 + sub: PY + location: + - title: PyCon South Korea 2014 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2018 + link: https://web.archive.org/web/20180419141939/https://za.pycon.org/ + cfp_link: https://2018.za.pycon.org/archived/submit-talk/ + cfp: '2018-09-17 23:59:00' + place: Johannesburg, South Africa + start: 2018-10-10 + end: 2018-10-14 + sub: PY + location: + - title: PyCon South Africa 2018 + latitude: -26.205 + longitude: 28.049722 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2017 + link: https://web.archive.org/web/20170801125832/https://za.pycon.org/ + cfp_link: https://web.archive.org/web/20210815075207/https://2017.za.pycon.org/archived/submit-talk/ + cfp: '2017-10-01 23:59:00' + place: Cape Town, South Africa + start: 2017-10-04 + end: 2017-10-08 + sub: PY + location: + - title: PyCon South Africa 2017 + latitude: -33.928992 + longitude: 18.417396 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2016 + link: https://web.archive.org/web/20160422045615/https://za.pycon.org/ + cfp: '2016-10-01 23:59:00' + place: Johannesburg, South Africa + start: 2016-10-06 + end: 2016-10-09 + sub: PY + location: + - title: PyCon South Africa 2016 + latitude: -26.205 + longitude: 28.049722 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2015 + link: https://web.archive.org/web/20150924233205/https://za.pycon.org/ + cfp: '2015-10-01 23:59:00' + place: Johannesburg, South Africa + start: 2015-10-01 + end: 2015-10-04 + sub: PY + location: + - title: PyCon South Africa 2015 + latitude: -26.205 + longitude: 28.049722 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2014 + link: https://web.archive.org/web/20140712234719/https://za.pycon.org/ + cfp: '2014-09-01 23:59:00' + place: Johannesburg, South Africa + start: 2014-10-02 + end: 2014-10-06 + sub: PY + location: + - title: PyCon South Africa 2014 + latitude: -26.205 + longitude: 28.049722 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2013 + link: https://web.archive.org/web/20130925120247/http://za.pycon.org/ + cfp: '2013-09-01 23:59:00' + cfp_ext: '2013-09-15 23:59:00' + place: Cape Town, South Africa + start: 2013-10-03 + end: 2013-10-04 + sub: PY + location: + - title: PyCon South Africa 2013 + latitude: -33.928992 + longitude: 18.417396 + +- conference: PyCon South Africa + alt_name: PyCon ZA + year: 2012 + link: https://web.archive.org/web/20120825164659/http://za.pycon.org/#&panel1-3 + cfp: '2012-09-15 23:59:00' + timezone: Africa/Johannesburg + place: Cape Town, South Africa + start: 2012-10-04 + end: 2012-10-05 + sub: PY + location: + - title: PyCon South Africa 2012 + latitude: -33.928992 + longitude: 18.417396 + +- conference: PyCon Slovakia + alt_name: PyCon SK + year: 2018 + link: https://web.archive.org/web/20180310093230/https://2018.pycon.sk/en/ + cfp: '2018-01-21 23:59:00' + place: Bratislava, Slovakia + start: 2018-03-09 + end: 2018-03-11 + sub: PY + location: + - title: PyCon Slovakia 2018 + latitude: 48.1516988 + longitude: 17.1093063 + +- conference: PyCon Slovakia + alt_name: PyCon SK + year: 2017 + link: https://web.archive.org/web/20170306082548/http://www.pycon.sk/2017/ + cfp_link: https://web.archive.org/web/20220124234710/https://2017.pycon.sk/cfp/ + cfp: '2017-02-14 23:59:00' + place: Bratislava, Slovakia + start: 2017-03-10 + end: 2017-03-12 + sub: PY + location: + - title: PyCon Slovakia 2017 + latitude: 48.1516988 + longitude: 17.1093063 + +- conference: PyCon Slovakia + alt_name: PyCon SK + year: 2016 + link: https://web.archive.org/web/20160307164154/http://pycon.sk/en/ + cfp_link: https://web.archive.org/web/20170315013539/https://2016.pycon.sk/en/speaking.html + cfp: '2016-01-24 23:59:00' + place: Bratislava, Slovakia + start: 2016-03-11 + end: 2016-03-13 + sub: PY + location: + - title: PyCon Slovakia 2016 + latitude: 48.1516988 + longitude: 17.1093063 + +- conference: PyCon Singapore + year: 2018 + link: https://web.archive.org/web/20180425194853/https://pycon.sg/ + cfp: '2018-05-01 23:59:00' + place: Singapore, Singapore + start: 2018-05-31 + end: 2018-06-02 + sub: PY + location: + - title: PyCon Singapore 2018 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Singapore + year: 2016 + link: https://web.archive.org/web/20160406120434/https://pycon.sg/ + cfp: '2016-04-30 23:59:00' + place: Singapore, Singapore + start: 2016-06-23 + end: 2016-06-25 + sub: PY + location: + - title: PyCon Singapore 2016 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Singapore + year: 2015 + link: https://web.archive.org/web/20150426060232/https://pycon.sg/ + cfp: '2015-04-30 23:59:00' + place: Singapore, Singapore + start: 2015-06-17 + end: 2015-06-19 + sub: PY + location: + - title: PyCon Singapore 2015 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Singapore + year: 2014 + link: https://web.archive.org/web/20140607024650/https://pycon.sg/ + cfp: '2014-04-30 23:59:00' + place: Singapore, Singapore + start: 2014-06-18 + end: 2014-06-20 + sub: PY + location: + - title: PyCon Singapore 2014 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Singapore + year: 2013 + link: https://web.archive.org/web/20130531041813/https://pycon.sg/ + cfp_link: https://web.archive.org/web/20130816132236/https://pycon.sg/proposals/ + cfp: '2013-04-01 23:59:00' + place: Singapore, Singapore + start: 2013-06-13 + end: 2013-06-15 + sub: PY + location: + - title: PyCon Singapore 2013 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Siberia + year: 2016 + link: https://web.archive.org/web/20161001171831/http://dev2dev.ru/ + cfp: '2016-09-01 23:59:00' + place: Aerovokzalnaya, Russia + start: 2016-10-01 + end: 2016-10-02 + sub: PY + location: + - title: PyCon Siberia 2016 + latitude: 43.4458896 + longitude: 39.9326404 + +- conference: PyCon Russia + year: 2018 + link: https://web.archive.org/web/20180715034819/http://pycon.ru/2018/en/ + cfp: '2018-06-12 23:59:00' + place: Gribovka, Russia + start: 2018-07-22 + end: 2018-07-23 + sub: PY + location: + - title: PyCon Russia 2018 + latitude: 54.0357892 + longitude: 33.882641 + +- conference: PyCon Russia + year: 2017 + link: https://web.archive.org/web/20170712000437/http://pycon.ru/2017/en/ + cfp: '2017-05-11 23:59:00' + place: Kaluga Oblast, Russia + start: 2017-07-16 + end: 2017-07-17 + sub: PY + location: + - title: PyCon Russia 2017 + latitude: 54.4382773 + longitude: 35.5272854 + +- conference: PyCon Russia + year: 2015 + link: https://web.archive.org/web/20150930220556/http://pycon.ru/2015/en/ + cfp: None + place: Ekaterinburg, Russia + start: 2015-09-18 + end: 2015-09-19 + sub: PY + location: + - title: PyCon Russia 2015 + latitude: 56.839104 + longitude: 60.60825 + +- conference: PyCon Russia + year: 2014 + link: https://web.archive.org/web/20140529230912/http://pycon.ru/2014/en/ + cfp: None + place: Yekaterinburg, Russia + start: 2014-06-02 + end: 2014-06-03 + sub: PY + location: + - title: PyCon Russia 2014 + latitude: 56.839104 + longitude: 60.60825 + +- conference: PyCon Russia + year: 2013 + link: https://web.archive.org/web/20130210032917/http://ru.pycon.org/en/ + cfp: None + place: Yekaterinburg, Russia + start: 2013-02-24 + end: 2013-02-25 + sub: PY + location: + - title: PyCon Russia 2013 + latitude: 56.839104 + longitude: 60.60825 + +- conference: PyCon Pune + year: 2018 + link: https://web.archive.org/web/20180121010626/http://pune.pycon.org/2018/ + cfp: Cancelled + place: Pune, India + start: 2018-02-08 + end: 2018-02-11 + sub: PY + location: + - title: PyCon Pune 2018 + latitude: 18.52930005 + longitude: 73.85682537025511 + +- conference: PyCon Pune + year: 2017 + link: https://web.archive.org/web/20170207210807/http://pune.pycon.org/ + cfp: '2017-11-30 23:59:00' + place: Pune, India + start: 2017-02-16 + end: 2017-02-19 + sub: PY + location: + - title: PyCon Pune 2017 + latitude: 18.52930005 + longitude: 73.85682537025511 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2018 + link: https://web.archive.org/web/20180628105952/https://pl.pycon.org/2018/ + cfp: '2018-05-13 23:00:00' + place: Ossa, Poland + start: 2018-08-23 + end: 2018-08-26 + sub: PY + location: + - title: PyCon Poland 2018 + latitude: 51.8151645 + longitude: 20.3859912 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2017 + link: https://web.archive.org/web/20170701211408/https://pl.pycon.org/2017/index_en.html + cfp: '2017-05-31 23:59:59' + place: Ossa, Poland + start: 2017-08-17 + end: 2017-08-20 + sub: PY + location: + - title: PyCon Poland 2017 + latitude: 51.8151645 + longitude: 20.3859912 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2016 + link: https://web.archive.org/web/20160605192843/http://pl.pycon.org/2016/ + cfp: '2016-06-10 23:59:00' + place: Ossa, Poland + start: 2016-10-13 + end: 2016-10-16 + sub: PY + location: + - title: PyCon Poland 2016 + latitude: 51.8151645 + longitude: 20.3859912 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2014 + link: https://web.archive.org/web/20141026131600/http://pl.pycon.org/2014/en + cfp: '2014-07-14 23:59:00' + place: Szczyrk, Poland + start: 2014-10-16 + end: 2014-10-19 + sub: PY + location: + - title: PyCon Poland 2014 + latitude: 49.69649115 + longitude: 19.010946935372793 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2013 + link: https://web.archive.org/web/20131015143206/http://pl.pycon.org/2013/ + cfp: '2013-07-28 23:59:00' + place: Szczyrk, Poland + start: 2013-10-17 + end: 2013-10-20 + sub: PY + location: + - title: PyCon Poland 2013 + latitude: 49.69649115 + longitude: 19.010946935372793 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2012 + link: https://web.archive.org/web/20120918233237/http://pl.pycon.org/2012/ + cfp: '2012-06-24 23:59:59' + place: Masłów, Poland + start: 2012-09-13 + end: 2012-09-16 + sub: PY + location: + - title: PyCon Poland 2012 + latitude: 51.3388736 + longitude: 17.1275518 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2011 + link: https://web.archive.org/web/20110924185632/http://pl.pycon.org/2011/ + cfp: '2011-07-02 23:59:00' + place: Kielce, Poland + start: 2011-09-22 + end: 2011-09-25 + sub: PY + location: + - title: PyCon Poland 2011 + latitude: 50.85402845 + longitude: 20.60991568734511 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2010 + link: https://web.archive.org/web/20101028105939/http://pl.pycon.org/2010/ + cfp: '2010-07-07 23:59:00' + cfp_ext: '2010-07-16 23:59:00' + place: Ustron, Poland + start: 2010-10-08 + end: 2010-10-10 + sub: PY + location: + - title: PyCon Poland 2010 + latitude: 49.7181505 + longitude: 18.8028338 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2009 + link: https://web.archive.org/web/20100626111624/https://liwo.polsl.pl/pycon-pl2009/ + cfp: '2009-06-26 23:59:00' + place: Ustron, Poland + start: 2009-10-16 + end: 2009-10-18 + sub: PY + location: + - title: PyCon Poland 2009 + latitude: 49.7181505 + longitude: 18.8028338 + +- conference: PyCon Poland + alt_name: PyCon PL + year: 2008 + link: https://web.archive.org/web/20100626111624/https://liwo.polsl.pl/pycon-pl2008/ + cfp: '2008-07-02 23:59:00' + place: Rybnik, Poland + start: 2008-10-18 + end: 2008-10-19 + sub: PY + location: + - title: PyCon Poland 2008 + latitude: 50.0955793 + longitude: 18.5419933 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2018 + link: https://web.archive.org/web/20180219060618/https://pycon.python.ph/ + cfp: '2017-12-26 23:59:00' + place: Manila, Philippines + start: 2018-02-24 + end: 2018-02-26 + sub: PY + location: + - title: PyCon Philippines 2018 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2017 + link: https://web.archive.org/web/20171019052320/https://pycon.python.ph/ + cfp: '2016-11-30 23:59:00' + place: Cagayan de Oro City, Philippines + start: 2017-02-25 + end: 2017-02-26 + sub: PY + location: + - title: PyCon Philippines 2017 + latitude: 8.4756417 + longitude: 124.6421532 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2016 + link: https://web.archive.org/web/20160625004953/http://ph.pycon.org/ + cfp: '2015-11-30 23:59:00' + place: Manila, Philippines + start: 2016-02-27 + end: 2016-02-28 + sub: PY + location: + - title: PyCon Philippines 2016 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2015 + link: https://web.archive.org/web/20150625004953/http://ph.pycon.org/ + cfp: '2015-05-27 23:59:00' + cfp_ext: '2015-05-29 23:59:00' + place: Manila, Philippines + start: 2015-07-04 + end: 2015-07-05 + sub: PY + location: + - title: PyCon Philippines 2015 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2014 + link: https://web.archive.org/web/20140625004953/http://ph.pycon.org/ + cfp_link: https://docs.google.com/forms/d/1zGVk_GR1RpdI9eiOndsNnbsPYPSf1E3titgRVxF9BbA/closedform + cfp: '2014-01-10 23:59:00' + place: Manila, Philippines + start: 2014-02-22 + end: 2014-02-23 + sub: PY + location: + - title: PyCon Philippines 2014 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCon Philippines + alt_name: PyCon PH + year: 2012 + link: https://web.archive.org/web/20120625004953/http://ph.pycon.org/ + cfp: None + place: Manila, Philippines + start: 2012-06-30 + end: 2012-07-01 + sub: PY + location: + - title: PyCon Philippines 2012 + latitude: 14.63989835 + longitude: 121.07819518938447 + +- conference: PyCon Pakistan + year: 2018 + link: https://web.archive.org/web/20181117100303/http://pycon.pk/ + cfp: '2018-08-01 23:59:00' + place: Lahore, Pakistan + start: 2018-11-17 + end: 2018-11-18 + sub: PY + location: + - title: PyCon Pakistan 2018 + latitude: 31.5656822 + longitude: 74.3141829 + +- conference: PyCon Pakistan + year: 2017 + link: https://web.archive.org/web/20171219132009/http://pycon.pk/ + cfp: '2017-08-25 23:59:00' + place: Lahore, Pakistan + start: 2017-12-16 + end: 2017-12-16 + sub: PY + location: + - title: PyCon Pakistan 2017 + latitude: 31.5656822 + longitude: 74.3141829 + +- conference: PyCon Nigeria + year: 2018 + link: https://web.archive.org/web/20180902173538/https://pycon.ng/ + cfp_link: https://web.archive.org/web/20181001172404/https://www.pycon.ng/speaking/overview/#proposing-a-talk + cfp: None + place: Lagos, Nigeria + start: 2018-09-13 + end: 2018-09-15 + sub: PY + location: + - title: PyCon Nigeria 2018 + latitude: 6.4550575 + longitude: 3.3941795 + +- conference: PyCon Nigeria + year: 2017 + link: https://web.archive.org/web/20170902173538/https://pycon.ng/ + cfp: None + place: Lagos, Nigeria + start: 2017-09-15 + end: 2017-09-17 + sub: PY + location: + - title: PyCon Nigeria 2017 + latitude: 6.4550575 + longitude: 3.3941795 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2018 + link: https://web.archive.org/web/20171121113217/https://na.pycon.org/ + cfp: '2017-12-29 23:59:00' + place: Windhoek, Namibia + start: 2018-02-20 + end: 2018-02-22 + sub: PY + location: + - title: PyCon Namibia 2018 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2017 + link: https://web.archive.org/web/20161121113217/https://na.pycon.org/ + cfp: '2016-12-30 23:59:00' + place: Windhoek, Namibia + start: 2017-02-21 + end: 2017-02-23 + sub: PY + location: + - title: PyCon Namibia 2017 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: PyCon Namibia + alt_name: PyCon NA + year: 2016 + link: https://web.archive.org/web/20160104173747/http://na.pycon.org/ + cfp: '2015-12-15 23:59:00' + place: Windhoek, Namibia + start: 2016-01-25 + end: 2016-01-29 + sub: PY + location: + - title: PyCon Namibia 2016 + latitude: -22.611456150000002 + longitude: 17.05860104184979 + +- conference: PyCon Malaysia + alt_name: PyCon MY + year: 2016 + link: https://web.archive.org/web/20160722184438/https://pycon.my/ + cfp: '2016-05-28 23:59:00' + cfp_ext: '2016-06-10' + place: Kuala Lumpur, Malaysia + start: 2016-08-26 + end: 2016-08-28 + sub: PY + location: + - title: PyCon Malaysia 2016 + latitude: 4.5693754 + longitude: 102.2656823 + +- conference: PyCon Malaysia + alt_name: PyCon MY + year: 2015 + link: https://web.archive.org/web/20150812151551/http://www.pycon.my/pycon-my-2015 + cfp_link: https://web.archive.org/web/20150812142938/http://www.pycon.my/call-for-proposal + cfp: '2015-07-03 23:59:00' + cfp_ext: '2015-07-10' + timezone: Asia/Kuala_Lumpur + place: Kuala Lumpur, Malaysia + start: 2015-08-21 + end: 2015-08-23 + sub: PY + location: + - title: PyCon Malaysia 2015 + latitude: 4.5693754 + longitude: 102.2656823 + +- conference: PyCon Malaysia + alt_name: Mini PyCon Kuala Lumpur + year: 2014 + link: https://web.archive.org/web/20140301204105/http://www.pycon.my/mini-pycon-my-2014 + cfp_link: https://web.archive.org/web/20240922120412/https://docs.google.com/forms/d/e/1FAIpQLSdSs4-zu7SNXfJuwTOAbOAaxfY-nvLT5Ih353EnHcIJgPP9dA/viewform + cfp: '2014-01-31 23:59:00' + place: Kuala Lumpur, Malaysia + start: 2014-03-15 + end: 2014-03-15 + sub: PY + location: + - title: PyCon Malaysia 2014 + latitude: 4.5693754 + longitude: 102.2656823 + +- conference: PyCon Lithuania + alt_name: PyCon LT + year: 2015 + link: https://web.archive.org/web/20150419215436/http://pycon.lt/ + cfp: None + place: Vilnius, Lithuania + start: 2015-04-25 + end: 2015-04-26 + sub: PY + location: + - title: PyCon Lithuania 2015 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: PyCon KyuShu + year: 2018 + link: https://web.archive.org/web/20180703050657/http://kyushu.pycon.jp/ + cfp_link: https://docs.google.com/forms/d/1Sk-jNIv1u1zB0y2XEBJo9O3rfcpap1JmyN7tV4_-vEs/closedform + cfp: '2018-05-20 23:59:00' + place: Fukuoka, Japan + start: 2018-06-30 + end: 2018-06-30 + sub: PY + location: + - title: PyCon KyuShu 2018 + latitude: 33.6251241 + longitude: 130.6180016 + +- conference: PyCon Kyrgyzstan + year: 2018 + link: https://web.archive.org/web/20210305183715/http://pyconkg.com/ + cfp: None + place: Bishkek, Kyrgyzstan + start: 2018-09-09 + end: 2018-09-09 + sub: PY + location: + - title: PyCon Kyrgyzstan 2018 + latitude: 42.8777895 + longitude: 74.6066926 + +- conference: PyCon Kenya + year: 2018 + link: https://web.archive.org/web/20181011141357/https://www.pycon.or.ke/ + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSf2cF2KxbI9XsEIHqBA2jEzx0S4fZ4_weK3HYMo10blq1mCWw/closedform + cfp: '2018-09-30 23:59:00' + place: Nairobi, Kenya + start: 2018-10-25 + end: 2018-10-26 + sub: PY + location: + - title: PyCon Kenya 2018 + latitude: -1.216548800565 + longitude: 36.879042921883 + +- conference: PyCon Kenya + year: 2017 + link: https://web.archive.org/web/20170929035432/http://www.pycon.or.ke/ + cfp_link: https://web.archive.org/web/20170929042034/http://www.pycon.or.ke/call_for_proposals + cfp: '2017-05-31 23:59:00' + place: Nairobi, Kenya + start: 2017-09-28 + end: 2017-09-30 + sub: PY + location: + - title: PyCon Kenya 2017 + latitude: -1.2136405 + longitude: 36.87930533266044 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2018 + link: https://web.archive.org/web/20180914150246/https://pycon.jp/2018/ + cfp: '2018-06-15 23:59:00' + place: Tokyo, Japan + start: 2018-09-15 + end: 2018-09-18 + sub: PY + location: + - title: PyCon Japan 2018 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2017 + link: https://web.archive.org/web/20171017043010/https://pycon.jp/2017/en/ + cfp: '2017-06-19 23:59:00' + place: Tokyo, Japan + start: 2017-09-07 + end: 2017-09-10 + sub: PY + location: + - title: PyCon Japan 2017 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2016 + link: https://web.archive.org/web/20161017222234/https://pycon.jp/2016/en/ + cfp: '2016-06-13 23:59:00' + place: Tokyo, Japan + start: 2016-09-20 + end: 2016-09-24 + sub: PY + location: + - title: PyCon Japan 2016 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2015 + link: https://web.archive.org/web/20160807221928/https://pycon.jp/2015/en/ + cfp: '2015-07-20 23:59:00' + place: Tokyo, Japan + start: 2015-10-09 + end: 2015-10-12 + sub: PY + location: + - title: PyCon Japan 2015 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2014 + link: https://web.archive.org/web/20140907073857/https://pycon.jp/2014/ + cfp: '2014-06-20 23:59:59' + place: Tokyo, Japan + start: 2014-09-12 + end: 2014-09-15 + sub: PY + location: + - title: PyCon Japan 2014 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Japan + alt_name: PyCon JP + year: 2012 + link: https://web.archive.org/web/20120916084616/http://2012.pycon.jp/en/index.html + cfp: '2012-05-31 23:59:00' + place: Tokyo, Japan + start: 2012-09-15 + end: 2012-09-17 + sub: PY + location: + - title: PyCon Japan 2012 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Jamaica + year: 2017 + link: https://web.archive.org/web/20171009190334/http://www.pycon.org.jm/ + cfp_link: https://web.archive.org/web/20170911050449/http://www.pycon.org.jm/apply + cfp: None + place: Kingston, Jamaica + start: 2017-11-16 + end: 2017-11-19 + sub: PY + location: + - title: PyCon Jamaica 2017 + latitude: 17.9712148 + longitude: -76.7928128 + +- conference: PyCon Jamaica + year: 2016 + link: https://web.archive.org/web/20180624093101/http://pythonjam.org.jm/conference-2016 + cfp: None + place: Kingston, Jamaica + start: 2016-11-17 + end: 2016-11-19 + sub: PY + location: + - title: PyCon Jamaica 2016 + latitude: 17.9712148 + longitude: -76.7928128 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2018 + link: https://web.archive.org/web/20180407235829/https://www.pycon.it/en/ + cfp: '2018-01-07 23:59:00' + place: Florence, Italy + start: 2018-04-19 + end: 2018-04-22 + sub: PY + location: + - title: PyCon Italia 2018 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2017 + link: https://web.archive.org/web/20180407235829/https://www.pycon.it/en/ + cfp: '2017-01-07 23:59:00' + place: Florence, Italy + start: 2017-04-06 + end: 2017-04-09 + sub: PY + location: + - title: PyCon Italia 2017 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2016 + link: https://web.archive.org/web/20140808133512/https://www.pycon.it/ + cfp: '2016-01-10 23:59:00' + place: Florence, Italia + start: 2016-04-15 + end: 2016-04-17 + sub: PY + location: + - title: PyCon Italia 2016 + latitude: 36.8309886 + longitude: 11.9403287 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2015 + link: https://web.archive.org/web/20141224170534/https://www.pycon.it/it/ + cfp: '2015-01-18 23:59:00' + place: Florence, Italy + start: 2015-04-17 + end: 2015-04-19 + sub: PY + location: + - title: PyCon Italia 2015 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2014 + link: https://web.archive.org/web/20140808133512/https://www.pycon.it/ + cfp: '2014-02-21 23:59:00' + place: Florence, Italy + start: 2014-05-23 + end: 2014-05-26 + sub: PY + location: + - title: PyCon Italia 2014 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2010 + link: https://web.archive.org/web/20100222085004/http://www.pycon.it/ + cfp_link: https://web.archive.org/web/20100216021335/http://www.pycon.it/pycon4/call-for-paper + cfp: '2010-03-10 23:59:00' + timezone: Europe/Rome + place: Florence, Italy + start: 2010-05-07 + end: 2010-05-09 + sub: PY + location: + - title: PyCon Italia 2010 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2009 + link: https://web.archive.org/web/20090508031546/http://www.pycon.it/ + cfp: '2009-03-08 23:59:00' + timezone: Europe/Rome + place: Florence, Italy + start: 2009-05-08 + end: 2009-05-10 + sub: PY + location: + - title: PyCon Italia 2009 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2008 + link: https://web.archive.org/web/20080414185759/https://www.pycon.it/ + cfp: '2008-04-01 23:59:00' + timezone: Europe/Rome + place: Florence, Italy + start: 2008-05-09 + end: 2008-05-11 + sub: PY + location: + - title: PyCon Italia 2008 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Italy + alt_name: PyCon Italia + year: 2007 + link: https://web.archive.org/web/20070520141412/https://www.pycon.it/ + cfp: '2007-04-30 23:59:00' + timezone: Europe/Rome + place: Florence, Italy + start: 2007-06-09 + end: 2007-06-10 + sub: PY + location: + - title: PyCon Italia 2007 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: PyCon Israel + year: 2018 + link: https://web.archive.org/web/20180315123043/http://il.pycon.org/2018/ + cfp: '2018-04-01 23:59:00' + place: Ramat Gan, Israel + start: 2018-06-04 + end: 2018-06-06 + sub: PY + location: + - title: PyCon Israel 2018 + latitude: 32.0686867 + longitude: 34.8246812 + +- conference: PyCon Israel + year: 2017 + link: https://web.archive.org/web/20170315123043/http://il.pycon.org/ + cfp: '2017-04-01 23:59:00' + place: Ramat Gan, Israel + start: 2017-06-11 + end: 2017-06-14 + sub: PY + location: + - title: PyCon Israel 2017 + latitude: 32.0686867 + longitude: 34.8246812 + +- conference: PyCon Israel + year: 2016 + link: https://web.archive.org/web/20160315123043/http://il.pycon.org/ + cfp: '2016-04-02 23:59:00' + place: Tel Aviv, Israel + start: 2016-05-02 + end: 2016-05-03 + sub: PY + location: + - title: PyCon Israel 2016 + latitude: 32.10050375 + longitude: 34.826677554304695 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2018 + link: https://web.archive.org/web/20180828133458/https://pyconie18.python.ie/ + cfp: '2018-09-09 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2018-11-10 + end: 2018-11-11 + sub: PY + location: + - title: PyCon Ireland 2018 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2017 + link: https://web.archive.org/web/20171025025454/http://pyconie17.python.ie/ + cfp: '2017-08-15 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2017-10-21 + end: 2017-10-22 + sub: PY + location: + - title: PyCon Ireland 2017 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2016 + link: https://web.archive.org/web/20161025084155/http://python.ie/pycon-2016/ + cfp: '2016-08-15 23:59:00' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2016-11-05 + end: 2016-11-06 + sub: PY + location: + - title: PyCon Ireland 2016 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2015 + link: https://web.archive.org/web/20160521024356/http://python.ie/previous-pycons/pycon-2015/ + cfp_link: https://web.archive.org/web/20150728132459/http://python.ie/pycon-2015/call-proposals/ + cfp: '2015-07-31 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2015-10-24 + end: 2015-10-25 + sub: PY + location: + - title: PyCon Ireland 2015 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2014 + link: http://python.ie/pycon/ + cfp: '2014-07-14 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2014-10-11 + end: 2014-10-14 + sub: PY + location: + - title: PyCon Ireland 2014 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2013 + link: https://web.archive.org/web/20130802043511/http://python.ie:80/pycon/2013/ + cfp: '2013-08-31 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2012-10-12 + end: 2012-10-15 + sub: PY + location: + - title: PyCon Ireland 2013 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2012 + link: https://web.archive.org/web/20121101011018/http://python.ie/pycon/2012/ + cfp: '2012-08-19 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2012-10-13 + end: 2012-10-14 + sub: PY + location: + - title: PyCon Ireland 2012 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2011 + link: https://web.archive.org/web/20111101011018/http://python.ie/pycon/2011/ + cfp: '2011-07-31 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2011-10-08 + end: 2011-10-09 + sub: PY + location: + - title: PyCon Ireland 2011 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Ireland + alt_name: PyCon IE + year: 2010 + link: https://web.archive.org/web/20100604053232/http://www.python.ie/pyconireland + cfp: '2010-05-31 23:59:59' + timezone: Europe/Dublin + place: Dublin, Ireland + start: 2010-07-17 + end: 2010-07-18 + sub: PY + location: + - title: PyCon Ireland 2010 + latitude: 53.3498006 + longitude: -6.2602964 + +- conference: PyCon Iran + alt_name: Iran PyCon + year: 2018 + link: https://web.archive.org/web/20180217031411/http://pycon.ir/ + cfp: None + place: Tehran, Iran + start: 2018-02-15 + end: 2018-02-15 + sub: PY + location: + - title: PyCon Iran 2018 + latitude: 35.6892523 + longitude: 51.3896004 + +- conference: PyCon Iran + alt_name: Iran PyCon + year: 2017 + link: https://web.archive.org/web/20170208170707/http://www.pycon.ir/ + cfp: None + place: Tehran, Iran + start: 2017-02-17 + end: 2017-02-17 + sub: PY + location: + - title: PyCon Iran 2017 + latitude: 35.6892523 + longitude: 51.3896004 + +- conference: PyCon Iran + alt_name: Iran PyCon + year: 2016 + link: https://web.archive.org/web/20160509203844/http://pycon.ir/ + cfp: None + place: Tehran, Iran + start: 2016-05-24 + end: 2016-05-24 + sub: PY + location: + - title: PyCon Iran 2016 + latitude: 35.6892523 + longitude: 51.3896004 + +- conference: PyCon Iran + alt_name: Iran PyCon + year: 2014 + link: https://web.archive.org/web/20141021094358/http://2014.pycon.ir/ + cfp: None + place: Tehran, Iran + start: 2014-05-11 + end: 2014-05-11 + sub: PY + location: + - title: PyCon Iran 2014 + latitude: 35.6892523 + longitude: 51.3896004 + +- conference: PyCon Iran + alt_name: Iran PyCon + year: 2013 + link: https://web.archive.org/web/20131021094358/http://2013.pycon.ir/ + cfp: '2013-11-07 23:59:00' + place: Tehran, Iran + start: 2013-11-10 + end: 2013-11-10 + sub: PY + location: + - title: PyCon Iran 2013 + latitude: 35.6892523 + longitude: 51.3896004 + +- conference: PyCon Indonesia + alt_name: PyCon ID + year: 2018 + link: https://web.archive.org/web/20181021125731/http://pycon.id/ + cfp: '2018-11-01 23:59:00' + place: Jakarta, Indonesia + start: 2018-11-03 + end: 2018-11-04 + sub: PY + location: + - title: PyCon Indonesia 2018 + latitude: -6.175247 + longitude: 106.8270488 + +- conference: PyCon Indonesia + alt_name: PyCon ID + year: 2017 + link: https://web.archive.org/web/20171021125731/http://pycon.id/ + cfp: '2017-11-06 23:59:00' + place: Surabaya, Indonesia + start: 2017-12-09 + end: 2017-12-09 + sub: PY + location: + - title: PyCon Indonesia 2017 + latitude: -7.2459717 + longitude: 112.7378266 + +- conference: PyCon India + year: 2018 + link: https://web.archive.org/web/20181022230453/https://in.pycon.org/2018/ + cfp: '2018-07-10 23:59:00' + timezone: Asia/Kolkata + place: Hyderabad, India + start: 2018-10-05 + end: 2018-10-09 + sub: PY + location: + - title: PyCon India 2018 + latitude: 17.360589 + longitude: 78.4740613 + +- conference: PyCon India + year: 2017 + link: https://web.archive.org/web/20180205164409/https://in.pycon.org/2017/ + cfp: '2017-08-31 23:59:00' + timezone: Asia/Kolkata + place: Delhi, India + start: 2017-11-02 + end: 2017-11-05 + sub: PY + location: + - title: PyCon India 2017 + latitude: 28.6273928 + longitude: 77.1716954 + +- conference: PyCon India + year: 2016 + link: https://web.archive.org/web/20161027165711/https://in.pycon.org/2016/ + cfp: '2016-06-30 23:59:00' + timezone: Asia/Kolkata + place: New Delhi, India + start: 2016-09-23 + end: 2016-09-25 + sub: PY + location: + - title: PyCon India 2016 + latitude: 28.6138954 + longitude: 77.2090057 + +- conference: PyCon India + year: 2015 + link: https://web.archive.org/web/20150924165102/https://in.pycon.org/2015/ + cfp: '2015-05-31 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, India + start: 2015-10-02 + end: 2015-10-04 + sub: PY + location: + - title: PyCon India 2015 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon India + year: 2014 + link: https://web.archive.org/web/20140929035341/http://in.pycon.org/2014/ + cfp: '2014-05-30 23:59:00' + place: Bengaluru, India + start: 2014-09-26 + end: 2014-09-28 + sub: PY + location: + - title: PyCon India 2014 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon India + year: 2013 + link: https://web.archive.org/web/20130831132556/http://in.pycon.org/2013/ + cfp: '2013-07-15 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, India + start: 2013-08-31 + end: 2013-09-01 + sub: PY + location: + - title: PyCon India 2013 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon India + year: 2012 + link: https://web.archive.org/web/20120929035203/http://in.pycon.org/2012/ + cfp: '2012-08-25 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, India + start: 2012-09-28 + end: 2012-09-30 + sub: PY + location: + - title: PyCon India 2012 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon India + year: 2011 + link: https://web.archive.org/web/20110516024058/http://in.pycon.org/2011/ + cfp: '2011-06-30 23:59:00' + timezone: Asia/Kolkata + place: Pune, India + start: 2011-09-16 + end: 2011-09-18 + sub: PY + location: + - title: PyCon India 2011 + latitude: 18.52930005 + longitude: 73.85682537025511 + +- conference: PyCon India + year: 2010 + link: https://web.archive.org/web/20100907191526/http://in.pycon.org/2010/ + cfp: '2010-07-31 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, India + start: 2010-09-26 + end: 2010-09-27 + sub: PY + location: + - title: PyCon India 2010 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon India + year: 2009 + link: https://web.archive.org/web/20090929193324/http://in.pycon.org/2009/ + cfp: '2009-08-01 23:59:00' + timezone: Asia/Kolkata + place: Bengaluru, India + start: 2009-09-26 + end: 2009-09-27 + sub: PY + location: + - title: PyCon India 2009 + latitude: 12.9767936 + longitude: 77.590082 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2018 + link: http://pycon.hk/2018/ + cfp_link: http://bit.ly/2AMNhfZ + cfp: '2018-08-31 23:59:00' + place: Hong Kong, Hong Kong + start: 2018-11-04 + end: 2018-11-05 + sub: PY + location: + - title: PyCon Hong Kong 2018 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2017 + link: https://web.archive.org/web/20171109204310/http://pycon.hk/2017/ + cfp: '2016-08-14 23:59:00' + place: Hong Kong, Hong Kong + start: 2017-11-04 + end: 2017-11-05 + sub: PY + location: + - title: PyCon Hong Kong 2017 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2016 + link: https://web.archive.org/web/20161101213741/http://pycon.hk/2016/ + cfp: '2016-08-14 23:59:00' + place: Hong Kong, Hong Kong + start: 2016-10-29 + end: 2016-10-30 + sub: PY + location: + - title: PyCon Hong Kong 2016 + latitude: 22.2638172 + longitude: 114.125794 + +- conference: PyCon Hong Kong + alt_name: PyCon HK + year: 2015 + link: https://web.archive.org/web/20151025152751/http://2015.pycon.hk/ + cfp: '2015-08-16 23:59:00' + place: Hong Kong, Hong Kong + start: 2015-11-07 + end: 2015-11-08 + sub: PY + location: + - title: PyCon Hong Kong 2015 + latitude: 22.2793278 + longitude: 114.1628131 + +- conference: PyCon Ghana + year: 2018 + link: https://web.archive.org/web/20180818105016/https://gh.pycon.org/ + cfp: '2018-07-10 23:59:00' + place: Accra, Ghana + start: 2018-08-10 + end: 2018-08-11 + sub: PY + location: + - title: PyCon Ghana 2018 + latitude: 5.5571096 + longitude: -0.2012376 + +- conference: PyCon Germany + alt_name: PyCon.DE + year: 2018 + link: https://web.archive.org/web/20180419145724/https://de.pycon.org/ + cfp: '2018-06-03 23:59:59' + timezone: Europe/Berlin + place: Karlsruhe, Germany + start: 2018-10-24 + end: 2018-10-26 + sub: PY + location: + - title: PyCon Germany 2018 + latitude: 49.0068705 + longitude: 8.4034195 + +- conference: PyCon Germany + alt_name: PyCon DE + year: 2017 + link: https://web.archive.org/web/20171030134448/https://de.pycon.org/ + cfp_link: https://web.archive.org/web/20190329183841/https://www.papercall.io/pyconde2017 + cfp: '2017-08-06 23:59:00' + timezone: Europe/Berlin + place: Karlsruhe, Germany + start: 2017-10-25 + end: 2017-10-27 + sub: PY + location: + - title: PyCon Germany 2017 + latitude: 49.0068705 + longitude: 8.4034195 + +- conference: PyCon Germany + alt_name: PyCon.DE + year: 2013 + link: https://web.archive.org/web/20131028065946/http://2013.de.pycon.org/ + cfp: '2013-07-15 23:59:00' + place: Cologne, Germany + start: 2013-10-14 + end: 2013-10-19 + sub: PY + location: + - title: PyCon Germany 2013 + latitude: 50.938361 + longitude: 6.959974 + +- conference: PyCon Germany + alt_name: PyCon DE + year: 2012 + link: https://web.archive.org/web/20121028040216/http://2012.de.pycon.org/ + cfp: '2012-06-15 23:59:00' + place: Leipzig, Germany + start: 2012-10-29 + end: 2012-11-03 + sub: PY + location: + - title: PyCon Germany 2012 + latitude: 51.3406321 + longitude: 12.3747329 + +- conference: PyCon Germany + alt_name: PyCon DE + year: 2011 + link: https://web.archive.org/web/20120728002815/http://2011.de.pycon.org/2011/home/ + cfp: '2011-07-15 23:59:00' + place: Leipzig, Germany + start: 2011-10-04 + end: 2011-10-09 + sub: PY + location: + - title: PyCon Germany 2011 + latitude: 51.3406321 + longitude: 12.3747329 + +- conference: PyCon France + alt_name: PyCon FR + year: 2018 + link: https://web.archive.org/web/20181025183354/http://www.pycon.fr/2018/ + cfp: '2018-06-30 23:59:00' + place: Lille, France + start: 2018-10-04 + end: 2018-10-07 + sub: PY + location: + - title: PyCon France 2018 + latitude: 50.6365654 + longitude: 3.0635282 + +- conference: PyCon France + alt_name: PyCon FR + year: 2017 + link: https://web.archive.org/web/20201106161538/https://www.pycon.fr/2017/ + cfp: '2017-07-31 23:59:00' + place: Toulouse, France + start: 2017-09-21 + end: 2017-09-24 + sub: PY + location: + - title: PyCon France 2017 + latitude: 43.6044622 + longitude: 1.4442469 + +- conference: PyCon France + alt_name: PyCon FR + year: 2016 + link: https://web.archive.org/web/20161025183354/http://www.pycon.fr/2016/ + cfp: '2016-08-03 23:59:00' + place: Rennes, France + start: 2016-10-13 + end: 2016-10-16 + sub: PY + location: + - title: PyCon France 2016 + latitude: 48.1113387 + longitude: -1.6800198 + +- conference: PyCon France + alt_name: PyCon FR + year: 2015 + link: https://web.archive.org/web/20151025183354/http://www.pycon.fr/2015/ + cfp: '2015-07-15 23:59:00' + cfp_ext: '2015-08-09 23:59:00' + place: Pau, France + start: 2015-10-17 + end: 2015-10-20 + sub: PY + location: + - title: PyCon France 2015 + latitude: 43.2957547 + longitude: -0.3685668 + +- conference: PyCon France + alt_name: PyCon FR + year: 2014 + link: https://web.archive.org/web/20141025183354/http://www.pycon.fr/2014/ + cfp: '2014-09-15 23:59:00' + place: Villeurbanne, France + start: 2014-10-25 + end: 2014-10-28 + sub: PY + location: + - title: PyCon France 2014 + latitude: 45.7733573 + longitude: 4.8868454 + +- conference: PyCon France + alt_name: PyCon FR + year: 2013 + link: https://web.archive.org/web/20131027125621/http://www.pycon.fr/2013/ + cfp: '2013-09-15 23:59:00' + place: Strasbourg, France + start: 2013-10-26 + end: 2013-10-30 + sub: PY + location: + - title: PyCon France 2013 + latitude: 48.584614 + longitude: 7.7507127 + +- conference: PyCon France + alt_name: PyCon FR + year: 2012 + link: https://web.archive.org/web/20120919110354/http://www.pycon.fr/2012/ + cfp: '2012-07-15 23:59:00' + place: Paris, France + start: 2012-09-13 + end: 2012-09-16 + sub: PY + location: + - title: PyCon France 2012 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyCon France + alt_name: PyCon FR + year: 2011 + link: https://web.archive.org/web/20231209152547/https://www.pycon.fr/2011/category/conference.html + cfp: '2011-08-01 23:59:00' + place: Paris, France + start: 2011-09-17 + end: 2011-09-18 + sub: PY + location: + - title: PyCon France 2011 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyCon France + alt_name: PyCon FR + year: 2010 + link: https://www.pycon.fr/2010/category/conference.html + cfp: '2010-07-15 23:59:00' + place: Paris, France + start: 2010-08-28 + end: 2010-08-29 + sub: PY + location: + - title: PyCon France 2010 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyCon France + alt_name: PyCon FR + year: 2009 + link: https://web.archive.org/web/20090307100440/http://www.pycon.fr/sessions + cfp: '2009-04-24 23:59:00' + place: Paris, France + start: 2009-05-30 + end: 2009-05-31 + sub: PY + location: + - title: PyCon France 2009 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyCon France + alt_name: PyCon FR + year: 2008 + link: https://web.archive.org/web/20080513070424/http://fr.pycon.org/ + cfp: '2008-03-30 23:59:00' + place: Paris, France + start: 2008-05-17 + end: 2008-05-18 + sub: PY + location: + - title: PyCon France 2008 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: PyCon Finland + alt_name: PyCon FI + year: 2016 + link: https://web.archive.org/web/20161027142114/http://fi.pycon.org/2016/ + cfp: '2016-08-31 23:59:00' + place: Helsinki, Finland + start: 2016-10-31 + end: 2016-10-31 + sub: PY + location: + - title: PyCon Finland 2016 + latitude: 60.161647 + longitude: 24.9066157 + +- conference: PyCon Finland + alt_name: PyCon FI + year: 2015 + link: https://web.archive.org/web/20150924173543/http://fi.pycon.org/2015/ + cfp: '2015-08-16 23:59:00' + place: Helsinki, Finland + start: 2015-10-19 + end: 2015-10-19 + sub: PY + location: + - title: PyCon Finland 2015 + latitude: 60.1674881 + longitude: 24.9427473 + +- conference: PyCon Finland + alt_name: PyCon FI + year: 2014 + link: https://web.archive.org/web/20141028233840/http://fi.pycon.org/2014/ + cfp: '2014-07-31 23:59:00' + place: Helsinki, Finland + start: 2014-10-27 + end: 2014-10-27 + sub: PY + location: + - title: PyCon Finland 2014 + latitude: 60.1674881 + longitude: 24.9427473 + +- conference: PyCon Finland + alt_name: PyCon FI + year: 2013 + link: https://web.archive.org/web/20130724094325/http://fi.pycon.org/ + cfp: '2013-08-01 23:59:00' + place: Otaniemi, Finland + start: 2013-10-21 + end: 2013-10-22 + sub: PY + location: + - title: PyCon Finland 2013 + latitude: 60.1879383 + longitude: 24.8318201 + +- conference: PyCon Finland + alt_name: PyCon FI + year: 2012 + link: https://web.archive.org/web/20121016221615/http://fi.pycon.org/2012/ + cfp: '2012-10-01 23:59:00' + place: Otaniemi, Finland + start: 2012-10-22 + end: 2012-10-24 + sub: PY + location: + - title: PyCon Finland 2012 + latitude: 60.1879383 + longitude: 24.8318201 + +- conference: PyCon Estonia + alt_name: PyCon EE + year: 2018 + link: https://web.archive.org/web/20180905200626/https://pycon.ee/ + cfp: None + place: Tallinn, Estonia + start: 2018-10-04 + end: 2018-10-04 + sub: PY + location: + - title: PyCon Estonia 2018 + latitude: 59.4372155 + longitude: 24.7453688 + +- conference: PyCon Dhaka + year: 2014 + link: https://web.archive.org/web/20140618061134/http://dhaka.pycon.org/ + cfp: None + place: Dhaka, Bangladesh + start: 2014-06-21 + end: 2014-06-21 + sub: PY + location: + - title: PyCon Dhaka 2014 + latitude: 23.7644025 + longitude: 90.389015 + +- conference: PyCon Czechia + alt_name: PyCon CZ + year: 2018 + link: https://web.archive.org/web/20180202200818/https://cz.pycon.org/2018/ + cfp_link: https://web.archive.org/web/20180203120450/https://cz.pycon.org/2018/proposals/ + cfp: '2018-02-28 23:59:00' + cfp_ext: '2018-03-10' + place: Prague, Czechia + start: 2018-06-01 + end: 2018-06-03 + sub: PY + location: + - title: PyCon Czechia 2018 + latitude: 50.0874654 + longitude: 14.4212535 + +- conference: PyCon Czechia + alt_name: PyCon CZ + year: 2017 + link: https://web.archive.org/web/20170502190107/https://cz.pycon.org/2017/ + cfp: '2017-04-17 23:59:00' + place: Prague, Czechia + start: 2017-06-08 + end: 2017-06-10 + sub: PY + location: + - title: PyCon Czechia 2017 + latitude: 50.0874654 + longitude: 14.4212535 + +- conference: PyCon Czechia + alt_name: PyCon CZ + year: 2016 + link: https://web.archive.org/web/20161227174355/https://cz.pycon.org/2016/ + cfp: '2016-09-15 23:59:00' + place: Brno, Czechia + start: 2016-10-28 + end: 2016-10-30 + sub: PY + location: + - title: PyCon Czechia 2016 + latitude: 49.1922443 + longitude: 16.6113382 + +- conference: PyCon Czechia + alt_name: PyCon CZ + year: 2015 + link: http://web.archive.org/web/20150905053606/https://cz.pycon.org/ + cfp: '2015-09-28 23:59:00' + place: Brno, Czechia + start: 2015-11-14 + end: 2015-11-15 + sub: PY + location: + - title: PyCon Czechia 2015 + latitude: 49.1922443 + longitude: 16.6113382 + +- conference: PyCon Colombia + year: 2018 + link: https://web.archive.org/web/20180106003834/https://www.pycon.co/ + cfp: '2018-01-09 23:59:00' + place: Medellin, Colombia + start: 2018-02-09 + end: 2018-02-11 + sub: PY + location: + - title: PyCon Colombia 2018 + latitude: 6.2697018 + longitude: -75.60252574475943 + +- conference: PyCon Colombia + year: 2017 + link: https://web.archive.org/web/20200115024420/https://2017.pycon.co/ + cfp: '2016-12-16 23:59:00' + place: Bogota, Colombia + start: 2017-02-10 + end: 2017-02-11 + sub: PY + location: + - title: PyCon Colombia 2017 + latitude: 4.6529539 + longitude: -74.0835643 + +- conference: PyCon China + year: 2018 + link: https://web.archive.org/web/20180927124755/http://cn.pycon.org/2018/city_hangzhou + cfp: '2018-09-12 23:59:00' + place: Hangzhou, China + start: 2018-11-04 + end: 2018-11-04 + sub: PY + location: + - title: PyCon China 2018 + latitude: 30.2489634 + longitude: 120.2052342 + +- conference: PyCon China + year: 2018 + link: https://web.archive.org/web/20180927124755/http://cn.pycon.org/2018/ + cfp: '2018-09-12 23:59:00' + place: Shenzhen, China + extra_places: + - Chengdu, China + start: 2018-10-27 + end: 2018-10-27 + sub: PY + location: + - title: PyCon China 2018 + latitude: 22.5445741 + longitude: 114.0545429 + - title: PyCon China 2018 + latitude: 30.7001324 + longitude: 104.0708278 + +- conference: PyCon China + year: 2018 + link: https://web.archive.org/web/20180927124755/http://cn.pycon.org/2018/city_shanghai + cfp: '2018-09-12 23:59:00' + place: Shanghai, China + start: 2018-10-21 + end: 2018-10-21 + sub: PY + location: + - title: PyCon China 2018 + latitude: 31.2323437 + longitude: 121.4691024 + +- conference: PyCon China + year: 2018 + link: https://web.archive.org/web/20180927124755/http://cn.pycon.org/2018/city_beijing + cfp: '2018-09-12 23:59:00' + place: Beijing, China + start: 2018-10-14 + end: 2018-10-14 + sub: PY + location: + - title: PyCon China 2018 + latitude: 40.190632 + longitude: 116.412144 + +- conference: PyCon China + year: 2016 + link: https://web.archive.org/web/20160927124755/http://cn.pycon.org/2016/ + cfp: '2016-08-01 23:59:00' + place: Beijing, China + extra_places: + - Hangzhou, China + start: 2016-10-15 + end: 2016-10-15 + sub: PY + location: + - title: PyCon China 2016 + latitude: 40.190632 + longitude: 116.412144 + - title: PyCon China 2016 + latitude: 30.2489634 + longitude: 120.2052342 + +- conference: PyCon China + year: 2016 + link: https://web.archive.org/web/20160927124755/http://cn.pycon.org/2016/shenzhen.html + cfp: '2016-08-01 23:59:00' + place: Shenzhen, China + start: 2016-09-25 + end: 2016-09-25 + sub: PY + location: + - title: PyCon China 2016 + latitude: 22.5445741 + longitude: 114.0545429 + +- conference: PyCon China + year: 2016 + link: https://web.archive.org/web/20160927124755/http://cn.pycon.org/2016/shanghai.html + cfp: '2016-08-01 23:59:00' + place: Shanhai, China + start: 2016-09-10 + end: 2016-09-10 + sub: PY + location: + - title: PyCon China 2016 + latitude: 31.235644899999997 + longitude: 121.50124950125412 + +- conference: PyCon China + year: 2015 + link: https://web.archive.org/web/20160927124755/http://cn.pycon.org/2016/ + cfp: '2015-08-12 23:59:00' + place: Beijing, China + start: 2015-09-19 + end: 2015-09-19 + sub: PY + location: + - title: PyCon China 2015 + latitude: 40.190632 + longitude: 116.412144 + +- conference: PyCon China + year: 2015 + link: https://web.archive.org/web/20160927124755/http://cn.pycon.org/2016/ + cfp: '2015-08-12 23:59:00' + place: Guangzhou, China + start: 2015-09-13 + end: 2015-09-13 + sub: PY + location: + - title: PyCon China 2015 + latitude: 23.1301964 + longitude: 113.2592945 + +- conference: PyCon China + year: 2015 + link: https://web.archive.org/web/20160927124755/http://cn.pycon.org/2016/ + cfp: '2015-08-12 23:59:00' + place: Shanghai, China + start: 2015-09-12 + end: 2015-09-12 + sub: PY + location: + - title: PyCon China 2015 + latitude: 31.2323437 + longitude: 121.4691024 + +- conference: PyCon China + year: 2014 + link: https://web.archive.org/web/20141118174321/http://cn.pycon.org/en/ + cfp: '2014-09-19 23:59:00' + place: Shanhai, China + extra_places: + - Beijing, China + - Zhuhai, China + - Hangzhou, China + - Suzhou, China + start: 2014-11-15 + end: 2014-11-15 + sub: PY + location: + - title: PyCon China 2014 + latitude: 31.235644899999997 + longitude: 121.50124950125412 + - title: PyCon China 2014 + latitude: 40.190632 + longitude: 116.412144 + - title: PyCon China 2014 + latitude: 22.273734 + longitude: 113.5721327 + - title: PyCon China 2014 + latitude: 30.2489634 + longitude: 120.2052342 + - title: PyCon China 2014 + latitude: 31.3016935 + longitude: 120.5810725 + +- conference: PyCon China + year: 2013 + link: https://web.archive.org/web/20131212135355/http://cn.pycon.org/2013 + cfp: '2013-11-01 23:59:00' + place: Beijing, China + start: 2013-12-14 + end: 2013-12-14 + sub: PY + location: + - title: PyCon China 2013 + latitude: 40.190632 + longitude: 116.412144 + +- conference: PyCon China + year: 2013 + link: https://web.archive.org/web/20131212135355/http://cn.pycon.org/2013 + cfp: '2013-11-01 23:59:00' + place: Shanghai, China + extra_places: + - Zhuhai, China + - Hangzhou, China + start: 2013-12-08 + end: 2013-12-08 + sub: PY + location: + - title: PyCon China 2013 + latitude: 31.2323437 + longitude: 121.4691024 + - title: PyCon China 2013 + latitude: 22.273734 + longitude: 113.5721327 + - title: PyCon China 2013 + latitude: 30.2489634 + longitude: 120.2052342 + +- conference: PyCon China + year: 2012 + link: https://web.archive.org/web/20121012230445/https://cn.pycon.org/2012/ + cfp: '2012-10-01 23:59:00' + place: Beijing, China + extra_places: + - Shanghai, China + start: 2012-10-20 + end: 2012-10-20 + sub: PY + location: + - title: PyCon China 2012 + latitude: 40.190632 + longitude: 116.412144 + - title: PyCon China 2012 + latitude: 31.2323437 + longitude: 121.4691024 + +- conference: PyCon China + year: 2011 + link: https://web.archive.org/web/20110927124755/http://cn.pycon.org/2011/ + cfp: '2011-10-01 23:59:00' + place: Shanghai, China + start: 2011-12-03 + end: 2011-12-04 + sub: PY + location: + - title: PyCon China 2011 + latitude: 31.2323437 + longitude: 121.4691024 + +- conference: PyCon Canada + year: 2018 + link: https://web.archive.org/web/20181115030106/https://2018.pycon.ca/ + cfp_link: https://web.archive.org/web/20180731224029/https://www.papercall.io/pyconca2018 + cfp: '2018-09-24 04:09:00' + timezone: UTC + place: Toronto, Canada + start: 2017-11-09 + end: 2017-11-13 + sub: PY + location: + - title: PyCon Canada 2018 + latitude: 43.6534817 + longitude: -79.3839347 + +- conference: PyCon Canada + year: 2017 + link: https://web.archive.org/web/20171020132949/http://pycon.ca/ + cfp_link: https://web.archive.org/web/20170727045809/https://www.papercall.io/pyconca2017 + cfp: '2017-09-10 01:00:00' + timezone: America/Toronto + place: Montreal, Canada + start: 2017-11-18 + end: 2017-11-21 + sub: PY + location: + - title: PyCon Canada 2017 + latitude: 45.5031824 + longitude: -73.5698065 + +- conference: PyCon Canada + year: 2016 + link: https://web.archive.org/web/20161026030925/https://2016.pycon.ca/en/ + cfp: '2016-08-31 23:59:00' + place: Toronto, Canada + start: 2016-11-12 + end: 2016-11-15 + sub: PY + location: + - title: PyCon Canada 2016 + latitude: 43.6534817 + longitude: -79.3839347 + +- conference: PyCon Canada + year: 2015 + link: https://web.archive.org/web/20151124011908/https://2015.pycon.ca/en/ + cfp: '2015-08-14 23:59:00' + timezone: America/Toronto + place: Toronto, Canada + start: 2015-11-07 + end: 2015-11-09 + sub: PY + location: + - title: PyCon Canada 2015 + latitude: 43.6534817 + longitude: -79.3839347 + +- conference: PyCon Canada + year: 2013 + link: https://web.archive.org/web/20130628192543/http://2013.pycon.ca/en/ + cfp_link: https://web.archive.org/web/20140918105106/http://2013.pycon.ca/en/speak/ + cfp: '2013-06-21 23:59:00' + place: Toronto, Canada + start: 2013-08-09 + end: 2013-08-13 + sub: PY + location: + - title: PyCon Canada 2013 + latitude: 43.6534817 + longitude: -79.3839347 + +- conference: PyCon Canada + year: 2012 + link: https://web.archive.org/web/20121020132949/http://pycon.ca/ + cfp: '2012-10-01 23:59:00' + timezone: America/Toronto + place: Toronto, Canada + start: 2012-11-09 + end: 2012-11-11 + sub: PY + location: + - title: PyCon Canada 2012 + latitude: 43.6534817 + longitude: -79.3839347 + +- conference: PyCon Cameroon + year: 2018 + link: https://web.archive.org/web/20180201160312/http://pythoncm.org/pycon.html + cfp: '2017-12-03 23:59:59' + timezone: Africa/Douala + place: Limbe, Cameroon + start: 2018-02-23 + end: 2018-02-24 + sub: PY + location: + - title: PyCon Cameroon 2018 + latitude: 4.010289 + longitude: 9.207058 + +- conference: PyCon Cameroon + year: 2017 + link: https://web.archive.org/web/20171005042303/http://pythoncm.org/ + cfp: None + place: Molyko Buea, Cameroon + start: 2017-01-20 + end: 2017-01-22 + sub: PY + location: + - title: PyCon Cameroon 2017 + latitude: 4.1591154 + longitude: 9.2805172 + +- conference: PyCon Belarus + year: 2018 + link: https://web.archive.org/web/20180223084649/https://by.pycon.org/ + cfp: '2018-01-16 23:59:00' + place: Minsk, Belarus + start: 2018-02-24 + end: 2018-02-25 + sub: PY + location: + - title: PyCon Belarus 2018 + latitude: 53.9024716 + longitude: 27.5618225 + +- conference: PyCon Belarus + year: 2017 + link: https://web.archive.org/web/20170202114714/http://by.pycon.org/ + cfp: None + place: Minsk, Belarus + start: 2017-02-04 + end: 2017-02-04 + sub: PY + location: + - title: PyCon Belarus 2017 + latitude: 53.8901239 + longitude: 27.5693855 + +- conference: PyCon Belarus + year: 2016 + link: https://web.archive.org/web/20160202114714/http://by.pycon.org/ + cfp: None + place: Minsk, Belarus + start: 2016-02-06 + end: 2016-02-06 + sub: PY + location: + - title: PyCon Belarus 2016 + latitude: 53.8901239 + longitude: 27.5693855 + +- conference: PyCon Belarus + year: 2015 + link: https://web.archive.org/web/20150101002522/http://by.pycon.org/ + cfp: None + place: Minsk, Belarus + start: 2015-01-31 + end: 2015-01-31 + sub: PY + location: + - title: PyCon Belarus 2015 + latitude: 53.8901239 + longitude: 27.5693855 + +- conference: PyCon Balkan + year: 2018 + link: https://web.archive.org/web/20181123180557/https://www.pyconbalkan.com/ + cfp_link: https://sessionize.com/pycon-balkan-2018 + cfp: '2018-08-26 23:59:00' + place: Belgrade, Serbia + start: 2018-11-16 + end: 2018-11-18 + sub: PY + location: + - title: PyCon Balkan 2018 + latitude: 44.8178131 + longitude: 20.4568974 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2018 + link: https://web.archive.org/web/20180817031926/https://2018.pycon-au.org/ + cfp: '2018-06-17 23:59:00' + place: Sydney, Australia + start: 2018-08-24 + end: 2018-08-28 + sub: PY + location: + - title: PyCon Australia 2018 + latitude: -33.8751704 + longitude: 151.19974848099355 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2017 + link: https://web.archive.org/web/20171031152126/https://2017.pycon-au.org/ + cfp: '2017-05-07 23:59:00' + place: Melbourne, Australia + start: 2017-08-03 + end: 2017-08-08 + sub: PY + location: + - title: PyCon Australia 2017 + latitude: -37.8142454 + longitude: 144.9631732 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2016 + link: https://web.archive.org/web/20160723033326/https://2016.pycon-au.org/ + cfp: '2016-05-08 23:59:00' + place: Melbourne, Australia + start: 2016-08-12 + end: 2016-08-16 + sub: PY + location: + - title: PyCon Australia 2016 + latitude: -37.8142454 + longitude: 144.9631732 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2015 + link: https://web.archive.org/web/20150502175722/http://2015.pycon-au.org/ + cfp: '2015-05-08 23:59:00' + place: Brisbane, Australia + start: 2015-07-31 + end: 2015-08-04 + sub: PY + location: + - title: PyCon Australia 2015 + latitude: -27.4689682 + longitude: 153.0234991 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2014 + link: https://web.archive.org/web/20140729115454/http://2014.pycon-au.org/ + cfp: '2014-04-25 23:59:00' + place: Brisbane, Australia + start: 2014-08-01 + end: 2014-08-05 + finaid: https://web.archive.org/web/20140628120626/http://2014.pycon-au.org/grants + sub: PY + location: + - title: PyCon Australia 2014 + latitude: -27.4689682 + longitude: 153.0234991 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2013 + link: https://web.archive.org/web/20110211105009/http://2013.pycon-au.org/ + cfp: '2013-04-05 23:59:00' + place: Hobart, Australia + start: 2013-07-05 + end: 2013-07-07 + sub: PY + location: + - title: PyCon Australia 2013 + latitude: -42.8825088 + longitude: 147.3281233 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2012 + link: https://web.archive.org/web/20121016073113/http://2012.pycon-au.org/ + cfp: '2012-05-04 23:59:00' + place: Hobart, Australia + start: 2012-08-18 + end: 2012-08-19 + sub: PY + location: + - title: PyCon Australia 2012 + latitude: -42.8825088 + longitude: 147.3281233 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2011 + link: https://web.archive.org/web/20111106005504/http://pycon-au.org/2011/about/ + cfp: '2011-05-02 23:59:00' + place: Sydney, Australia + start: 2011-08-20 + end: 2011-08-21 + sub: PY + location: + - title: PyCon Australia 2011 + latitude: -33.8751704 + longitude: 151.19974848099355 + +- conference: PyCon Australia + alt_name: PyCon AU + year: 2010 + link: https://web.archive.org/web/20100706022121/http://pycon-au.org:80/2010/about/ + cfp: '2010-04-29 23:59:00' + place: Sydney, Australia + start: 2010-06-26 + end: 2010-06-27 + sub: PY + location: + - title: PyCon Australia 2010 + latitude: -33.8751704 + longitude: 151.19974848099355 + +- conference: PyCon Asia Pacific + alt_name: PyCon Singapore + year: 2018 + link: https://web.archive.org/web/20180425194853/https://pycon.sg/ + cfp: '2018-05-01 23:59:00' + place: Singapore, Singapore + start: 2018-05-31 + end: 2018-06-02 + sub: PY + location: + - title: PyCon Asia Pacific 2018 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Asia Pacific + alt_name: PyCon Malaysia + year: 2017 + link: https://web.archive.org/web/20170822040840/https://pycon.my/ + cfp: '2016-05-31 23:59:00' + place: Kuala Lumpur, Malaysia + start: 2017-08-26 + end: 2017-08-27 + sub: PY + location: + - title: PyCon Asia Pacific 2017 + latitude: 4.5693754 + longitude: 102.2656823 + +- conference: PyCon Asia Pacific + alt_name: PyCon South Korea + year: 2016 + link: https://web.archive.org/web/20160702105007/https://www.pycon.kr/2016apac/ + cfp: '2016-05-31 23:59:00' + place: Seoul, South Korea + start: 2016-08-13 + end: 2016-08-16 + sub: PY + location: + - title: PyCon Asia Pacific 2016 + latitude: 37.5666791 + longitude: 126.9782914 + +- conference: PyCon Asia Pacific + alt_name: PyCon Taiwan + year: 2015 + link: https://web.archive.org/web/20150623171348/http://tw.pycon.org/2015apac/en/ + cfp: '2015-03-31 23:59:00' + place: Taipei, Taiwan + start: 2015-06-05 + end: 2015-06-08 + sub: PY + location: + - title: PyCon Asia Pacific 2015 + latitude: 25.0407021 + longitude: 121.61144927190821 + +- conference: PyCon Asia Pacific + alt_name: PyCon Taiwan + year: 2014 + link: https://web.archive.org/web/20140803024911/https://tw.pycon.org/2014apac/en/ + cfp: '2014-03-10 23:59:00' + place: Taipei, Taiwan + start: 2014-05-17 + end: 2014-05-18 + sub: PY + location: + - title: PyCon Asia Pacific 2014 + latitude: 25.0420743 + longitude: 121.61404600926753 + +- conference: PyCon Asia Pacific + alt_name: PyCon Japan + year: 2013 + link: https://2013-apac.pycon.jp/ + cfp_link: https://web.archive.org/web/20230423225145/https://pretalx.com/pyconapac2023/cfp + cfp: '2013-06-30 23:59:59' + place: Tokyo, Japan + start: 2013-09-13 + end: 2013-09-16 + sub: PY + location: + - title: PyCon Asia Pacific 2013 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: PyCon Asia Pacific + alt_name: PyCon Singapore + year: 2012 + link: https://web.archive.org/web/20120502113302/http://apac.pycon.org/2012/ + cfp: '2012-04-01 23:59:59' + place: Singapore, Singapore + start: 2012-06-07 + end: 2012-06-09 + sub: PY + location: + - title: PyCon Asia Pacific 2012 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Asia Pacific + alt_name: PyCon Singapore + year: 2011 + link: https://web.archive.org/web/20110704080351/http://apac.pycon.org/ + cfp: '2011-04-01 23:59:59' + place: Singapore, Singapore + start: 2011-06-09 + end: 2011-06-11 + sub: PY + location: + - title: PyCon Asia Pacific 2011 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Asia Pacific + alt_name: PyCon Singapore + year: 2010 + link: https://web.archive.org/web/20100324154626/http://apac.pycon.org/ + cfp: '2010-02-28 23:59:59' + place: Singapore, Singapore + start: 2010-06-09 + end: 2010-06-11 + sub: PY + location: + - title: PyCon Asia Pacific 2010 + latitude: 1.2899175 + longitude: 103.8519072 + +- conference: PyCon Argentina + alt_name: PyCon AR + year: 2018 + link: https://web.archive.org/web/20181106165717/https://eventos.python.org.ar/events/pyconar2018/ + cfp: '2018-08-31 23:59:00' + place: Buenos Aires, Argentina + start: 2018-11-22 + end: 2018-11-24 + sub: PY + location: + - title: PyCon Argentina 2018 + latitude: -34.6037181 + longitude: -58.38153 + +- conference: PyCon Argentina + alt_name: PyCon AR + year: 2017 + link: https://web.archive.org/web/20171115211033/http://ar.pycon.org/ + cfp: '2017-08-31 23:59:00' + place: Córdoba, Argentina + start: 2017-11-17 + end: 2017-11-19 + sub: PY + location: + - title: PyCon Argentina 2017 + latitude: -31.4166867 + longitude: -64.1834193 + +- conference: PyCon Argentina + alt_name: PyCon AR + year: 2016 + link: https://web.archive.org/web/20161125141054/http://ar.pycon.org/ + cfp: '2016-08-31 23:59:00' + place: Bahia Blanca, Argentina + start: 2016-11-25 + end: 2016-11-27 + sub: PY + location: + - title: PyCon Argentina 2016 + latitude: -38.7176522 + longitude: -62.2654871 + +- conference: PyCon Argentina + alt_name: PyCon AR + year: 2015 + link: https://web.archive.org/web/20171115211033/http://ar.pycon.org/ + cfp: '2015-08-31 23:59:00' + place: Mendoza, Argentina + start: 2015-11-12 + end: 2015-11-14 + sub: PY + location: + - title: PyCon Argentina 2015 + latitude: -34.787093049999996 + longitude: -68.43818677312292 + +- conference: PyCon Argentina + alt_name: PyCon AR + year: 2012 + link: https://web.archive.org/web/20121029082134/http://ar.pycon.org/2012/default/index + cfp: '2012-07-15 23:59:00' + place: Buenos Aires, Argentina + start: 2012-11-12 + end: 2012-11-17 + sub: PY + location: + - title: PyCon Argentina 2012 + latitude: -34.6037181 + longitude: -58.38153 + +- conference: PyCon Amazônia + year: 2018 + link: https://web.archive.org/web/20190131222152/https://amazonia.python.org.br/ + cfp_link: https://web.archive.org/web/20220902160046/https://speakerfight.com/events/pycon-amazonia-2018/ + cfp: '2018-06-30 23:59:00' + cfp_ext: '2018-07-14 23:55:00' + place: Manaus, Brazil + start: 2018-08-18 + end: 2018-08-19 + sub: PY + location: + - title: PyCon Amazônia 2018 + latitude: -3.1316333 + longitude: -59.9825041 + +- conference: PyCon Amazônia + year: 2017 + link: https://web.archive.org/web/20170816034502/http://amazonia.python.org.br/ + cfp_link: https://speakerfight.com/events/pycon-amazonia-2017/ + cfp: '2016-11-30 12:49:00' + place: Manaus, Brazil + start: 2017-08-12 + end: 2017-08-13 + sub: PY + location: + - title: PyCon Amazônia 2017 + latitude: -3.1316333 + longitude: -59.9825041 + +- conference: PyCode Conference + year: 2018 + link: https://web.archive.org/web/20180801205817/https://pycode-conference.org + cfp_link: https://docs.google.com/forms/d/e/1FAIpQLSfgVrS0YgvM58IEIlcB677SEQfcTy1TB99FeK3nIiGi_5MnVA/viewform + cfp: '2018-07-14 23:59:00' + place: Warsaw, Poland + start: 2018-10-01 + end: 2018-10-02 + sub: PY + location: + - title: PyCode Conference 2018 + latitude: 52.2319581 + longitude: 21.0067249 + +- conference: PyCascades + year: 2018 + link: https://web.archive.org/web/20200812235103/https://2018.pycascades.com/ + cfp_link: https://web.archive.org/web/20170813050314/https://www.papercall.io/pycascades-2018 + cfp: '2017-08-29 12:00:00' + timezone: UTC + place: Vancouver, Canada + start: 2018-01-22 + end: 2018-01-23 + sub: PY + location: + - title: PyCascades 2018 + latitude: 49.27213705 + longitude: -123.13439461006233 + +- conference: PyCaribbean + year: 2018 + link: https://web.archive.org/web/20180211053513/http://pycaribbean.com/ + cfp_link: https://www.papercall.io/pycaribbean-2018 + cfp: '2017-11-24 16:11:00' + place: Santo Domingo, Dominican Republic + start: 2018-02-17 + end: 2018-02-18 + sub: PY + location: + - title: PyCaribbean 2018 + latitude: 18.4801972 + longitude: -69.942111 + +- conference: PyCaribbean + year: 2016 + link: https://web.archive.org/web/20160211053513/http://pycaribbean.com/ + cfp: '2015-11-20 23:59:00' + place: Santo Domingo, Dominican Republic + start: 2016-02-20 + end: 2016-02-21 + sub: PY + location: + - title: PyCaribbean 2016 + latitude: 18.4801972 + longitude: -69.942111 + +- conference: PyCamp Argentina + year: 2018 + link: https://wiki.python.org.ar/PyCamp/2018/ + cfp: None + place: Baradero, Argentina + start: 2018-04-28 + end: 2018-05-01 + sub: CAMP + location: + - title: PyCamp Argentina 2018 + latitude: -33.8120471 + longitude: -59.5051759 + +- conference: PyCamp Argentina + year: 2017 + link: https://wiki.python.org.ar/PyCamp/2017/ + cfp: None + place: Baradero, Argentina + start: 2017-03-24 + end: 2017-03-27 + sub: CAMP + location: + - title: PyCamp Argentina 2017 + latitude: -33.8120471 + longitude: -59.5051759 + +- conference: PyCamp Argentina + year: 2016 + link: https://wiki.python.org.ar/PyCamp/2016/ + cfp: None + place: La Serranita, Argentina + start: 2016-03-24 + end: 2016-03-27 + sub: CAMP + location: + - title: PyCamp Argentina 2016 + latitude: -31.7355415 + longitude: -64.4563994 + +- conference: PyCamp Argentina + year: 2015 + link: https://wiki.python.org.ar/PyCamp/2015/ + cfp: None + place: La Serranita, Argentina + start: 2015-08-14 + end: 2015-08-17 + sub: CAMP + location: + - title: PyCamp Argentina 2015 + latitude: -31.7355415 + longitude: -64.4563994 + +- conference: PyCamp Argentina + year: 2014 + link: https://wiki.python.org.ar/PyCamp/2014/ + cfp: None + place: Villa Giardino, Argentina + start: 2014-03-21 + end: 2014-03-24 + sub: CAMP + location: + - title: PyCamp Argentina 2014 + latitude: -31.0503796 + longitude: -64.4969372 + +- conference: PyCamp Argentina + year: 2013 + link: https://wiki.python.org.ar/PyCamp/2013/ + cfp: None + place: Villa Giardino, Argentina + start: 2013-06-20 + end: 2013-06-23 + sub: CAMP + location: + - title: PyCamp Argentina 2013 + latitude: -31.0503796 + longitude: -64.4969372 + +- conference: PyCamp Argentina + year: 2012 + link: https://wiki.python.org.ar/PyCamp/2012/ + cfp: None + place: Veronica, Argentina + start: 2012-06-06 + end: 2012-06-09 + sub: CAMP + location: + - title: PyCamp Argentina 2012 + latitude: -35.387149 + longitude: -57.3383564 + +- conference: PyCamp Argentina + year: 2011 + link: https://wiki.python.org.ar/PyCamp/2011/ + cfp: None + place: La Falda, Argentina + start: 2011-03-24 + end: 2011-03-27 + sub: CAMP + location: + - title: PyCamp Argentina 2011 + latitude: -31.0946192 + longitude: -64.4829365 + +- conference: PyCamp Argentina + year: 2010 + link: https://wiki.python.org.ar/PyCamp/2010/ + cfp: None + place: Veronica, Argentina + start: 2010-03-05 + end: 2010-03-08 + sub: CAMP + location: + - title: PyCamp Argentina 2010 + latitude: -35.387149 + longitude: -57.3383564 + +- conference: PyCamp Argentina + year: 2009 + link: https://wiki.python.org.ar/PyCamp/2009/ + cfp: None + place: Los Cocos, Argentina + start: 2009-03-21 + end: 2009-03-24 + sub: CAMP + location: + - title: PyCamp Argentina 2009 + latitude: -30.9250882 + longitude: -64.5027028 + +- conference: PyCamp Argentina + year: 2008 + link: https://web.archive.org/web/20081011100546/http://except.com.ar/cgi-bin/pycamp/ + cfp: None + place: Los Cocos, Argentina + start: 2008-03-01 + end: 2008-03-04 + sub: CAMP + location: + - title: PyCamp Argentina 2008 + latitude: -30.9250882 + longitude: -64.5027028 + +- conference: PyBITS + year: 2016 + link: https://web.archive.org/web/20171012110314/http://bits-atmos.org/pybits/ + cfp: '2016-10-16 23:59:00' + place: Hyderabad, India + start: 2016-10-14 + end: 2016-10-16 + sub: PY + location: + - title: PyBITS 2016 + latitude: 17.4454957 + longitude: 78.34854697544472 + +- conference: PyBelgaum + year: 2015 + link: https://web.archive.org/web/20150301185819/http://pybelgaum.org/2015/ + cfp: '2015-02-15 23:59:00' + place: Gogte Institute of Technology, India + start: 2015-02-28 + end: 2015-03-01 + sub: PY + location: + - title: PyBelgaum 2015 + latitude: 15.81527075 + longitude: 74.48744361563915 + +- conference: PyBay + year: 2018 + link: https://web.archive.org/web/20180811130121/http://pybay.com/ + cfp_link: https://web.archive.org/web/20180413152700/http://pybay.com/cfp + cfp: '2018-04-21 23:59:00' + place: San Francisco, USA + start: 2018-08-16 + end: 2018-08-19 + sub: PY + location: + - title: PyBay 2018 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyBay + year: 2017 + link: https://web.archive.org/web/20170811130121/http://pybay.com/ + cfp: '2017-06-16 23:59:00' + place: San Francisco, USA + start: 2017-08-10 + end: 2017-08-13 + sub: PY + location: + - title: PyBay 2017 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: PyBay + year: 2016 + link: https://web.archive.org/web/20160819153259/http://www.pybay.com/ + cfp: '2016-06-24 23:59:00' + place: San Francisco, USA + start: 2016-08-19 + end: 2016-08-21 + sub: PY + location: + - title: PyBay 2016 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: Plone Conference + year: 2018 + link: https://web.archive.org/web/20180928073235/https://2018.ploneconf.org/ + cfp: '2017-09-28 23:59:00' + place: Tokyo, Japan + start: 2018-11-05 + end: 2018-11-11 + sub: WEB + location: + - title: Plone Conference 2018 + latitude: 35.718741949999995 + longitude: 139.73118058112317 + +- conference: Plone Conference + year: 2017 + link: https://web.archive.org/web/20171001015152/https://2017.ploneconf.org/ + cfp: '2016-09-28 23:59:00' + place: Barcelona, Spain + start: 2017-10-16 + end: 2017-10-22 + sub: WEB + location: + - title: Plone Conference 2017 + latitude: 41.3828939 + longitude: 2.1774322 + +- conference: Plone Conference + year: 2016 + link: https://web.archive.org/web/20170409210135/https://2016.ploneconf.org/ + cfp_link: https://plone.org/news-and-events/events/plone-conferences/boston-2016/2016-call-for-proposals + cfp: '2015-09-28 23:59:00' + place: Cambridge, USA + start: 2016-10-17 + end: 2016-10-23 + sub: WEB + location: + - title: Plone Conference 2016 + latitude: 42.3655767 + longitude: -71.1040018 + +- conference: Plone Conference + year: 2015 + link: https://web.archive.org/web/20151013153542/https://2015.ploneconf.org/ + cfp: '2014-09-28 23:59:00' + place: Bucharest, Romania + start: 2015-10-12 + end: 2015-10-18 + sub: WEB + location: + - title: Plone Conference 2015 + latitude: 44.4361414 + longitude: 26.1027202 + +- conference: Plone Conference + year: 2014 + link: https://web.archive.org/web/20140725162938/http://2014.ploneconf.org/ + cfp: '2013-09-22 23:59:00' + place: Bristol, UK + start: 2013-10-27 + end: 2013-11-02 + sub: WEB + location: + - title: Plone Conference 2014 + latitude: 51.4538022 + longitude: -2.5972985 + +- conference: Plone Conference + year: 2013 + link: https://web.archive.org/web/20130208160717/http://www.ploneconf.org/ + cfp: '2012-08-15 23:59:00' + cfp_ext: '2013-08-19' + place: Brasilia, Brazil + start: 2013-09-30 + end: 2013-10-06 + sub: WEB + location: + - title: Plone Conference 2013 + latitude: -10.3333333 + longitude: -53.2 + +- conference: Plone Conference + year: 2012 + link: https://web.archive.org/web/20120923023043/http://www.ploneconf.org/ + cfp: '2012-08-15 23:59:00' + cfp_ext: '2012-08-19 23:59:00' + place: Arnhem, Netherlands + start: 2012-10-08 + end: 2012-10-14 + sub: WEB + location: + - title: Plone Conference 2012 + latitude: 51.984257 + longitude: 5.9108573 + +- conference: Plone Conference + year: 2011 + link: https://web.archive.org/web/20110928073235/https://ploneconf.org/ + cfp: '2011-01-07 23:59:00' + place: San Francisco, USA + start: 2011-11-01 + end: 2011-11-08 + sub: WEB + location: + - title: Plone Conference 2011 + latitude: 37.7681571 + longitude: -122.392929 + +- conference: Plone Conference + year: 2010 + link: https://web.archive.org/web/20130612095356/http://www.ploneconf2010.org/index.html + cfp: '2010-09-10 23:59:00' + place: Bristol, UK + start: 2010-10-25 + end: 2010-10-31 + sub: WEB + location: + - title: Plone Conference 2010 + latitude: 51.4538022 + longitude: -2.5972985 + +- conference: Plone Conference + year: 2009 + link: https://web.archive.org/web/20090719092122/https://www.ploneconf2009.org/ + cfp: '2009-09-06 23:59:00' + place: Budapest, Hungary + start: 2009-10-26 + end: 2009-11-01 + sub: WEB + location: + - title: Plone Conference 2009 + latitude: 47.48138955 + longitude: 19.14609412691246 + +- conference: Plone Conference + year: 2008 + link: https://plone.org/news-and-events/events/plone-conferences/washington-dc-2008 + cfp: '2008-09-06 23:59:00' + place: Washington DC, USA + start: 2008-10-06 + end: 2008-10-12 + sub: WEB + location: + - title: Plone Conference 2008 + latitude: 38.8950368 + longitude: -77.0365427 + +- conference: Plone Conference + year: 2007 + link: https://web.archive.org/web/20230205204543/https://plone.org/news-and-events/events/plone-conferences/naples-2007/2007-naples/plone-conference-2007 + cfp_link: https://web.archive.org/web/20230206193127/https://plone.org/news-and-events/events/plone-conferences/naples-2007/2007-naples/call-for-proposals/call-for-proposals + cfp: '2007-07-27 23:59:00' + place: Naples, Italy + start: 2007-10-08 + end: 2007-10-15 + sub: WEB + location: + - title: Plone Conference 2007 + latitude: 40.8358846 + longitude: 14.2487679 + +- conference: Plone Conference + year: 2006 + link: https://web.archive.org/web/20230129185828/https://plone.org/news-and-events/events/plone-conferences/seattle-2006 + cfp_link: https://web.archive.org/web/20230131140713/https://plone.org/news-and-events/events/plone-conferences/seattle-2006/call-for-proposals/call-for-proposals + cfp: '2006-08-06 23:59:00' + place: Seattle, USA + start: 2006-10-25 + end: 2006-10-27 + sub: WEB + location: + - title: Plone Conference 2006 + latitude: 47.6038321 + longitude: -122.330062 + +- conference: Plone Conference + year: 2005 + link: https://web.archive.org/web/20050810014120/http://ploneconf2005.bluedynamics.net/ + cfp: '2005-08-03 23:59:00' + place: Vienna, Austria + start: 2005-09-19 + end: 2005-09-21 + sub: WEB + location: + - title: Plone Conference 2005 + latitude: 48.2391664 + longitude: 16.3774409 + +- conference: Plone Conference + year: 2004 + link: https://web.archive.org/web/20230129200902/https://plone.org/news-and-events/events/plone-conferences/vienna-2004 + cfp: '2004-08-01 23:59:00' + place: Vienna, Austria + start: 2004-09-20 + end: 2004-09-22 + sub: WEB + location: + - title: Plone Conference 2004 + latitude: 48.2391664 + longitude: 16.3774409 + +- conference: Plone Conference + year: 2003 + link: https://web.archive.org/web/20230610041927/https://plone.org/news-and-events/events/plone-conferences/new-orleans-2003/announcement + cfp: '2003-09-03 23:59:00' + place: New Orleans, USA + start: 2003-10-15 + end: 2003-10-17 + sub: WEB + location: + - title: Plone Conference 2003 + latitude: 29.9759983 + longitude: -90.0782127 + +- conference: Piter Py + alt_name: Piter Py \#5 + year: 2018 + link: https://web.archive.org/web/20180628045535/https://piterpy.com/en + cfp: '2018-06-30 23:59:00' + place: Saint Petersburg, Russia + start: 2018-11-02 + end: 2018-11-04 + sub: PY + location: + - title: Piter Py 2018 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: Piter Py + alt_name: Piter Py \#4 + year: 2017 + link: https://web.archive.org/web/20171209200602/https://it-events.com/events/8527 + cfp: None + place: Crowne Plaza St. Petersburg Airport, 196210 + start: 2017-11-03 + end: 2017-11-04 + sub: PY + location: + - title: Piter Py 2017 + latitude: 59.8060977 + longitude: 30.3162358 + +- conference: Piter Py + alt_name: Piter Py \#3 + year: 2016 + link: https://web.archive.org/web/20160424033322/http://www.it-sobytie.ru/en/events/5862 + cfp: None + place: St. Petersburg, Russia + start: 2016-04-22 + end: 2016-04-23 + sub: PY + location: + - title: Piter Py 2016 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: Piter Py + alt_name: Piter Py \#2 + year: 2015 + link: https://web.archive.org/web/20150424033322/http://www.it-sobytie.ru/events/3275 + cfp: None + place: St. Petersburg, Russia + start: 2015-03-20 + end: 2015-03-20 + sub: PY + location: + - title: Piter Py 2015 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: Piter Py + alt_name: Piter Py \#1 + year: 2014 + link: https://web.archive.org/web/20140424033322/http://www.it-sobytie.ru/en/events/2040 + cfp: None + place: St. Petersburg, Russia + start: 2014-04-25 + end: 2014-04-25 + sub: PY + location: + - title: Piter Py 2014 + latitude: 59.9606739 + longitude: 30.1586551 + +- conference: North Bay Python + year: 2018 + link: https://web.archive.org/web/20180726154915/https://2018.northbaypython.org/ + cfp: '2018-08-10 23:59:00' + place: Petaluma, USA + start: 2018-11-03 + end: 2018-11-04 + sub: PY + location: + - title: North Bay Python 2018 + latitude: 38.2325829 + longitude: -122.636465 + +- conference: North Bay Python + year: 2017 + link: https://web.archive.org/web/20170812223449/http://www.northbaypython.org/ + cfp: '2017-09-29 23:59:00' + place: Petaluma, USA + start: 2017-12-02 + end: 2017-12-03 + sub: PY + location: + - title: North Bay Python 2017 + latitude: 38.2325829 + longitude: -122.636465 + +- conference: MUPy + year: 2018 + link: https://web.archive.org/web/20240218045738/https://pypals.org/mupy + cfp: None + place: Manipal Institute of Technology, India + start: 2018-10-28 + end: 2018-10-28 + sub: PY + location: + - title: MUPy 2018 + latitude: 13.347776849999999 + longitude: 74.79299358008947 + +- conference: MUPy + year: 2017 + link: https://web.archive.org/web/20240218045738/https://pypals.org/mupy + cfp: None + place: Manipal Institute of Technology, India + start: 2017-10-21 + end: 2017-10-23 + sub: PY + location: + - title: MUPy 2017 + latitude: 13.347776849999999 + longitude: 74.79299358008947 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2017 + link: https://web.archive.org/web/20171212164132/https://python.nz/ + cfp: '2017-09-08 23:59:00' + place: Auckland, New Zealand + start: 2017-12-02 + end: 2017-12-03 + sub: PY + location: + - title: Kiwi PyCon 2017 + latitude: -36.5412811 + longitude: 174.5506104914412 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2016 + link: https://web.archive.org/web/20150520215508/http://kiwi.pycon.org/ + cfp: '2018-09-08 23:59:00' + place: Dunedin, New Zealand + start: 2016-09-09 + end: 2016-09-11 + sub: PY + location: + - title: Kiwi PyCon 2016 + latitude: -45.8740984 + longitude: 170.5035755 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2015 + link: https://web.archive.org/web/20151212164132/https://python.nz/ + cfp: '2015-06-22 23:59:00' + place: Christchurch, New Zealand + start: 2015-09-04 + end: 2015-09-06 + sub: PY + location: + - title: Kiwi PyCon 2015 + latitude: -43.530955 + longitude: 172.6364343 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2014 + link: https://web.archive.org/web/20140802025405/http://kiwi.pycon.org/ + cfp: '2014-06-30 23:59:00' + place: Wellington, New Zealand + start: 2014-09-12 + end: 2014-09-14 + sub: PY + location: + - title: Kiwi PyCon 2014 + latitude: -41.2887953 + longitude: 174.7772114 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2013 + link: https://web.archive.org/web/20130901133936/http://nz.pycon.org/ + cfp: '2012-06-01 23:59:00' + place: Auckland, New Zealand + start: 2013-09-06 + end: 2013-09-08 + sub: PY + location: + - title: Kiwi PyCon 2013 + latitude: -36.5412811 + longitude: 174.5506104914412 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2012 + link: https://web.archive.org/web/20121212164132/https://nz.pycon.org/ + cfp: '2012-07-02 23:59:00' + place: Dunedin, New Zealand + start: 2012-09-01 + end: 2012-09-02 + sub: PY + location: + - title: Kiwi PyCon 2012 + latitude: -45.8740984 + longitude: 170.5035755 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2011 + link: https://web.archive.org/web/20110312164132/https://nz.pycon.org/ + cfp: '2011-05-09 23:59:00' + place: Wellington, New Zealand + start: 2011-08-27 + end: 2011-08-28 + sub: PY + location: + - title: Kiwi PyCon 2011 + latitude: -41.2887953 + longitude: 174.7772114 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2010 + link: https://web.archive.org/web/20101023122656/http://nz.pycon.org/ + cfp: '2010-08-02 23:59:00' + place: Waitangi, New Zealand + start: 2010-11-20 + end: 2010-11-21 + sub: PY + location: + - title: Kiwi PyCon 2010 + latitude: -35.2704653 + longitude: 174.0804593 + +- conference: Kiwi PyCon + alt_name: PyCon NZ + year: 2009 + link: https://web.archive.org/web/20090312164132/https://nz.pycon.org/ + cfp: '2009-08-12 23:59:00' + place: Christchurch, New Zealand + start: 2009-11-07 + end: 2009-11-08 + sub: PY + location: + - title: Kiwi PyCon 2009 + latitude: -43.530955 + longitude: 172.6364343 + +- conference: JupyterCon + year: 2018 + link: https://web.archive.org/web/20200814084231/https://conferences.oreilly.com/jupyter/jup-ny.html + cfp: '2018-03-06 23:59:00' + place: New York, USA + start: 2018-08-21 + end: 2018-08-24 + twitter: jupyterCon + sub: DATA + location: + - title: JupyterCon 2018 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: JupyterCon + year: 2017 + link: https://web.archive.org/web/20170821152555/https://conferences.oreilly.com/jupyter/jup-ny + cfp: '2017-03-06 23:59:00' + place: New York, USA + start: 2017-08-22 + end: 2017-08-25 + twitter: jupyterCon + sub: DATA + location: + - title: JupyterCon 2017 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: GeoPython + year: 2018 + link: https://web.archive.org/web/20180512191459/http://2018.geopython.net/ + cfp: '2018-01-31 23:59:00' + place: Basel, Switzerland + start: 2018-05-07 + end: 2018-05-09 + sub: GEO + location: + - title: GeoPython 2018 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: GeoPython + year: 2017 + link: https://web.archive.org/web/20170521201837/http://2017.geopython.net/ + cfp: '2017-02-15 23:59:00' + place: Basel, Switzerland + start: 2017-05-08 + end: 2017-05-10 + sub: GEO + location: + - title: GeoPython 2017 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: GeoPython + year: 2016 + link: https://web.archive.org/web/20160416025408/http://www.geopython.net/ + cfp: '2016-02-15 23:59:00' + place: Basel, Switzerland + start: 2016-06-22 + end: 2016-06-24 + sub: GEO + location: + - title: GeoPython 2016 + latitude: 47.3615882 + longitude: 7.354445 + +- conference: FOSDEM + alt_name: Python Main Track @ FOSDEM + year: 2018 + link: https://web.archive.org/web/20180203132931/https://fosdem.org/2018/schedule/track/python/ + cfp: '2018-11-03 23:59:00' + place: Brussels, Belgium + start: 2018-02-03 + end: 2018-02-03 + sub: PY + location: + - title: FOSDEM 2018 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2017 + link: https://web.archive.org/web/20170204031111/https://fosdem.org/2017/schedule/track/python/ + cfp: '2016-12-02 23:59:00' + place: Brussels, Belgium + start: 2017-02-04 + end: 2017-02-05 + sub: PY + location: + - title: FOSDEM 2017 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2016 + link: https://web.archive.org/web/20160329031714/https://fosdem.org/2016/schedule/track/python/ + cfp: '2015-12-11 23:59:00' + cfp_ext: '2015-12-20 23:59:00' + place: Brussels, Belgium + start: 2016-01-30 + end: 2016-01-30 + sub: PY + location: + - title: FOSDEM 2016 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2015 + link: https://web.archive.org/web/20150326165206/https://fosdem.org/2015/schedule/track/python/ + cfp: '2014-12-01 23:59:00' + place: Brussels, Belgium + start: 2015-01-31 + end: 2015-01-31 + sub: PY + location: + - title: FOSDEM 2015 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: FOSDEM + alt_name: Python @ FOSDEM + year: 2014 + link: https://web.archive.org/web/20140208210710/http://python-fosdem.org/schedule + cfp: '2013-12-31 23:59:00' + place: Brussels, Belgium + start: 2014-02-02 + end: 2014-02-02 + sub: PY + location: + - title: FOSDEM 2014 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: FOSDEM + alt_name: Python Devroom @ FOSDEM + year: 2013 + link: https://web.archive.org/web/20130216000502/https://fosdem.org/2013/ + cfp: '2012-12-21 23:59:00' + place: Brussels, Belgium + start: 2013-02-03 + end: 2013-02-03 + sub: PY + location: + - title: FOSDEM 2013 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: For Python Quants + year: 2015 + link: https://web.archive.org/web/20140305213641/http://www.forpythonquants.com/ + cfp: None + place: New York, USA + start: 2014-03-14 + end: 2014-03-14 + sub: PY + location: + - title: For Python Quants 2015 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: For Python Quants + year: 2014 + link: https://web.archive.org/web/20140305213641/http://www.forpythonquants.com/ + cfp: None + place: New York, USA + start: 2014-03-14 + end: 2014-03-14 + sub: PY + location: + - title: For Python Quants 2014 + latitude: 40.7127281 + longitude: -74.0060152 + +- conference: Flask Conf Brasil + year: 2018 + link: https://web.archive.org/web/20180927205052/https://2018.flask.python.org.br/ + cfp_link: https://web.archive.org/web/20210515223939/https://speakerfight.com/events/flaskconf-2018/ + cfp: '2018-08-01 23:59:00' + place: São Paulo, Brazil + start: 2018-08-24 + end: 2018-08-25 + sub: WEB + location: + - title: Flask Conf 2018 + latitude: -1.2043218 + longitude: -47.1583944 + +- conference: FEniCS + year: 2018 + link: https://web.archive.org/web/20190105092411/https://fenicsproject.org/fenics18/ + cfp: '2018-02-14 23:59:00' + cfp_ext: '2018-02-21 23:59:00' + place: Oxford, UK + start: 2018-03-21 + end: 2018-03-23 + sub: DATA + location: + - title: FEniCS 2018 + latitude: 51.7520131 + longitude: -1.2578499 + +- conference: FEniCS + year: 2017 + link: https://fenicsproject.org/fenics17/ + cfp: '2017-04-26 23:59:00' + place: Luxembourg, Luxembourg + start: 2017-06-12 + end: 2017-06-14 + sub: DATA + location: + - title: FEniCS 2017 + latitude: 49.6112768 + longitude: 6.129799 + +- conference: EuroSciPy + year: 2018 + link: https://web.archive.org/web/20180831055351/https://www.euroscipy.org/2018/ + cfp: '2018-05-31 23:59:00' + timezone: Europe/Rome + place: Trento, Italy + start: 2018-08-28 + end: 2018-09-01 + sub: SCIPY + location: + - title: EuroSciPy 2018 + latitude: 46.0664228 + longitude: 11.1257601 + +- conference: EuroSciPy + year: 2017 + link: https://web.archive.org/web/20170828124453/https://www.euroscipy.org/2017/ + cfp: '2017-06-24 00:00:00' + cfp_ext: '2017-07-02 00:00:00' + place: Erlangen, Germany + start: 2017-08-28 + end: 2017-09-01 + sub: SCIPY + location: + - title: EuroSciPy 2017 + latitude: 49.5928616 + longitude: 11.0056 + +- conference: EuroSciPy + year: 2016 + link: https://web.archive.org/web/20160405221156/https://www.euroscipy.org/2016/ + cfp: '2016-06-24 23:59:00' + timezone: Europe/Berlin + place: Erlangen, Germany + start: 2016-08-23 + end: 2016-08-27 + sub: SCIPY + location: + - title: EuroSciPy 2016 + latitude: 49.5928616 + longitude: 11.0056 + +- conference: EuroSciPy + year: 2015 + link: https://web.archive.org/web/20150705054736/https://www.euroscipy.org/2015/ + cfp: '2015-04-30 23:59:00' + cfp_ext: '2015-05-15 23:59:00' + place: Cambridge, UK + start: 2015-08-26 + end: 2015-08-30 + sub: SCIPY + location: + - title: EuroSciPy 2015 + latitude: 52.2055314 + longitude: 0.1186637 + +- conference: EuroSciPy + year: 2013 + link: https://web.archive.org/web/20130523143818/https://www.euroscipy.org/ + cfp: '2013-04-28 00:00:00' + cfp_ext: '2013-05-05 23:59:59' + place: Brussels, Belgium + start: 2013-08-21 + end: 2013-08-24 + sub: SCIPY + location: + - title: EuroSciPy 2013 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: EuroSciPy + year: 2012 + link: https://web.archive.org/web/20120523143818/https://www.euroscipy.org/ + cfp: '2012-05-06 00:00:00' + place: Brussels, Belgium + start: 2012-08-23 + end: 2012-08-27 + sub: SCIPY + location: + - title: EuroSciPy 2012 + latitude: 50.8465573 + longitude: 4.351697 + +- conference: EuroSciPy + year: 2011 + link: https://web.archive.org/web/20110523143818/https://www.euroscipy.org/ + cfp: '2011-05-08 00:00:00' + place: Paris, France + start: 2011-08-25 + end: 2011-08-28 + sub: SCIPY + location: + - title: EuroSciPy 2011 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: EuroSciPy + year: 2010 + link: https://web.archive.org/web/20100523143818/https://www.euroscipy.org/ + cfp: '2010-05-09 00:00:00' + place: Paris, France + start: 2010-07-08 + end: 2010-07-11 + sub: SCIPY + location: + - title: EuroSciPy 2010 + latitude: 48.8588897 + longitude: 2.3200410217200766 + +- conference: EuroSciPy + year: 2009 + link: https://web.archive.org/web/20090523143818/https://www.euroscipy.org/ + cfp: '2009-04-30 00:00:00' + place: Leipzig, Germany + start: 2009-07-25 + end: 2009-07-26 + sub: SCIPY + location: + - title: EuroSciPy 2009 + latitude: 51.3406321 + longitude: 12.3747329 + +- conference: EuroSciPy + year: 2008 + link: https://web.archive.org/web/20190909080804/http://scipy.github.io/old-wiki/pages/EuroSciPy2008.html + cfp: '2008-04-30 23:59:00' + place: Leipzig, Germany + start: 2008-07-26 + end: 2008-07-27 + sub: SCIPY + location: + - title: EuroSciPy 2008 + latitude: 51.3406321 + longitude: 12.3747329 + +- conference: EuroPython + year: 2018 + link: https://web.archive.org/web/20180728144400/https://ep2018.europython.eu/en/ + cfp: '2018-05-20 23:59:00' + timezone: Europe/London + place: Edinburgh, UK + start: 2018-07-23 + end: 2018-07-29 + sub: PY + location: + - title: EuroPython 2018 + latitude: 55.9533456 + longitude: -3.1883749 + +- conference: EuroPython + year: 2017 + link: https://web.archive.org/web/20170316094425/http://ep2017.europython.eu/ + cfp: '2017-04-16 23:59:00' + cfp_ext: '2017-04-23 23:59:00' + place: Rimini, Italy + start: 2017-07-09 + end: 2017-07-16 + sub: PY + location: + - title: EuroPython 2017 + latitude: 43.946503899999996 + longitude: 12.631031715742981 + +- conference: EuroPython + year: 2016 + link: https://web.archive.org/web/20160129180633/http://ep2016.europython.eu/ + cfp: '2016-03-06 23:59:59' + timezone: Europe/Madrid + place: ECC, Spain + start: 2016-07-17 + end: 2016-07-24 + sub: PY + location: + - title: EuroPython 2016 + latitude: 43.3913468 + longitude: -3.7526930295 + +- conference: EuroPython + year: 2015 + link: https://web.archive.org/web/20150224103848/http://ep2015.europython.eu/ + cfp_link: https://web.archive.org/web/20150418023146/https://ep2015.europython.eu/en/call-for-proposals/ + cfp: '2015-04-28 23:59:59' + timezone: Europe/Madrid + place: Bilbao, Spain + start: 2015-07-20 + end: 2015-07-27 + sub: PY + location: + - title: EuroPython 2015 + latitude: 43.2630018 + longitude: -2.9350039 + +- conference: EuroPython + year: 2014 + link: https://web.archive.org/web/20140706142751/https://ep2014.europython.eu/en/ + cfp: '2014-06-14 23:59:00' + timezone: Europe/Berlin + place: Berlin, Germany + start: 2014-07-21 + end: 2014-07-27 + sub: PY + location: + - title: EuroPython 2014 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: EuroPython + year: 2013 + link: https://web.archive.org/web/20130603032549/https://ep2013.europython.eu/ + cfp: '2013-03-05 23:59:59' + timezone: Europe/Rome + place: Florence, Italy + start: 2013-07-01 + end: 2013-07-07 + sub: PY + location: + - title: EuroPython 2013 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: EuroPython + year: 2012 + link: https://web.archive.org/web/20120724122915/https://ep2012.europython.eu/ + cfp: '2012-03-18 23:59:59' + cfp_ext: '2012-03-21 23:59:59' + timezone: Europe/Rome + place: Florence, Italy + start: 2012-07-02 + end: 2012-07-08 + sub: PY + location: + - title: EuroPython 2012 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: EuroPython + year: 2011 + link: https://web.archive.org/web/20110626073356/http://ep2011.europython.eu/ + cfp: '2011-04-06 23:59:59' + timezone: Europe/Rome + place: Florence, Italy + start: 2011-06-20 + end: 2011-06-26 + sub: PY + location: + - title: EuroPython 2011 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: EuroPython + year: 2010 + link: https://web.archive.org/web/20110414144119/http://ep2010.europython.eu/ + cfp: '2010-04-30 23:59:59' + timezone: Europe/London + place: Birmingham, UK + start: 2010-07-17 + end: 2010-07-22 + sub: PY + location: + - title: EuroPython 2010 + latitude: 52.4796992 + longitude: -1.9026911 + +- conference: EuroPython + year: 2009 + link: https://web.archive.org/web/20100429204959/http://ep2009.europython.eu/ + cfp: '2009-04-05 23:59:59' + timezone: Europe/London + place: Birmingham, UK + start: 2009-06-29 + end: 2009-07-04 + sub: PY + location: + - title: EuroPython 2009 + latitude: 52.4796992 + longitude: -1.9026911 + +- conference: EuroPython + year: 2008 + link: https://web.archive.org/web/20080706103533/http://www.europython.org/ + cfp: '2008-05-22 23:59:59' + timezone: Europe/Vilnius + place: Vilnius, Lithuania + start: 2008-07-07 + end: 2008-07-12 + sub: PY + location: + - title: EuroPython 2008 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: EuroPython + year: 2007 + link: https://web.archive.org/web/20070709123745/http://www.europython.org/ + cfp: '2007-05-18 23:59:59' + timezone: Europe/Vilnius + place: Vilnius, Lithuania + start: 2007-07-09 + end: 2007-07-14 + sub: PY + location: + - title: EuroPython 2007 + latitude: 54.6870458 + longitude: 25.2829111 + +- conference: EuroPython + year: 2006 + link: https://web.archive.org/web/20060701045949/http://www.europython.org/ + cfp: '2006-06-02 23:59:59' + timezone: Europe/Zurich + place: Geneva, Switzerland + start: 2006-07-03 + end: 2006-07-05 + sub: PY + location: + - title: EuroPython 2006 + latitude: 46.2047169 + longitude: 6.1423106290939335 + +- conference: EuroPython + year: 2005 + link: https://web.archive.org/web/20050829082959/http://www.europython.org/ + cfp: '2005-05-01 23:59:59' + timezone: Europe/Stockholm + place: Gothenburg, Sweden + start: 2005-06-27 + end: 2005-07-03 + sub: PY + location: + - title: EuroPython 2005 + latitude: 57.7072326 + longitude: 11.9670171 + +- conference: EuroPython + year: 2004 + link: https://web.archive.org/web/20040623210324/http://www.europython.org:80/ + cfp: '2004-04-15 23:59:59' + timezone: Europe/Stockholm + place: Gothenburg, Sweden + start: 2004-07-07 + end: 2004-07-11 + sub: PY + location: + - title: EuroPython 2004 + latitude: 57.7072326 + longitude: 11.9670171 + +- conference: EuroPython + year: 2003 + link: https://web.archive.org/web/20030804085245/http://www.europython.org/ + cfp: '2003-04-21 23:59:59' + timezone: Europe/Brussels + place: Charleroi, Belgium + start: 2003-06-25 + end: 2003-06-27 + sub: PY + location: + - title: EuroPython 2003 + latitude: 50.4116233 + longitude: 4.444528 + +- conference: EuroPython + year: 2002 + link: https://web.archive.org/web/20020802042807/http://www.europython.org/ + cfp: '2002-04-11 23:59:59' + timezone: Europe/Brussels + place: Charleroi, Belgium + start: 2002-06-26 + end: 2002-06-28 + sub: PY + location: + - title: EuroPython 2002 + latitude: 50.4116233 + longitude: 4.444528 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2018 + link: https://web.archive.org/web/20180519122250/http://rencontres.django-fr.org/2018/ + cfp: '2018-08-23 23:59:00' + place: Lille, France + start: 2018-06-08 + end: 2018-06-10 + sub: WEB + location: + - title: DjangoCong 2018 + latitude: 50.6365654 + longitude: 3.0635282 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2017 + link: https://web.archive.org/web/20170722083141/http://rencontres.django-fr.org/2017/ + cfp: '2017-01-15 23:59:00' + place: Toulon, France + start: 2017-03-31 + end: 2017-04-02 + sub: WEB + location: + - title: Rencontres django 2017 + latitude: 43.1257311 + longitude: 5.9304919 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2016 + link: https://web.archive.org/web/20160521010456/http://rencontres.django-fr.org/2016/ + cfp: '2016-03-31 23:59:00' + place: Rennes, France + start: 2016-05-21 + end: 2016-05-21 + sub: WEB + location: + - title: DjangoCong 2016 + latitude: 48.1113387 + longitude: -1.6800198 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2015 + link: http://rencontres.django-fr.org/2015/ + cfp: '2015-05-31 23:59:00' + place: Clermont-Ferrand, France + start: 2015-05-08 + end: 2015-05-10 + sub: WEB + location: + - title: DjangoCong 2015 + latitude: 45.7774551 + longitude: 3.0819427 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2013 + link: https://web.archive.org/web/20130901115122/http://rencontres.django-fr.org/2013/ + cfp: '2013-05-31 23:59:00' + place: Belfort, France + start: 2013-09-28 + end: 2013-09-29 + sub: WEB + location: + - title: DjangoCong 2013 + latitude: 47.6379599 + longitude: 6.8628942 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2012 + link: https://web.archive.org/web/20120510235350/http://rencontres.django-fr.org/2012/ + cfp: '2012-08-31 23:59:00' + place: Montpellier, France + start: 2012-04-14 + end: 2012-04-15 + sub: WEB + location: + - title: DjangoCong 2012 + latitude: 43.6112422 + longitude: 3.8767337 + +- conference: DjangoCong + alt_name: Rencontres django + year: 2011 + link: https://web.archive.org/web/20110502103928/http://rencontres.django-fr.org/2011/ + cfp: '2011-03-31 23:59:00' + place: Marseille, France + start: 2011-04-16 + end: 2011-04-17 + sub: WEB + location: + - title: DjangoCong 2011 + latitude: 43.2961743 + longitude: 5.3699525 + +- conference: DjangoCon US + year: 2018 + link: https://web.archive.org/web/20180912163411/https://2018.djangocon.us/ + cfp: '2018-06-03 23:59:00' + place: San Diego, USA + start: 2018-10-14 + end: 2018-10-19 + sub: WEB + location: + - title: DjangoCon US 2018 + latitude: 32.7174202 + longitude: -117.1627728 + +- conference: DjangoCon US + year: 2017 + link: https://web.archive.org/web/20170723003650/https://2017.djangocon.us/ + cfp: '2017-04-10 23:59:00' + place: Spokane, USA + start: 2017-08-13 + end: 2017-08-18 + sub: WEB + location: + - title: DjangoCon US 2017 + latitude: 47.6571934 + longitude: -117.42351 + +- conference: DjangoCon US + year: 2015 + link: https://web.archive.org/web/20150906032808/https://2015.djangocon.us/ + cfp: '2015-05-15 23:59:00' + place: Austin, USA + start: 2015-09-06 + end: 2015-09-11 + sub: WEB + location: + - title: DjangoCon US 2015 + latitude: 30.2711286 + longitude: -97.7436995 + +- conference: DjangoCon US + year: 2014 + link: https://web.archive.org/web/20140607062955/http://www.djangocon.us/ + cfp: '2014-06-28 23:59:00' + place: Chicago, USA + start: 2014-08-30 + end: 2014-09-06 + sub: WEB + location: + - title: DjangoCon US 2014 + latitude: 41.8755616 + longitude: -87.6244212 + +- conference: DjangoCon US + year: 2013 + link: https://web.archive.org/web/20130608004141/http://www.djangocon.us/ + cfp: '2013-06-18 23:59:00' + place: Chicago, USA + start: 2013-09-02 + end: 2013-09-07 + sub: WEB + location: + - title: DjangoCon US 2013 + latitude: 41.8755616 + longitude: -87.6244212 + +- conference: DjangoCon US + year: 2012 + link: https://web.archive.org/web/20120508100008/http://2012.djangocon.us/ + cfp: '2012-06-16 23:59:00' + place: Washington, USA + start: 2012-08-03 + end: 2012-08-08 + sub: WEB + location: + - title: DjangoCon US 2012 + latitude: 47.0365017 + longitude: -122.9047626 + +- conference: DjangoCon US + year: 2011 + link: https://web.archive.org/web/20110508100008/http://2011.djangocon.us/ + cfp: '2011-07-05 23:59:00' + place: Portland, USA + start: 2011-09-06 + end: 2011-09-10 + sub: WEB + location: + - title: DjangoCon US 2011 + latitude: 45.5202471 + longitude: -122.674194 + +- conference: DjangoCon US + year: 2010 + link: https://web.archive.org/web/20240329123130/https://2010.djangocon.us/ + cfp: '2010-07-10 23:59:00' + place: Portland, USA + start: 2010-09-07 + end: 2010-09-09 + sub: WEB + location: + - title: DjangoCon US 2010 + latitude: 45.5202471 + longitude: -122.674194 + +- conference: DjangoCon US + year: 2009 + link: https://web.archive.org/web/20240329123101/https://2009.djangocon.us/ + cfp: '2009-08-07 23:59:00' + place: Portland, USA + start: 2009-09-08 + end: 2009-09-12 + sub: WEB + location: + - title: DjangoCon US 2009 + latitude: 45.5202471 + longitude: -122.674194 + +- conference: DjangoCon US + year: 2008 + link: https://web.archive.org/web/20180325231945/https://2008.djangocon.us/ + cfp: None + place: Mountain View, USA + start: 2008-09-06 + end: 2008-09-07 + sub: WEB + location: + - title: DjangoCon US 2008 + latitude: 37.3893889 + longitude: -122.0832101 + +- conference: DjangoCon Toulouse + alt_name: DjangoCong + year: 2012 + link: https://web.archive.org/web/20121109120455/http://rencontres.django-fr.org/2012/ + cfp: '2012-08-23 23:59:00' + place: Toulouse, France + start: 2012-11-24 + end: 2012-11-25 + sub: WEB + location: + - title: DjangoCong Toulouse 2012 + latitude: 43.6044622 + longitude: 1.4442469 + +- conference: DjangoCon Europe + year: 2018 + link: https://web.archive.org/web/20180522135722/https://2018.djangocon.eu/ + cfp: '2018-02-01 23:59:00' + place: Heidelberg, Germany + start: 2018-05-23 + end: 2018-05-27 + sub: WEB + location: + - title: DjangoCon Europe 2018 + latitude: 49.4093582 + longitude: 8.694724 + +- conference: DjangoCon Europe + year: 2017 + link: https://web.archive.org/web/20201108120856/https://2017.djangocon.eu/auth/login/ + cfp: '2016-12-31 23:59:00' + place: Florence, Italy + start: 2017-04-03 + end: 2017-04-07 + sub: WEB + location: + - title: DjangoCon Europe 2017 + latitude: 40.038064 + longitude: 18.4633105 + +- conference: DjangoCon Europe + year: 2015 + link: https://web.archive.org/web/20150621212217/http://2015.djangocon.eu/ + cfp: '2015-03-18 23:59:00' + place: Cardiff, UK + start: 2015-05-31 + end: 2015-06-05 + sub: WEB + location: + - title: DjangoCon Europe 2015 + latitude: 51.4816546 + longitude: -3.1791934 + +- conference: DjangoCon Europe + year: 2014 + link: https://web.archive.org/web/20140523035244/http://2014.djangocon.eu/ + cfp_link: https://web.archive.org/web/20140127011356/http://2014.djangocon.eu:80/call-for-papers + cfp: '2014-02-01 23:59:00' + place: Var, France + start: 2014-05-13 + end: 2014-05-17 + sub: WEB + location: + - title: DjangoCon Europe 2014 + latitude: 43.41736025 + longitude: 6.266461588013931 + +- conference: DjangoCon Europe + year: 2013 + link: https://web.archive.org/web/20130508100008/http://2013.djangocon.eu/ + cfp: '2013-01-08 23:59:00' + place: Warsaw, Poland + start: 2013-05-15 + end: 2013-05-19 + sub: WEB + location: + - title: DjangoCon Europe 2013 + latitude: 52.2319581 + longitude: 21.0067249 + +- conference: DjangoCon Europe + year: 2012 + link: https://web.archive.org/web/20120508100008/http://2012.djangocon.eu/ + cfp: '2012-04-15 23:59:00' + place: Zurich, Switzerland + start: 2012-06-04 + end: 2012-06-08 + sub: WEB + location: + - title: DjangoCon Europe 2012 + latitude: 47.3744489 + longitude: 8.5410422 + +- conference: DjangoCon Europe + year: 2011 + link: https://web.archive.org/web/20110508100008/http://2011.djangocon.eu/ + cfp: '2011-04-15 23:59:00' + place: Amsterdam, Netherlands + start: 2011-06-06 + end: 2011-06-10 + sub: WEB + location: + - title: DjangoCon Europe 2011 + latitude: 52.4111289 + longitude: 4.877231604293446 + +- conference: DjangoCon Europe + year: 2010 + link: https://web.archive.org/web/20110530024806/http://2010.djangocon.eu/ + cfp: '2010-04-15 23:59:00' + place: Berlin, Germany + start: 2010-05-04 + end: 2010-05-08 + sub: WEB + location: + - title: DjangoCon Europe 2010 + latitude: 52.5170365 + longitude: 13.3888599 + +- conference: DjangoCon Australia + alt_name: DjangoCon AU + year: 2018 + link: https://web.archive.org/web/20180508100008/https://2018.djangocon.com.au/ + cfp: '2018-05-28 23:59:00' + place: Sydney, Australia + start: 2018-08-24 + end: 2018-08-28 + sub: WEB + location: + - title: DjangoCon Australia 2018 + latitude: -33.8751704 + longitude: 151.19974848099355 + +- conference: DjangoCon Australia + alt_name: DjangoCon AU + year: 2017 + link: https://web.archive.org/web/20170508100008/https://2017.djangocon.com.au/ + cfp: '2017-05-07 23:59:00' + place: Melbourne, Australia + start: 2017-08-04 + end: 2017-08-08 + sub: WEB + location: + - title: DjangoCon Australia 2017 + latitude: -37.8142454 + longitude: 144.9631732 diff --git a/_data/types.yml b/_data/types.yml index f2a1c8c6b36..54d141b126d 100644 --- a/_data/types.yml +++ b/_data/types.yml @@ -1,3 +1,4 @@ +--- - name: General Python sub: PY color: "#4B8BBE" @@ -5,8 +6,20 @@ sub: SCIPY color: "#70163C" - name: Python for Data - sub: PYDATA - color: "#849324" + sub: DATA + color: "#341f97" - name: Python for Web sub: WEB - color: "#0D0A0B" + color: "#ee5253" +- name: Python for Business + sub: BIZ + color: "#ff9f43" +- name: Python for Earth + sub: GEO + color: "#310c0c" +- name: Python Camps + sub: CAMP + color: "#511868" +- name: Python Day + sub: DAY + color: "#10ac84" diff --git a/_i18n/de.yml b/_i18n/de.yml new file mode 100644 index 00000000000..1b3e1a174e6 --- /dev/null +++ b/_i18n/de.yml @@ -0,0 +1,240 @@ +--- +global: + current: 'de' + choose: 'Wähle Sprache' + sub_filter: 'Filter nach Unterkategorie:' + cfp: 'Aufruf zur Teilnahme' + cfp_ext: 'CfP verlängert von' + subscribe: 'Abonnieren' +titles: + default: 'Deadlines für Python-Konferenzen' + archive: 'Archiv für Python-Konferenzen' + visit_archive: 'Archiv besuchen' + calendar: 'Kalender für Python-Konferenzen' + map: 'Karte für Python-Konferenzen' + a404: 'Seite nicht gefunden' + privacy: 'Datenschutz' + resources: 'Ressourcen für die Erstellung von CfPs' + series: 'Liste von Python-Eventserien' + impressum: 'Impressum' + past_events: 'Vergangene Konferenzen' + past_cfps: 'Vergangene CfPs' + search: 'Suche' + about: 'Über Python-Konferenz-Deadlines' + languages: 'Verfügbare Sprachen' + formatter: 'Formatierungs-App' +buttons: + ical: Lade iCal runter + google: Zu Google Kalender hinzufügen + github: Konferenz auf GitHub einreichen + all_selected: Alle Konferenzen ausgewählt + none_selected: Keine Konferenz ausgewählt +description: + summary: 'Python Konferenz und ihre Instanzen im Laufe der Jahre.' +header: + countdown: 'Countdowns' + calendar: 'Kalender' + maps: 'Karte' + series: 'Eventserien' + resources: 'Ressourcen' + formatter: 'Formatierungs-App' + course: 'E-Mail-Kurs' + articles: 'Erste Schritte' +conference: + title: 'Konferenz Deadlines' + finaid: 'Finanzielle Unterstützung' + sponsor: 'Sponsoringmöglichkeiten' + all: 'Alle Konferenzen für' + download_dl: 'Download der Konferenzdeadline' + download_date: 'Download der Konferenzdaten' + deadline_tz_theirs: 'Deadline in der Zeitzone der Konferenz' + deadline_tz_local: "Deadline in lokaler Zeitzone" +summary: + title: 'Konferenzübersicht' +subs: + PY: 'Python allgemein' + SCIPY: 'Wissenschaftliches Python' + DATA: 'Python für Daten' + WEB: 'Python für Web' + BIZ: 'Python für Unternehmer' + GEO: 'Python für Geodaten' + CAMP: 'Python Camps' + DAY: 'Python Tag' +series: + always: 'Jede Konferenz in' + place: + last: 'Letzte Konferenz in' + next: 'Nächste Konferenz in' + year: + last: 'Letztes Jahr in' + next: 'Nächstes Jahr in' +times: + tba: "Wird bekannt gegeben" + from: "Ab" + until: "Bis" + normal: + days: 'Tage' + hours: 'Stunden' + minutes: 'Minuten' + seconds: 'Sekunden' + short: + days: 'T' + hours: 'S' + minutes: 'm' + seconds: 's' + months: + January: 'Januar' + February: 'Februar' + March: 'März' + April: 'April' + May: 'Mai' + June: 'Juni' + July: 'Juli' + August: 'August' + September: 'September' + October: 'Oktober' + November: 'November' + December: 'Dezember' +social: + twitter: 'Konferenz tweeten' + facebook: 'Konferenz auf FB teilen' + linkedin: 'Konferenz auf LinkedIn verlinken' + whatsapp: 'Konferenz per WhatsApp teilen' + email: 'Konferenz per E-Mail teilen' +search: + no-results: "Keine Suchergebnisse für gefunden." + error: 'Fehler beim Laden des Suchindex. Bitte probiere es später erneut.' +about: + toggle_fullscreen: "Vollbildpräsentationsmodus umschalten" + previous_slide: "Vorherige Folie" + next_slide: "Nächste Folie" + tagline: "Verpasse nie wieder eine Python-Konferenz-Deadline!" + hero_description: "Die gemeinschaftlich betriebene Plattform, die Python-Entwicklern hilft, Konferenzen weltweit zu entdecken, zu verfolgen und Beiträge einzureichen." + problem: + title: "Die Herausforderung" + description: "Das Verfolgen von Python-Konferenzfristen über verschiedene Websites, Zeitzonen und Formate hinweg ist zeitaufwendig und fehleranfällig. Viele Entwickler verpassen Gelegenheiten, ihr Wissen zu teilen, weil sie CfPs zu spät entdecken." + solution: + title: "Unsere Lösung" + description: "Pythondeadlin.es konsolidiert alle Python-Konferenzfristen an einem Ort, mit automatischer Zeitzonenumrechnung, mehreren Erinnerungsoptionen und umfassenden Details, um deine Einreichungen effektiv zu planen." + features: + title: "Hauptfunktionen" + tracking: + title: "Umfassendes Verfolgen" + description: "Behalte den Überblick über jede Call for Proposals (CfP)-Frist für Python-Konferenzen weltweit mit personalisierten Countdown-Timern in deiner lokalen Zeitzone." + notifications: + title: "Flexible Benachrichtigungen" + description: "Wähle aus, wie du erinnert werden möchtest—abonniere via iCal, Google Kalender oder RSS-Feed, um zeitnahe Benachrichtigungen zu erhalten, die zu deinem Workflow passen." + coverage: + title: "Globale Abdeckung" + description: "Entdecke Python-Events von PyCon bis PyData auf sechs Kontinenten mit unserer interaktiven Kartenansicht und umfassender Kalenderübersicht." + language: + title: "Mehrsprachige Unterstützung" + description: "Greife auf die Plattform in Englisch, Spanisch oder Deutsch zu, was Python-Konferenzen für Entwickler mit unterschiedlichem sprachlichen Hintergrund zugänglich macht." + community: + title: "Gemeinschaftlich Betrieben" + description: "Profitiere von unserem Open-Source-Ansatz, bei dem die Python-Community gemeinsam aktuelle und genaue Konferenzinformationen pflegt." + mobile: + title: "Mobilfreundlich" + description: "Überprüfe Fristen unterwegs mit unserem responsiven Design, das sich nahtlos an jedes Gerät anpasst—perfekt für vielbeschäftigte Entwickler." + categories: + title: "Konferenzkategorien" + intro: "Wir verfolgen Python-Konferenzen in verschiedenen Spezialisierungen:" + stats: + title: "In Zahlen" + conferences: + label: "Verfolgte Konferenzen" + description: "Umfassende Datenbank von Python-Events weltweit" + categories: + label: "Konferenzkategorien" + description: "Von allgemeinem Python bis zu spezialisierten Nischen" + guides: + label: "Ressourcen-Leitfäden" + description: "Umfassende Leitfäden für Erst- und erfahrene Redner" + countries: + label: "Verschiedene Länder" + description: "Python-Konferenzen aus der ganzen Welt" + languages: + label: "Sprachen" + description: "Python-Konferenzen global zugänglich machen" + testimonials: + title: "Was User sagen" + first: + quote: "\"Dank Pythondeadlin.es konnte ich meinen ersten Konferenzvortrag mit genügend Zeit zur Vorbereitung einreichen. Die Seite ist zu einem unverzichtbaren Werkzeug in meiner beruflichen Entwicklung geworden.\"" + author: "— Python-Entwickler" + second: + quote: "\"Als Konferenzorganisator schätze ich, dass unser Event genau dargestellt wird. Die Plattform hat uns geholfen, ein breiteres Publikum potenzieller Redner zu erreichen.\"" + author: "— PyCon-Organisator" + third: + quote: "\"Wir zeigen jetzt regelmäßig PythonDeadlin.es bei unserem Meetup, um Konferenzen im Blick zu behalten, die für unsere Teilnehmer interessant sein könnten.\"" + author: "— Meetup-Organisator" + use_cases: + title: "Wie Menschen Pythondeadlin.es nutzen" + first_time: + title: "Erstredner" + description: "Entdecke anfängerfreundliche Konferenzen mit genügend Vorlaufzeit, um einen überzeugenden Vorschlag vorzubereiten, und nutze den Ressourcenbereich für Inspiration und Anleitung." + frequent: + title: "Häufige Präsentatoren" + description: "Plane deinen jährlichen Vortragsplan und priorisiere Einreichungsfristen für mehrere Veranstaltungen." + organizers: + title: "Konferenzorganisatoren" + description: "Stelle sicher, dass deine Veranstaltung potenzielle Redner erreicht, indem du deine Konferenz zu unserer Datenbank hinzufügst." + cta: + title: "Beginne noch heute mit dem Verfolgen von Konferenzfristen" + description: "Schließe dich der Python-Community an, um über Konferenzmöglichkeiten auf dem Laufenden zu bleiben. Scanne den QR-Code oder besuche pythondeadlin.es, um zu beginnen." + visit_button: "Website besuchen" + github_button: "Auf GitHub beitragen" + qr_alt: "QR-Code für pythondeadlin.es" +languages: + native_speaker: 'Muttersprachler' + language_learner: 'Sprachlerner' + ai_translated: 'Von KI übersetzt' + switch_to: 'Wechseln' + translated_by: 'Übersetzt von:' + legend: 'Legende' +formatter: + description: 'Python-Konferenzfristen in verschiedenen Formaten einreichen' + basic: + title: 'Grundlegende Informationen' + name: 'Konferenzname' + year: 'Jahr' + type: 'Konferenztyp' + attendees: 'Erwartete Teilnehmer' + url: 'Website-URL' + location_date: + title: 'Ort & Datum' + city: 'Stadt' + city_help: 'Geben Sie nur den Stadtnamen ein' + country: 'Land' + country_help: 'Beginnen Sie mit der Eingabe, um passende Länder mit Flaggen zu sehen' + venue: 'Veranstaltungsort' + extra_places: "Zusätzliche Orte" + extra_help: "Für Hybrid- oder Online-Veranstaltungen fügen Sie hier zusätzliche, durch Kommas getrennte Orte hinzu." + start_date: 'Startdatum' + end_date: 'Enddatum' + timezone: 'Zeitzone' + timezone_help: 'Beginnen Sie mit der Eingabe, um die Zeitzone der Konferenz auszuwählen' + cfp: + title: 'Call for Proposals' + status: 'CfP-Status' + tba: 'Wird noch bekannt gegeben' + none: 'Kein CfP' + date: 'Datum verwenden' + deadline: 'Einreichungsfrist' + deadline_help: 'Die Frist für die Einreichung von Vortragsvorschlägen' + link: 'CfP-Link' + additional_info: + title: 'Zusätzliche Informationen' + sponsor: 'Sponsoring-URL' + finaid: 'URL für finanzielle Unterstützung' + mastodon: 'Mastodon-URL' + bsky: 'Bluesky-URL' + notes: 'Zusätzliche Notizen' + notes_place: 'Zusätzliche Hinweise zur Konferenz' + submission_guidelines: 'Einreichungsrichtlinien' + generate_output: 'Output generieren' + generated_outputs: 'Generierte Outputs' + csv_format: 'CSV-Format' + yaml_format: 'YAML-Format' + calendar_format: 'Kalenderformat' + copy: 'In die Zwischenablage kopieren' + required: 'Bitte füllen Sie alle erforderlichen Felder aus, die mit * gekennzeichnet sind.' diff --git a/_i18n/de/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/de/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..cea9b386cbd --- /dev/null +++ b/_i18n/de/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: Wie kann man auf Python-Konferenzen sprechen? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +Python-Konferenzen sind eine ausgezeichnete Plattform zum Teilen von Wissen, zum Networking mit Kollegen und um über die neuesten Entwicklungen in der Python-Community auf dem Laufenden zu bleiben. Wenn Sie leidenschaftlich an Python interessiert sind und Ihre Erkenntnisse mit einem breiteren Publikum teilen möchten, kann ein Vortrag auf einer Python-Konferenz eine großartige Gelegenheit sein. In diesem Blogbeitrag werden wir untersuchen, wie Sie auf Python-Konferenzen sprechen können. + +### Eingeladen werden + +Eine Möglichkeit, zu Python-Konferenzen eingeladen zu werden, besteht darin, einen etablierten Ruf in der Community zu haben. Angenommen, Sie haben zu Open-Source-Projekten beigetragen, Artikel oder Blogbeiträge über Python geschrieben oder bei kleineren Meetups oder Veranstaltungen gesprochen. In diesem Fall könnten Sie die Aufmerksamkeit von Konferenzorganisatoren auf sich ziehen. + +Wenn Sie zudem Experte auf einem bestimmten Gebiet sind, wie maschinelles Lernen oder Webentwicklung, könnten Sie zu Konferenzen eingeladen werden, die sich auf diese Themen konzentrieren. Um Ihre Chancen auf eine Einladung zu erhöhen, besuchen Sie Konferenzen und Meetups, beteiligen Sie sich an Online-Diskussionen und tragen Sie auf jede mögliche Weise zur Python-Community bei. + +### Einen Vorschlag bei einem Call for Proposal (CfP) einreichen + +Eine weitere Möglichkeit, auf Python-Konferenzen zu sprechen, besteht darin, einen Vorschlag bei einem Call for Proposals (CfP) einzureichen. Die meisten Konferenzen eröffnen CfPs mehrere Monate vor der Veranstaltung, und jeder kann einen Vorschlag einreichen. +Bei der Einreichung eines Vorschlags ist es wichtig zu beachten, dass Konferenzorganisatoren nach originellen und ansprechenden Vorträgen suchen, die ein vielfältiges Publikum ansprechen. Stellen Sie sicher, dass Ihre Einreichung gut geschrieben, klar und präzise ist und ein Thema behandelt, das für die Python-Community relevant und interessant ist. + +Hier sind einige Tipps für die Einreichung eines erfolgreichen Vorschlags: + +- Wählen Sie ein Thema, für das Sie sich begeistern und in dem Sie Expertise haben. +- Stellen Sie sicher, dass Ihr Vorschlag zum Konferenzthema oder -schwerpunkt passt. +- Schreiben Sie einen überzeugenden Titel und eine Zusammenfassung, die die Aufmerksamkeit der Konferenzorganisatoren und Teilnehmer auf sich ziehen. +- Skizzieren Sie Ihren Vortrag detailliert, einschließlich dessen, was Sie behandeln und wie Sie es präsentieren werden. +- Fügen Sie unterstützende Materialien wie Codebeispiele oder Folien bei, um den Organisatoren einen besseren Eindruck von Ihrem Präsentationsstil und -inhalt zu vermitteln. + +### Ihre Rednerkompetenzen entwickeln + +Wenn Sie neu im öffentlichen Sprechen sind, ist es eine gute Idee, klein anzufangen, indem Sie bei lokalen Meetups oder Veranstaltungen sprechen. + +Dies wird Ihnen helfen, Ihr Selbstvertrauen aufzubauen und Ihre Präsentationsfähigkeiten zu verfeinern. Mit zunehmender Erfahrung können Sie sich ausweiten und bei größeren Veranstaltungen wie regionalen oder nationalen Konferenzen sprechen. + +Bitten Sie nach jedem Vortrag um Feedback von Teilnehmern und Organisatoren und nutzen Sie dieses Feedback, um Ihre Sprechfähigkeiten zu verbessern. + +### Netzwerken mit anderen Sprechern und Teilnehmern + +Schließlich ist Networking entscheidend, um auf Python-Konferenzen sprechen zu können. + +Besuchen Sie so viele Konferenzen und Meetups wie möglich und versuchen Sie, sich mit anderen Sprechern und Teilnehmern zu vernetzen. + +Indem Sie Beziehungen zu anderen Mitgliedern der Python-Community aufbauen, erhöhen Sie Ihre Sichtbarkeit und Glaubwürdigkeit, was in Zukunft zu mehr Sprechmöglichkeiten führen kann. + +### Fazit + +Zusammenfassend erfordert das Sprechen auf Python-Konferenzen eine Kombination aus Fachwissen, Vorbereitung und Networking. + +Indem Sie diese Tipps befolgen, können Sie Ihre Chancen erhöhen, zum Sprechen eingeladen zu werden oder erfolgreich einen Vorschlag bei einem CfP einzureichen und letztendlich Ihr Wissen mit der breiteren Python-Community zu teilen. diff --git a/_i18n/de/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/de/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..b63a074ba51 --- /dev/null +++ b/_i18n/de/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: Wie erstellt man eine fantastische Präsentation für Python-Konferenzen? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Python-Konferenzen bieten Entwicklern eine hervorragende Plattform, um ihre Fähigkeiten zu präsentieren, Wissen zu teilen und mit Fachkollegen zu netzwerken. + +Das Sprechen auf einer Python-Konferenz kann eine fantastische Gelegenheit sein, Anerkennung zu gewinnen, Glaubwürdigkeit aufzubauen und einen wertvollen Beitrag zur Python-Community zu leisten. Eine Präsentation auf einer Konferenz zu halten kann jedoch auch einschüchternd sein, besonders wenn Sie neu im Bereich des öffentlichen Sprechens sind oder noch nie präsentiert haben. In dieser Ressource teilen wir einige Tipps, wie Sie auf Python-Konferenzen sprechen und Ihre Präsentation erfolgreich gestalten können. + +## Wählen Sie ein Thema, für das Sie sich begeistern + +Der erste Schritt zu einer erfolgreichen Präsentation ist die Wahl eines Themas, für das Sie sich begeistern. Wenn Sie von Ihrem Thema begeistert sind, wird Ihr Enthusiasmus in Ihrer Präsentation sichtbar sein. Sie werden mit größerer Wahrscheinlichkeit Ihr Publikum fesseln und begeistern. Wählen Sie ein Thema, das für die Python-Community relevant ist und wertvolle Einblicke oder Lösungen für häufige Probleme bietet. + +## Verstehen Sie Ihr Publikum + +Bevor Sie mit der Vorbereitung Ihrer Präsentation beginnen, ist es wichtig, die Demografie, das Fachwissen und die Interessen Ihres Publikums zu verstehen. Dies wird Ihnen helfen, Ihre Inhalte und Präsentation auf deren Erwartungen und Bedürfnisse abzustimmen. Wenn Ihr Publikum beispielsweise aus Python-Anfängern besteht, können Sie technischen Fachjargon vereinfachen und sich auf grundlegende Konzepte konzentrieren. + +## Erstellen Sie eine überzeugende Erzählung + +Eine überzeugende Erzählung ist ein entscheidender Aspekt jeder erfolgreichen Präsentation. Es ist wichtig, Ihre Präsentation so zu strukturieren, dass sie eine Geschichte erzählt und Ihr Publikum engagiert hält. Verwenden Sie Anekdoten, Fallstudien und reale Beispiele, um Ihre Punkte zu illustrieren und Ihrer Präsentation eine persönliche Note zu verleihen. Achten Sie darauf, die wichtigsten Erkenntnisse klar und präzise hervorzuheben und zu präsentieren. + +## Üben, üben, üben + +Übung ist entscheidend, um eine polierte und selbstbewusste Präsentation zu halten. Proben Sie Ihre Präsentation mehrmals, bis Sie sich mit Ihren Inhalten und Ihrer Vortragsweise wohl fühlen. Nehmen Sie sich Zeit für Ihre Präsentation, um sicherzustellen, dass sie innerhalb des zugewiesenen Zeitrahmens liegt. Erwägen Sie, Ihre Übungssitzungen aufzuzeichnen und zu überprüfen, um Verbesserungsbereiche zu identifizieren. + +## Verwenden Sie Visualisierungen, um Ihre Botschaft zu unterstützen + +Visuelle Hilfsmittel wie Folien und Diagramme können Ihre Botschaft unterstützen und Ihr Publikum engagiert halten. Achten Sie jedoch darauf, Ihre Präsentation nicht mit zu vielen visuellen Elementen zu überladen, was Sie von Ihrer Botschaft ablenken kann. Verwenden Sie Grafiken und Bilder, um komplexe Konzepte und Daten zu illustrieren, und halten Sie Ihre Folien einfach und visuell ansprechend. + +## Interagieren Sie mit Ihrem Publikum + +Die Interaktion mit Ihrem Publikum ist ein entscheidender Aspekt einer erfolgreichen Präsentation. Ermutigen Sie Ihr Publikum zur Teilnahme, indem Sie Fragen stellen, Umfragen durchführen oder interaktive Tools verwenden. Dies wird dazu beitragen, Ihr Publikum engagiert zu halten und ihnen ermöglichen, zur Diskussion beizutragen. Seien Sie bereit, Fragen zu beantworten und auf Bedenken oder Feedback einzugehen, die aufkommen könnten. + +## Fazit + +Das Sprechen auf einer Python-Konferenz kann eine großartige Möglichkeit sein, Ihr Wissen zu teilen und einen wertvollen Beitrag zur Community zu leisten. Wenn Sie diese Tipps befolgen, können Sie eine überzeugende Präsentation vorbereiten, die Ihr Publikum anspricht und begeistert. Denken Sie daran, ein Thema zu wählen, für das Sie sich begeistern, Ihr Publikum zu verstehen, eine überzeugende Erzählung zu erstellen, Ihre Präsentation zu üben, visuelle Elemente zur Unterstützung Ihrer Botschaft zu verwenden und mit Ihrem Publikum zu interagieren. Viel Glück und viel Spaß beim Präsentieren! diff --git a/_i18n/de/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/de/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..8b1bac87fe0 --- /dev/null +++ b/_i18n/de/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,38 @@ +--- +title: Was ist ein Python-Konferenz CfP? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'conference'] +--- + +Call for Proposals (CfP) oder Call for Participation ist ein gängiger Begriff in akademischen, Forschungs- und Fachgemeinschaften, um Einzelpersonen oder Gruppen einzuladen, Vorschläge oder Abstracts für Konferenzen, Workshops, Symposien und andere Veranstaltungen einzureichen. + +Da die Python-Community eine Gruppe liebenswerter Nerds ist, hat diese Terminologie auch Eingang in den Python-Sprachgebrauch gefunden. + +## Was ist ein CfP? + +Einfach ausgedrückt ist ein CfP eine offene Einladung an Experten, Wissenschaftler, Forscher und Praktiker, ihre Ideen, Forschungsergebnisse und Fallstudien in einem bestimmten Fachgebiet oder Interessensbereich zu präsentieren. + +Ein CfP wird typischerweise von Veranstaltungsorganisatoren, Konferenzkomitees oder akademischen Institutionen herausgegeben, um Einreichungen von interessierten Einzelpersonen oder Gruppen anzufordern. + +## Wofür sind CfPs da? + +Der Zweck eines CfP ist es, eine breite Palette von Teilnehmern zu ermutigen, sich an einer Veranstaltung oder Konferenz zu beteiligen, um eine Vielfalt an Perspektiven und Ideen zu gewährleisten. + +CfPs skizzieren oft das Thema der Veranstaltung, die Interessengebiete und die Einreichungsrichtlinien. Sie spezifizieren auch die Arten von Einreichungen, die akzeptiert werden, wie Forschungsarbeiten, Fallstudien, Poster oder Workshops. + +## Wie beteiligt man sich an einem CfP? + +Der Einreichungsprozess für einen CfP beinhaltet typischerweise die Vorbereitung eines Vorschlags oder Abstracts, der eine Zusammenfassung des vorgeschlagenen Themas, der Forschungsmethodik oder des Ansatzes und der erwarteten Ergebnisse enthält. + +Einige akademische CfPs erfordern die Einreichung eines vollständigen Papers, während andere nur ein kurzes Abstract oder eine Zusammenfassung verlangen. + +Python CfPs erfordern selten die Einreichung vollständiger Materialien, da sie keine Papers veröffentlichen. Es ist jedoch wichtig, die häufige Falle zu vermeiden, ausschließlich zukünftige Arbeit zu versprechen. + +## Fazit + +Zusammenfassend lädt ein CfP Experten, Wissenschaftler, Forscher und Praktiker ein, Vorschläge oder Abstracts für eine Veranstaltung oder Konferenz einzureichen. + +Er spielt eine wichtige Rolle bei der Förderung des Austauschs von Wissen und Fachwissen, der Förderung von Diskussionen und der Schaffung von Networking-Möglichkeiten unter Fachleuten in einem bestimmten Bereich. + +Wenn Sie daran interessiert sind, an einer Konferenz oder Veranstaltung teilzunehmen oder zu präsentieren, halten Sie Ausschau nach CfPs! diff --git a/_i18n/de/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/de/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..e6d9fd23f81 --- /dev/null +++ b/_i18n/de/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: Wie man einen großartigen Python-Konferenz-Vortragsvorschlag schreibt +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +Das Schreiben eines guten Konferenzvorschlags kann herausfordernd sein. Dennoch gibt es einige Schlüsselelemente, die helfen können, Ihren Vorschlag hervorzuheben. Hier sind fünf wesentliche Komponenten eines erfolgreichen Konferenzvorschlags. + +## Das Thema und warum es interessant ist + +Die erste Komponente eines guten Konferenzvorschlags ist eine klare und überzeugende Beschreibung des Themas, das Sie diskutieren möchten. Es ist wichtig, zu vermitteln, warum Ihr Thema für das Konferenzpublikum relevant und spannend ist. Achten Sie darauf, alle einzigartigen oder innovativen Aspekte Ihres Themas sowie alle Herausforderungen oder Chancen, die es bietet, hervorzuheben. + +## Das Publikum, das vom Besuch dieses Vortrags/Tutorials profitieren wird + +Die Identifizierung Ihrer Zielgruppe ist entscheidend für die Erstellung eines erfolgreichen Konferenzvorschlags. + +Seien Sie präzise darüber, wer von Ihrem Vortrag oder Tutorial profitieren wird und was sie lernen werden. + +Das Verständnis Ihres Publikums wird Ihnen helfen, Ihre Inhalte anzupassen und sicherzustellen, dass Sie wertvolle Erkenntnisse und Takeaways bieten. + +## Der Mehrwert für das Publikum + +Was können die Teilnehmer von Ihrem Vortrag oder Tutorial erwarten? Seien Sie klar über die wichtigsten Erkenntnisse, die Sie vermitteln möchten. + +Dies wird den Teilnehmern helfen, zu bewerten, ob Ihre Präsentation mit ihren Interessen und Bedürfnissen übereinstimmt. + +Es wird Ihnen auch helfen, Ihren Vortrag zu strukturieren und auf Kurs zu bleiben, um den versprochenen Mehrwert zu liefern. + +## Erforderliches Hintergrundwissen zum Verständnis des Vortrags/Tutorials + +Bei der Erstellung Ihres Vorschlags ist es wichtig zu berücksichtigen, welches Hintergrundwissen Ihr Publikum benötigen wird, um Ihre Inhalte zu verstehen und sich damit auseinanderzusetzen. + +Seien Sie klar über alle Voraussetzungen und stellen Sie Links oder Ressourcen zur Verfügung, die die Teilnehmer nutzen können, um ihr Wissen vor der Teilnahme aufzufrischen. + +## Ungefähre Zeitaufteilung, wie das Material behandelt wird + +Eine detaillierte Aufschlüsselung, wie Sie Ihr Material abdecken möchten, ist wichtig, um den Teilnehmern zu helfen, zu verstehen, was sie von Ihrem Vortrag oder Tutorial erwarten können. + +Indem Sie eine klare Struktur und einen Zeitplan für Ihre Präsentation skizzieren, werden Sie den Teilnehmern helfen, engagiert und auf Ihre Inhalte fokussiert zu bleiben. Es wird Ihnen auch helfen, auf Kurs zu bleiben und alle wichtigen Punkte zu behandeln, die Sie ansprechen möchten. + +## Fazit + +Zusammenfassend sollte ein guter Konferenzvorschlag eine klare und überzeugende Beschreibung des Themas liefern, die Zielgruppe und ihre Bedürfnisse identifizieren, die Takeaways und erforderliches Hintergrundwissen klar kommunizieren sowie eine detaillierte Aufschlüsselung des Materials bieten. Die Einbeziehung dieser wesentlichen Komponenten wird die Chancen erhöhen, dass Ihr Vorschlag angenommen wird und Sie eine erfolgreiche Präsentation auf der Konferenz halten. + +_Diese Liste erweitert die ausgezeichneten Punkte, die von der [Pydata Global Conference](https://pydata.org/global2022/present/) gemacht wurden._ diff --git a/_i18n/de/_posts/2023-03-07-find-target-audience.md b/_i18n/de/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..0b44bea24f4 --- /dev/null +++ b/_i18n/de/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: Wie definieren Sie Ihre Zielgruppe für einen Python-Konferenzvortrag? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +Bei der Einreichung eines Vorschlags für eine Konferenzpräsentation ist es wichtig, Ihre Zielgruppe zu definieren. Zu wissen, mit wem Sie sprechen, kann Ihnen helfen, Ihre Präsentation auf die Bedürfnisse, Interessen und das Hintergrundwissen des Publikums zuzuschneiden. In diesem Beitrag besprechen wir, wie Sie Ihre Zielgruppe für einen Konferenzvorschlag definieren und warum dies wichtig ist. + +## Betrachten Sie ihre Berufsrolle + +Zunächst müssen Sie die Berufsrolle Ihrer Zielgruppe berücksichtigen. Handelt es sich um Data Scientists, Machine Learning- oder Softwareingenieure, Forscher oder etwas anderes? + +Das Wissen um ihre Berufsrolle kann Ihnen helfen zu bestimmen, welche Themen und Techniken für sie am relevantesten sind. + +Wenn Sie beispielsweise eine neue Datenvisualisierungstechnik vorstellen, könnten Data Scientists und Forscher mehr daran interessiert sein, wie sie funktioniert. + +Gleichzeitig könnten Ingenieure mehr daran interessiert sein, wie sie in ihre bestehenden Systeme implementiert werden kann. + +## Denken Sie über die Erfahrung nach + +Als Nächstes sollten Sie das Erfahrungsniveau Ihrer Zielgruppe berücksichtigen. Sind sie Anfänger, Fortgeschrittene oder Experten in dem Themengebiet? + +Dies wird beeinflussen, wie Sie Ihre Ideen präsentieren und wie viel Hintergrundinformation Sie liefern. + +Wenn Ihre Präsentation beispielsweise einen komplexen Algorithmus behandelt, könnte ein fortgeschrittenes Publikum an den technischen Details und Codebeispielen interessiert sein, während Anfänger eine vereinfachte Erklärung der Konzepte benötigen könnten, um der Präsentation folgen zu können. + +## Betrachten Sie eine sekundäre Nische + +Glauben Sie mir, ich spreche gerne über maschinelles Lernen. Aber wenn die Leute mich nicht kennen, werden sie sich wahrscheinlich nicht für diesen Vortrag interessieren. + +Sie könnten jedoch über "maschinelles Lernen in der Medizin" oder "Anwendung neuronaler Netze in der Wetter- und Klimavorhersage" sprechen, was den Vortrag für bestimmte Personen, die den Vorschlag sonst vielleicht übersehen hätten, zu einem Muss macht. + +So können Sie Ihrer Zielgruppe genau mitteilen, dass eine Präsentation für sie bestimmt ist. + +## Warum definieren wir unsere Zielgruppe? + +Die Definition Ihrer Zielgruppe ist aus zwei Hauptgründen wichtig. + +Erstens hilft es Ihnen, Ihre Präsentation auf die relevantesten und interessantesten Themen für Ihr Publikum zu konzentrieren. Dies kann Ihre Präsentation ansprechender und wertvoller für die Teilnehmer machen. + +Zweitens hilft es potenziellen Teilnehmern zu entscheiden, ob Ihre Präsentation ihren Bedürfnissen und Interessen entspricht. + +Wenn sie leicht erkennen können, dass Ihre Präsentation auf ihre Berufsrolle und ihr Erfahrungsniveau abzielt, werden sie eher teilnehmen und Wert in Ihrem Vortrag finden. + +## Berücksichtigen Sie die Konferenz selbst + +Wenn Sie Ihren Konferenzvorschlag schreiben, stellen Sie sicher, dass Sie Informationen über Ihre Zielgruppe einfügen. + +Dies könnte so einfach sein wie eine Aussage wie "Diese Präsentation richtet sich an Data Scientists mit mittlerem Erfahrungsniveau." Die Bereitstellung dieser Informationen kann Gutachtern und Teilnehmern helfen zu verstehen, für wen Ihr Vortrag gedacht ist und ob er mit den Zielen der Konferenz übereinstimmt. + +## Fazit + +Die Definition Ihrer Zielgruppe ist ein wesentlicher Schritt bei der Vorbereitung einer Konferenzpräsentation. Indem Sie die Berufsrolle und das Erfahrungsniveau Ihres Publikums berücksichtigen, können Sie Ihre Präsentation auf deren Bedürfnisse und Interessen zuschneiden, was sie ansprechender und nützlicher für die Teilnehmer macht. Stellen Sie sicher, dass Sie Informationen über Ihre Zielgruppe in Ihrem Konferenzvorschlag aufnehmen, um Gutachtern und Teilnehmern zu helfen, zu verstehen, für wen Ihr Vortrag gedacht ist und ob er für sie geeignet ist. diff --git a/_i18n/de/_posts/2023-03-08-common-pitfalls.md b/_i18n/de/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..7a0e3fc6d41 --- /dev/null +++ b/_i18n/de/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 9 häufige Fallstricke, die zur Ablehnung Ihres Python-Konferenz-Vortragsvorschlags führen +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +Wenn Sie einen Vorschlag für einen Konferenzvortrag einreichen möchten, ist es wichtig zu wissen, was zu vermeiden ist, um Ihre Erfolgschancen zu erhöhen. Hier sind neun häufige Fallstricke, auf die Sie achten sollten: + +## Verkaufspräsentationen + +Denken Sie daran, dass die Konferenz eine Gemeinschaft von Erstellern und Nutzern von Open-Source-Tools für wissenschaftliches Rechnen ist. Während Sie auf Ihr geschlossenes Produkt oder Ihre Plattform verweisen können, wird das Publikum den Vortrag interessanter finden, wenn sie Ihre Techniken mit dem Open-Source PyData-Stack ausprobieren können. Vermeiden Sie harte Verkaufsargumente und konzentrieren Sie sich stattdessen auf Problemdefinition, vorgeschlagene Strategien und Geschäftsdomäne. + +## Wiederholte Vorträge + +Konferenzen bevorzugen neue Vorträge und neue Redner. Wenn Ihr Vortrag bereits online verfügbar ist, wird er wahrscheinlich nicht für die Konferenz akzeptiert. Versuchen Sie, neue Erkenntnisse, Techniken oder Perspektiven zu einem Thema zu bringen, das noch nicht behandelt wurde. + +## Mangel an Klarheit + +Ihr Vorschlag sollte klar kommunizieren, worum es in Ihrem Vortrag geht und was die Teilnehmer erwarten können zu lernen. Wenn Ihr Vorschlag unklar, weitschweifig oder schwer zu verstehen ist, können Gutachter möglicherweise nicht feststellen, ob Ihr Vortrag mit den Zielen der Konferenz übereinstimmt oder für das beabsichtigte Publikum geeignet ist. + +## Mangel an Originalität + +Gutachter suchen nach einzigartigen, aufschlussreichen und innovativen Vorträgen, die frische Perspektiven oder neue Lösungen für häufige Probleme bieten. Wenn Ihr Vorschlag ein Thema behandelt, das bereits mehrfach behandelt wurde oder keine neuen Erkenntnisse oder Techniken bietet, werden Gutachter ihn möglicherweise ablehnen. Das bedeutet nicht, dass eine Fallstudie oder eine neue Sichtweise auf ein Problem nicht akzeptiert wird, aber es lohnt sich, diese zusätzliche Perspektive zu berücksichtigen. + +## Übermäßig lange Vorschläge + +Halten Sie Ihren Vorschlag einfach und klar. Gute Vorschläge liefern typischerweise alle wichtigen Informationen innerhalb von 250 Wörtern. Dies ist keine strenge Grenze und variiert je nach Konferenz. Dies ist ein Vorschlag, der Ihnen hilft, konzentriert zu bleiben und die Aufmerksamkeit der Gutachter nicht zu verlieren. + +## Mangel an Relevanz + +Stellen Sie sicher, dass Ihr Vortrag mit dem Thema oder Fokus der Konferenz übereinstimmt. Wenn Ihr Vorschlag nur tangential mit den Zielen der Konferenz zusammenhängt, sehen Gutachter möglicherweise nicht, wie er in das größere Bild passt oder wie er den Teilnehmern nutzen würde. + +## Zukünftige Arbeit + +Während die Diskussion über zukünftige Arbeit spannend ist und in Ihrem Vortrag erwähnt werden könnte, sollte der Kerninhalt des Vortrags bereits gestaltet sein, und Sie sollten in der Lage sein, ihn in Ihrem Vorschlag zu beschreiben. Verlassen Sie sich nicht zu stark auf zukünftige Datenerfassung oder zukünftige Prototyping, da die Dinge oft nicht wie erwartet verlaufen. Stellen Sie sicher, dass Sie konkrete Beispiele und Anwendungsfälle liefern. + +## Unangemessene oder anstößige Inhalte + +Halten Sie Ihre Sprache und Ihren Ton professionell und respektvoll, und vermeiden Sie kontroverse oder sensible Themen, die Teilnehmer beleidigen oder entfremden könnten. Vorschläge, die unangemessene, anstößige oder diskriminierende Inhalte enthalten, werden wahrscheinlich abgelehnt. + +## Schlechte Übereinstimmung mit dem Konferenzformat + +Konferenzen haben unterschiedliche Formate, von Lightning Talks bis hin zu Workshops und Keynote-Reden. Stellen Sie sicher, dass Ihr Vorschlag mit dem Format und der Dauer der Konferenz übereinstimmt und in diesem Format effektiv präsentiert werden kann. Berücksichtigen Sie alle Geräte, Materialien oder Ressourcen, die für Ihren Vortrag benötigt werden. + +Indem Sie diese häufigen Fallstricke vermeiden, können Sie Ihre Chancen erhöhen, einen erfolgreichen Vorschlag für einen Konferenzvortrag einzureichen, der mit den Zielen der Konferenz übereinstimmt, für die Teilnehmer relevant ist und frische Erkenntnisse oder Techniken liefert. diff --git a/_i18n/de/_posts/2023-03-09-what-about.md b/_i18n/de/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..60d2162bf9c --- /dev/null +++ b/_i18n/de/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: Worüber sollte mein Python-Konferenzvortrag sein? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Wir stehen oft vor einem paradoxen Rätsel, wenn wir uns endlich entscheiden, einen Vortrag auf einer Python-Konferenz zu halten. Wir haben so viele spannende Dinge gelernt. Vieles ist interessant. Aber worüber sollte mein Python-Vortrag sein?! + +Also, herzlichen Glückwunsch zu Ihrer Entscheidung, über Python zu präsentieren! Sie sind begierig darauf, Ihr Wissen und Ihre Erfahrung mit anderen zu teilen. Lassen Sie uns eintauchen! + +Zunächst einmal, denken Sie an Ihr Publikum. Wen möchten Sie mit Ihrem Vortrag erreichen? Sind es Anfänger, fortgeschrittene oder erfahrene Python-Nutzer? Haben sie ein spezifisches Interesse oder Problem, das sie mit Python lösen möchten? Das Verständnis der Expertise und Interessen Ihres Publikums wird Ihnen helfen, ein Thema zu wählen, das sie anspricht und ihr Engagement aufrechterhält. + +Als Nächstes überlegen Sie, welche Art von Vortrag Sie halten möchten. Möchten Sie tief in ein komplexes Thema eintauchen oder es mit einem praktischen Tutorial einfach halten? Möchten Sie sich auf Pythons mathematische Fähigkeiten oder praktische Anwendungen konzentrieren? Es ist entscheidend, ein Thema zu wählen, das mit Ihrer Expertise und Leidenschaft übereinstimmt und Ihr Publikum im Auge behält. + +Sobald Sie sich für Ihr Thema und die Art des Vortrags entschieden haben, denken Sie über den Ton nach, den Sie setzen möchten. Möchten Sie locker und humorvoll sein oder eher ernst und warnend? Es gibt hier keine richtige oder falsche Antwort, aber stellen Sie sicher, dass Ihr Ton für Ihr Thema und Publikum angemessen ist. + +Denken Sie daran, dass Ihr Vortrag darauf abzielt, andere über Python zu informieren und zu inspirieren, also stellen Sie sicher, dass Ihre Kernbotschaften klar und wertvoll sind. Was sollte Ihr Publikum aus Ihrem Vortrag lernen oder mitnehmen? Wie können sie das Gelernte in ihren Python-Projekten oder Karrieren anwenden? + +Zusammenfassend sollten Sie bei der Entscheidung über das Thema Ihres Python-Vortrags Ihr Publikum, die Art des Vortrags und den Ton, den Sie setzen möchten, berücksichtigen. Stellen Sie sicher, dass Ihre Kernbotschaften für Ihr Publikum klar und wertvoll sind. Und am wichtigsten: Haben Sie Spaß und teilen Sie Ihre Leidenschaft für Python mit anderen! diff --git a/_i18n/de/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/de/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..9f94ae07095 --- /dev/null +++ b/_i18n/de/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,53 @@ +--- +title: Zusätzliche Ressourcen für Konferenztermine +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +Pythondeadlin.es ist seit einem Jahr ein beliebtes Ziel für die Python-Community, um Konferenztermine an einem Ort zu finden. + +Es ist jedoch wichtig, andere wertvolle Ressourcen zu kennen, die Ihre Erfahrung bei der Konferenzplanung verbessern und die Zusammenarbeit innerhalb der Python-Community fördern können. + +In diesem Blogbeitrag stellen wir Ihnen zwei dieser Ressourcen vor, die eine wichtige Rolle bei der Zusammenstellung von Konferenzinformationen spielen und die Python-Community zusammenführen. Lassen Sie uns eintauchen! + +## Python-Organizers GitHub: Eine Schatztruhe an Informationen + +Das [Python-Organizers GitHub Repository] (https://github.com/python-organizers/conferences) ist eine wertvolle Ressource für Konferenzorganisatoren, Teilnehmer und Redner gleichermaßen. + +Es dient als zentraler Knotenpunkt für Konferenzdaten und bietet eine organisierte Sammlung von Konferenzen, Einreichungsfristen, Veranstaltungsterminen, Sponsoreninformationen und Details zum Veranstaltungsort. Diese kollaborative Plattform ermutigt Organisatoren von Veranstaltungen, ihre Konferenzinformationen zu teilen und zur Genauigkeit und Vollständigkeit der Daten beizutragen. + +Durch die Nutzung des Python-Organizers GitHub können Sie auf eine Fülle von Wissen zurückgreifen und mit anderen Organisatoren zusammenarbeiten. + +Ganz gleich, ob Sie planen, an einer Python-Konferenz teilzunehmen oder einen Vortrag zu halten, diese Ressource ermöglicht es Ihnen, fundierte Entscheidungen zu treffen und über die neuesten Konferenztermine auf dem Laufenden zu bleiben. + +Das GitHub Repository macht die Interaktion einfach und fördert das Engagement der Gemeinschaft und ermutigt Einzelpersonen, sich aktiv an der Förderung, dem Wachstum und dem Erfolg von Python-Konferenzen weltweit zu beteiligen. + +## Die offizielle Python-Event-Liste: Vereint die Gemeinschaft + +Die [official Python event list] (https://www.python.org/events/), die über die Python-Mailingliste verwaltet wird, dient als verbindende Plattform für die Python-Community. + +Diese umfassende Ressource bietet einen Überblick über anstehende Python-Veranstaltungen, einschließlich Konferenzen, Meetups, Workshops und mehr. Sie bietet Informationen zu Terminen, fördert aber darüber hinaus die Zusammenarbeit, die Vernetzung und den Ideenaustausch innerhalb der Gemeinschaft. + +Sie können sich in die Mailingliste eintragen, aber die Webseite bietet Ihnen auch eine Karte und einen Google-Kalender, den Sie einfach abonnieren können, um Updates zu erhalten. So können Sie Ihren Konferenzplan besser visualisieren und planen. + +Diese integrative Plattform bringt Python-Enthusiasten mit unterschiedlichem Hintergrund zusammen und ermutigt sie, sich zu vernetzen, zu lernen und einen Beitrag zum lebendigen Ökosystem von Python zu leisten. + +## Zusammenarbeit für eine verbesserte Konferenzplanung + +Während Pythondeadlin.es eine wertvolle Ressource bleibt, ist es wichtig, die weitere Landschaft der Konferenzinformationen zu erkunden. + +Das GitHub-Repository von Python-Organizers und die offizielle Python-Eventliste tragen wesentlich dazu bei, die Python-Community zu vereinen und die Zusammenarbeit zu fördern. + +Durch die Nutzung dieser Ressourcen können Sie sich über anstehende Python-Veranstaltungen auf dem Laufenden halten, mit Gleichgesinnten in Kontakt treten und aktiv zum Wachstum und Erfolg von Python-Konferenzen beitragen. Die Zusammenarbeit ermöglicht es uns, stärkere und lebendigere Konferenzen zu schaffen, die den unterschiedlichen Bedürfnissen und Interessen der Python-Gemeinschaft gerecht werden. + +Schauen Sie sich die folgenden Ressourcen für weitere Informationen an: + +- [Python-Organizers GitHub](https://github.com/python-organizers/conferences) +- [Offizielle Python-Veranstaltungsliste](https://www.python.org/events/) + +Durch die Nutzung dieser Plattformen können wir uns über anstehende Python-Veranstaltungen informieren, mit Gleichgesinnten in Kontakt treten und aktiv zum Erfolg unserer Konferenzen beitragen. Lassen Sie uns zusammenarbeiten, unser Wissen teilen und eine stärkere Python-Gemeinschaft schmieden. + +Gemeinsam können wir die Zukunft von Python-Veranstaltungen gestalten und ein Umfeld fördern, in dem jeder lernen, wachsen und gedeihen kann. + +Übersetzt mit DeepL.com (kostenlose Version) diff --git a/_i18n/de/calendar/description.md b/_i18n/de/calendar/description.md new file mode 100644 index 00000000000..b98835b16a1 --- /dev/null +++ b/_i18n/de/calendar/description.md @@ -0,0 +1,6 @@ +Die PythonDeadlin.es Übersicht über Fristen und Termine für Python Konferenzen in einem Kalender. + +Hier können optional **alle Fristen** nach Google Kalender oder +iCal exportiert werden. Dieser Kalender eignet sich hervorragend, um den Überblick über die tatsächlichen Fristen zu behalten! + +Alternativ können **kommende Python-Veranstaltungen** zuGoogle Kalender oder iCal importiert werden. Dies ist der klassische „Veranstaltungskalender“. diff --git a/_i18n/de/dates/pretty_dates.html b/_i18n/de/dates/pretty_dates.html new file mode 100644 index 00000000000..a00ecd79a95 --- /dev/null +++ b/_i18n/de/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil -%} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture -%} +{% elsif include.start == nil -%} + {% assign end_date = include.end | date: "%Y-%m-%d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture -%} + {% assign end_year = end_date | date: "%Y" -%} + {% capture pretty_date %}{% t "times.until" %} {{ end_day }}. {{ end_month }} {{ end_year }}{% endcapture -%} +{% elsif include.end == nil -%} + {% assign start_date = include.start | date: "%Y-%m-%d" -%} + {% assign start_day = start_date | date: "%-d" -%} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% assign start_year = start_date | date: "%Y" -%} + {% capture pretty_date %}{% t "times.from" %} {{ start_day }}. {{ start_month }} {{ start_year }}{% endcapture -%} +{% else -%} + {% assign start_date = include.start | date: "%Y-%m-%d" -%} + {% assign end_date = include.end | date: "%Y-%m-%d" -%} + + {% if start_date == end_date -%} + {% assign day = start_date | date: "%-d" -%} + {% assign year = start_date | date: "%Y" -%} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% capture pretty_date %}{{ day }}. {{ month }} {{ year }}{% endcapture -%} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" -%} + {% assign start_day = start_date | date: "%-d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% assign year = start_date | date: "%Y" -%} + {% capture pretty_date %}{{ start_day }}. – {{ end_day }}. {{ month }} {{ year }}{% endcapture -%} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" -%} + {% assign start_day = start_date | date: "%-d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture -%} + {% assign year = start_date | date: "%Y" -%} + {% capture pretty_date %}{{ start_day }}. {{ start_month }} – {{ end_day }}. {{ end_month }} {{ year }}{% endcapture -%} + + {% else -%} + {% assign start_day = start_date | date: "%-d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture -%} + {% assign start_year = start_date | date: "%Y" -%} + {% assign end_year = end_date | date: "%Y" -%} + {% capture pretty_date %}{{ start_day }}. {{ start_month }} {{ start_year }} – {{ end_day }}. {{ end_month }} {{ end_year }}{% endcapture -%} + {% endif -%} +{% endif -%}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/de/footer/jesper.md b/_i18n/de/footer/jesper.md new file mode 100644 index 00000000000..392e10d9587 --- /dev/null +++ b/_i18n/de/footer/jesper.md @@ -0,0 +1 @@ +Jesper Dramsch, Ersteller von ML.recipes, data-science-gui.de, Late to the Party 🎉 und der Latent Space Community. diff --git a/_i18n/de/footer/maintainer.md b/_i18n/de/footer/maintainer.md new file mode 100644 index 00000000000..0ac984d1e0d --- /dev/null +++ b/_i18n/de/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

Maintained von Jesper Dramsch • Open-source • Community-orientiert

+

Inspiriert von aideadlin.es • Archiviert seit 2022 {{confs | size}} Python Konferenzen.

diff --git a/_i18n/de/footer/terms.md b/_i18n/de/footer/terms.md new file mode 100644 index 00000000000..9188034369e --- /dev/null +++ b/_i18n/de/footer/terms.md @@ -0,0 +1,3 @@ +

Keine Gewähr für die Richtigkeit, Fehler bitte korrigieren durch Senden eines Pull-Requests.

+ +ImpressumDatenschutzerklärung diff --git a/_i18n/de/formatter/countries.html b/_i18n/de/formatter/countries.html new file mode 100644 index 00000000000..6bf94d28e57 --- /dev/null +++ b/_i18n/de/formatter/countries.html @@ -0,0 +1,79 @@ +{ name: 'Afghanistan', code: 'AFG', flag: '🇦🇫' }, { name: 'Albanien', code: 'ALB', flag: '🇦🇱' }, { name: 'Algerien', +code: 'DZA', flag: '🇩🇿' }, { name: 'Andorra', code: 'AND', flag: '🇦🇩' }, { name: 'Angola', code: 'AGO', flag: '🇦🇴' }, { +name: 'Antigua und Barbuda', code: 'ATG', flag: '🇦🇬' }, { name: 'Argentinien', code: 'ARG', flag: '🇦🇷' }, { name: +'Armenien', code: 'ARM', flag: '🇦🇲' }, { name: 'Australien', code: 'AUS', flag: '🇦🇺' }, { name: 'Österreich', code: +'AUT', flag: '🇦🇹' }, { name: 'Aserbaidschan', code: 'AZE', flag: '🇦🇿' }, { name: 'Bahamas', code: 'BHS', flag: '🇧🇸' }, { +name: 'Bahrain', code: 'BHR', flag: '🇧🇭' }, { name: 'Bangladesch', code: 'BGD', flag: '🇧🇩' }, { name: 'Barbados', code: +'BRB', flag: '🇧🇧' }, { name: 'Weißrussland', code: 'BLR', flag: '🇧🇾' }, { name: 'Belgien', code: 'BEL', flag: '🇧🇪' }, { +name: 'Belize', code: 'BLZ', flag: '🇧🇿' }, { name: 'Benin', code: 'BEN', flag: '🇧🇯' }, { name: 'Bhutan', code: 'BTN', +flag: '🇧🇹' }, { name: 'Bolivien', code: 'BOL', flag: '🇧🇴' }, { name: 'Bosnien und Herzegowina', code: 'BIH', flag: '🇧🇦' +}, { name: 'Botswana', code: 'BWA', flag: '🇧🇼' }, { name: 'Brasilien', code: 'BRA', flag: '🇧🇷' }, { name: 'Brunei', +code: 'BRN', flag: '🇧🇳' }, { name: 'Bulgarien', code: 'BGR', flag: '🇧🇬' }, { name: 'Burkina Faso', code: 'BFA', flag: +'🇧🇫' }, { name: 'Burundi', code: 'BDI', flag: '🇧🇮' }, { name: 'Kambodscha', code: 'KHM', flag: '🇰🇭' }, { name: +'Kamerun', code: 'CMR', flag: '🇨🇲' }, { name: 'Kanada', code: 'CAN', flag: '🇨🇦' }, { name: 'Kap Verde', code: 'CPV', +flag: '🇨🇻' }, { name: 'Zentralafrikanische Republik', code: 'CAF', flag: '🇨🇫' }, { name: 'Tschad', code: 'TCD', flag: +'🇹🇩' }, { name: 'Chile', code: 'CHL', flag: '🇨🇱' }, { name: 'China', code: 'CHN', flag: '🇨🇳' }, { name: 'Kolumbien', +code: 'COL', flag: '🇨🇴' }, { name: 'Komoren', code: 'COM', flag: '🇰🇲' }, { name: 'Kongo', code: 'COG', flag: '🇨🇬' }, { +name: 'Costa Rica', code: 'CRI', flag: '🇨🇷' }, { name: 'Kroatien', code: 'HRV', flag: '🇭🇷' }, { name: 'Kuba', code: +'CUB', flag: '🇨🇺' }, { name: 'Zypern', code: 'CYP', flag: '🇨🇾' }, { name: 'Tschechische Republik', code: 'CZE', flag: +'🇨🇿' }, { name: 'Dänemark', code: 'DNK', flag: '🇩🇰' }, { name: 'Dschibuti', code: 'DJI', flag: '🇩🇯' }, { name: +'Dominica', code: 'DMA', flag: '🇩🇲' }, { name: 'Dominikanische Republik', code: 'DOM', flag: '🇩🇴' }, { name: 'Ecuador', +code: 'ECU', flag: '🇪🇨' }, { name: 'Ägypten', code: 'EGY', flag: '🇪🇬' }, { name: 'El Salvador', code: 'SLV', flag: '🇸🇻' +}, { name: 'Äquatorialguinea', code: 'GNQ', flag: '🇬🇶' }, { name: 'Eritrea', code: 'ERI', flag: '🇪🇷' }, { name: +'Estland', code: 'EST', flag: '🇪🇪' }, { name: 'Äthiopien', code: 'ETH', flag: '🇪🇹' }, { name: 'Fidschi', code: 'FJI', +flag: '🇫🇯' }, { name: 'Finnland', code: 'FIN', flag: '🇫🇮' }, { name: 'Frankreich', code: 'FRA', flag: '🇫🇷' }, { name: +'Gabun', code: 'GAB', flag: '🇬🇦' }, { name: 'Gambia', code: 'GMB', flag: '🇬🇲' }, { name: 'Georgien', code: 'GEO', flag: +'🇬🇪' }, { name: 'Deutschland', code: 'DEU', flag: '🇩🇪' }, { name: 'Ghana', code: 'GHA', flag: '🇬🇭' }, { name: +'Griechenland', code: 'GRC', flag: '🇬🇷' }, { name: 'Grenada', code: 'GRD', flag: '🇬🇩' }, { name: 'Guatemala', code: +'GTM', flag: '🇬🇹' }, { name: 'Guinea', code: 'GIN', flag: '🇬🇳' }, { name: 'Guinea-Bissau', code: 'GNB', flag: '🇬🇼' }, { +name: 'Guyana', code: 'GUY', flag: '🇬🇾' }, { name: 'Haiti', code: 'HTI', flag: '🇭🇹' }, { name: 'Honduras', code: 'HND', +flag: '🇭🇳' }, { name: 'Ungarn', code: 'HUN', flag: '🇭🇺' }, { name: 'Island', code: 'ISL', flag: '🇮🇸' }, { name: +'Indien', code: 'IND', flag: '🇮🇳' }, { name: 'Indonesien', code: 'IDN', flag: '🇮🇩' }, { name: 'Iran', code: 'IRN', flag: +'🇮🇷' }, { name: 'Irak', code: 'IRQ', flag: '🇮🇶' }, { name: 'Irland', code: 'IRL', flag: '🇮🇪' }, { name: 'Israel', code: +'ISR', flag: '🇮🇱' }, { name: 'Italien', code: 'ITA', flag: '🇮🇹' }, { name: 'Jamaika', code: 'JAM', flag: '🇯🇲' }, { name: +'Japan', code: 'JPN', flag: '🇯🇵' }, { name: 'Jordanien', code: 'JOR', flag: '🇯🇴' }, { name: 'Kasachstan', code: 'KAZ', +flag: '🇰🇿' }, { name: 'Kenia', code: 'KEN', flag: '🇰🇪' }, { name: 'Kiribati', code: 'KIR', flag: '🇰🇮' }, { name: +'Nordkorea', code: 'PRK', flag: '🇰🇵' }, { name: 'Südkorea', code: 'KOR', flag: '🇰🇷' }, { name: 'Kuwait', code: 'KWT', +flag: '🇰🇼' }, { name: 'Kirgisistan', code: 'KGZ', flag: '🇰🇬' }, { name: 'Laos', code: 'LAO', flag: '🇱🇦' }, { name: +'Lettland', code: 'LVA', flag: '🇱🇻' }, { name: 'Libanon', code: 'LBN', flag: '🇱🇧' }, { name: 'Lesotho', code: 'LSO', +flag: '🇱🇸' }, { name: 'Liberia', code: 'LBR', flag: '🇱🇷' }, { name: 'Libyen', code: 'LBY', flag: '🇱🇾' }, { name: +'Liechtenstein', code: 'LIE', flag: '🇱🇮' }, { name: 'Litauen', code: 'LTU', flag: '🇱🇹' }, { name: 'Luxemburg', code: +'LUX', flag: '🇱🇺' }, { name: 'Mazedonien', code: 'MKD', flag: '🇲🇰' }, { name: 'Madagaskar', code: 'MDG', flag: '🇲🇬' }, { +name: 'Malawi', code: 'MWI', flag: '🇲🇼' }, { name: 'Malaysia', code: 'MYS', flag: '🇲🇾' }, { name: 'Malediven', code: +'MDV', flag: '🇲🇻' }, { name: 'Mali', code: 'MLI', flag: '🇲🇱' }, { name: 'Malta', code: 'MLT', flag: '🇲🇹' }, { name: +'Marshallinseln', code: 'MHL', flag: '🇲🇭' }, { name: 'Mauretanien', code: 'MRT', flag: '🇲🇷' }, { name: 'Mauritius', +code: 'MUS', flag: '🇲🇺' }, { name: 'Mexiko', code: 'MEX', flag: '🇲🇽' }, { name: 'Mikronesien', code: 'FSM', flag: '🇫🇲' +}, { name: 'Moldawien', code: 'MDA', flag: '🇲🇩' }, { name: 'Monaco', code: 'MCO', flag: '🇲🇨' }, { name: 'Mongolei', +code: 'MNG', flag: '🇲🇳' }, { name: 'Montenegro', code: 'MNE', flag: '🇲🇪' }, { name: 'Marokko', code: 'MAR', flag: '🇲🇦' +}, { name: 'Mosambik', code: 'MOZ', flag: '🇲🇿' }, { name: 'Myanmar', code: 'MMR', flag: '🇲🇲' }, { name: 'Namibia', code: +'NAM', flag: '🇳🇦' }, { name: 'Nauru', code: 'NRU', flag: '🇳🇷' }, { name: 'Nepal', code: 'NPL', flag: '🇳🇵' }, { name: +'Niederlande', code: 'NLD', flag: '🇳🇱' }, { name: 'Neuseeland', code: 'NZL', flag: '🇳🇿' }, { name: 'Nicaragua', code: +'NIC', flag: '🇳🇮' }, { name: 'Niger', code: 'NER', flag: '🇳🇪' }, { name: 'Nigeria', code: 'NGA', flag: '🇳🇬' }, { name: +'Norwegen', code: 'NOR', flag: '🇳🇴' }, { name: 'Oman', code: 'OMN', flag: '🇴🇲' }, { name: 'Pakistan', code: 'PAK', flag: +'🇵🇰' }, { name: 'Palau', code: 'PLW', flag: '🇵🇼' }, { name: 'Panama', code: 'PAN', flag: '🇵🇦' }, { name: +'Papua-Neuguinea', code: 'PNG', flag: '🇵🇬' }, { name: 'Paraguay', code: 'PRY', flag: '🇵🇾' }, { name: 'Peru', code: +'PER', flag: '🇵🇪' }, { name: 'Philippinen', code: 'PHL', flag: '🇵🇭' }, { name: 'Polen', code: 'POL', flag: '🇵🇱' }, { +name: 'Portugal', code: 'PRT', flag: '🇵🇹' }, { name: 'Katar', code: 'QAT', flag: '🇶🇦' }, { name: 'Rumänien', code: +'ROU', flag: '🇷🇴' }, { name: 'Russland', code: 'RUS', flag: '🇷🇺' }, { name: 'Ruanda', code: 'RWA', flag: '🇷🇼' }, { name: +'St. Kitts und Nevis', code: 'KNA', flag: '🇰🇳' }, { name: 'St. Lucia', code: 'LCA', flag: '🇱🇨' }, { name: 'St. Vincent +und die Grenadinen', code: 'VCT', flag: '🇻🇨' }, { name: 'Samoa', code: 'WSM', flag: '🇼🇸' }, { name: 'San Marino', code: +'SMR', flag: '🇸🇲' }, { name: 'São Tomé und Príncipe', code: 'STP', flag: '🇸🇹' }, { name: 'Saudi-Arabien', code: 'SAU', +flag: '🇸🇦' }, { name: 'Senegal', code: 'SEN', flag: '🇸🇳' }, { name: 'Serbien', code: 'SRB', flag: '🇷🇸' }, { name: +'Seychellen', code: 'SYC', flag: '🇸🇨' }, { name: 'Sierra Leone', code: 'SLE', flag: '🇸🇱' }, { name: 'Singapur', code: +'SGP', flag: '🇸🇬' }, { name: 'Slowakei', code: 'SVK', flag: '🇸🇰' }, { name: 'Slowenien', code: 'SVN', flag: '🇸🇮' }, { +name: 'Salomonen', code: 'SLB', flag: '🇸🇧' }, { name: 'Somalia', code: 'SOM', flag: '🇸🇴' }, { name: 'Südafrika', code: +'ZAF', flag: '🇿🇦' }, { name: 'Südsudan', code: 'SSD', flag: '🇸🇸' }, { name: 'Spanien', code: 'ESP', flag: '🇪🇸' }, { +name: 'Sri Lanka', code: 'LKA', flag: '🇱🇰' }, { name: 'Sudan', code: 'SDN', flag: '🇸🇩' }, { name: 'Suriname', code: +'SUR', flag: '🇸🇷' }, { name: 'Swasiland', code: 'SWZ', flag: '🇸🇿' }, { name: 'Schweden', code: 'SWE', flag: '🇸🇪' }, { +name: 'Schweiz', code: 'CHE', flag: '🇨🇭' }, { name: 'Syrien', code: 'SYR', flag: '🇸🇾' }, { name: 'Taiwan', code: 'TWN', +flag: '🇹🇼' }, { name: 'Tadschikistan', code: 'TJK', flag: '🇹🇯' }, { name: 'Tansania', code: 'TZA', flag: '🇹🇿' }, { name: +'Thailand', code: 'THA', flag: '🇹🇭' }, { name: 'Osttimor', code: 'TLS', flag: '🇹🇱' }, { name: 'Togo', code: 'TGO', flag: +'🇹🇬' }, { name: 'Tonga', code: 'TON', flag: '🇹🇴' }, { name: 'Trinidad und Tobago', code: 'TTO', flag: '🇹🇹' }, { name: +'Tunesien', code: 'TUN', flag: '🇹🇳' }, { name: 'Türkei', code: 'TUR', flag: '🇹🇷' }, { name: 'Turkmenistan', code: 'TKM', +flag: '🇹🇲' }, { name: 'Tuvalu', code: 'TUV', flag: '🇹🇻' }, { name: 'Uganda', code: 'UGA', flag: '🇺🇬' }, { name: +'Ukraine', code: 'UKR', flag: '🇺🇦' }, { name: 'Vereinigte Arabische Emirate', code: 'ARE', flag: '🇦🇪' }, { name: +'Vereinigtes Königreich', code: 'GBR', flag: '🇬🇧' }, { name: 'Vereinigte Staaten', code: 'USA', flag: '🇺🇸' }, { name: +'Uruguay', code: 'URY', flag: '🇺🇾' }, { name: 'Usbekistan', code: 'UZB', flag: '🇺🇿' }, { name: 'Vanuatu', code: 'VUT', +flag: '🇻🇺' }, { name: 'Vatikanstadt', code: 'VAT', flag: '🇻🇦' }, { name: 'Venezuela', code: 'VEN', flag: '🇻🇪' }, { name: +'Vietnam', code: 'VNM', flag: '🇻🇳' }, { name: 'Jemen', code: 'YEM', flag: '🇾🇪' }, { name: 'Sambia', code: 'ZMB', flag: +'🇿🇲' }, { name: 'Simbabwe', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/de/formatter/submission.html b/_i18n/de/formatter/submission.html new file mode 100644 index 00000000000..78a182b4a02 --- /dev/null +++ b/_i18n/de/formatter/submission.html @@ -0,0 +1,56 @@ +
+
So reichen Sie Ihre Konferenzinformationen ein
+ +
+
1. Python-Organizers CSV-Format
+

+ Fügen Sie Ihre Konferenz zum + python-organizers/conferences + Repository hinzu: +

+
    +
  • Erstellen Sie einen Fork des Repositories
  • +
  • Bearbeiten Sie die CSV-Datei des entsprechenden Jahres
  • +
  • Fügen Sie Ihre Konferenzdatenzeile hinzu
  • +
  • Reichen Sie einen Pull Request ein
  • +
+
+ +
+
2. PythonDeadlin.es YAML-Format
+

+ Fügen Sie Ihre Konferenz zu + jesperdramsch/python-deadlines hinzu: +

+
    +
  • Erstellen Sie einen Fork des Repositories
  • +
  • Bearbeiten Sie die Datei `_data/conferences.yml`
  • +
  • Fügen Sie Ihre Konferenz-YAML-Daten an der entsprechenden Stelle hinzu
  • +
  • Reichen Sie einen Pull Request ein
  • +
+
+ +
+
3. Python.org Kalenderformat
+

Reichen Sie Ihre Konferenz für den offiziellen Python-Veranstaltungskalender ein:

+
    +
  • + Senden Sie eine E-Mail an + + href="mailto:events@python.org" + >events[at]python.org + mit dem Text im Kalenderformat +
  • +
  • Geben Sie als Betreffzeile an: "Python Event Submission: [Name Ihrer Konferenz]"
  • +
  • Warten Sie auf die Bestätigung vom Python-Eventteam
  • +
+
+ +
+ Tipp: Reichen Sie Ihre Konferenz bei allen drei Plattformen ein, um die Sichtbarkeit + Ihrer Python-Konferenz zu maximieren! +
+
diff --git a/_i18n/de/frontpage/description.md b/_i18n/de/frontpage/description.md new file mode 100644 index 00000000000..19861334cfc --- /dev/null +++ b/_i18n/de/frontpage/description.md @@ -0,0 +1,5 @@ +Dieses Community-Tool dient als zentrales Repository für Fristen für Teilnahmeaufrufe, für Präsentationen, Workshops und Tutorials auf Python-Konferenzen. + +Die Termine werden als Countdowns, in lokalen Zeitzonen und weiter unten sogar als Google-Kalender zur Verfügung gestellt! + +Fristen werden in der lokalen Ortszeit angezeigt. Um sie in den Zeitzonen der Konferenz-Website anzuzeigen einfach auf die Konferenz klicken. diff --git a/_i18n/de/frontpage/hook.md b/_i18n/de/frontpage/hook.md new file mode 100644 index 00000000000..4563965b269 --- /dev/null +++ b/_i18n/de/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es sammelt deine Lieblings Python-Konferenzen. diff --git a/_i18n/de/maps/description.md b/_i18n/de/maps/description.md new file mode 100644 index 00000000000..297d2ff65d3 --- /dev/null +++ b/_i18n/de/maps/description.md @@ -0,0 +1,3 @@ +Manchmal ist es schöner alle Konferenzen auf einer Karte zu begutachten! + +Hier sind alle zukünftigen Konferenzen eingezeichnet. diff --git a/_i18n/de/resources/description.md b/_i18n/de/resources/description.md new file mode 100644 index 00000000000..c52352bf622 --- /dev/null +++ b/_i18n/de/resources/description.md @@ -0,0 +1,5 @@ +Diese Seite widmet sich der Unterstützung beim Verfassen herausragender Call for Proposals (CfPs) für Python-Konferenzen. Hier finden Sie eine Sammlung von Leitfäden und Tipps zum Schreiben überzeugender Vorschläge. + +Diese Ressourcen decken verschiedene Aspekte des CfP-Schreibens ab, von der Themenwahl bis zur Strukturierung Ihrer Einreichung. Ob Erstsprecher oder ein erfahrener Vortragender, diese Tools zielen darauf ab, Deine Fähigkeiten im Proposal-Schreiben zu verbessern. + +Erkunde unsere kuratierten Inhalte, um deine Chancen zu erhöhen, dass dein Vortrag oder Workshop bei Python-Veranstaltungen weltweit angenommen wird. diff --git a/_i18n/de/search/description.md b/_i18n/de/search/description.md new file mode 100644 index 00000000000..6944f99324e --- /dev/null +++ b/_i18n/de/search/description.md @@ -0,0 +1,5 @@ +Diese Seite zeigt die Suchergebnisse aus unserer umfassenden Datenbank von Python-Konferenzfristen und -Veranstaltungen. Die Ergebnisse werden als Liste relevanter Konferenzen präsentiert, die Ihrer Anfrage entsprechen. + +Jedes Ergebnis enthält wichtige Details wie den Konferenznamen, Einreichungsfristen und kurze Beschreibungen. Die Fristen werden in Ihrer lokalen Zeitzone angezeigt. + +Klicke auf einen Konferenznamen, um detailliertere Informationen einschließlich Einreichungsrichtlinien und Links zur offiziellen Konferenzwebsite zu erhalten. diff --git a/_i18n/de/series/description.md b/_i18n/de/series/description.md new file mode 100644 index 00000000000..b1ce56aef64 --- /dev/null +++ b/_i18n/de/series/description.md @@ -0,0 +1,4 @@ +Dieser Bereich unseres Community-Tools dient als umfassendes Verzeichnis wiederkehrender Python-Konferenzreihen. Hier findest du einen Überblick über regelmäßige Veranstaltungen, deren typische Zeitpläne und historische Informationen. + +Die Reihen werden mit kurzen Beschreibungen und Links zu vergangenen Veranstaltungen präsentiert, um bei der langfristigen Konferenzplanung zu helfen. +Klick auf eine Eventreihe, um weitere Details und Informationen zu bevorstehenden und vergangenen Veranstaltungen zu erhalten. diff --git a/_i18n/de/trademark/django.md b/_i18n/de/trademark/django.md new file mode 100644 index 00000000000..f9bb7c6c094 --- /dev/null +++ b/_i18n/de/trademark/django.md @@ -0,0 +1 @@ +

Django eingetragene Warenzeichen der Django Software Foundation. Diese Website, pythondeadlin.es, ist nicht mit der Django Software Foundation oder einer Django-Veranstaltung verbunden, wird nicht von ihr unterstützt oder gesponsert. Alle auf dieser Website verwendeten Marken und Logos sind Eigentum der jeweiligen Inhaber. Jeder Verweis auf Django oder andere Marken dient nur zu Informationszwecken und impliziert keine Verbindung mit den Markeninhabern.

diff --git a/_i18n/de/trademark/generic.md b/_i18n/de/trademark/generic.md new file mode 100644 index 00000000000..1a82c7d7c8b --- /dev/null +++ b/_i18n/de/trademark/generic.md @@ -0,0 +1 @@ +

Die Verwendung von Marken oder Logos, die von den auf dieser Website aufgeführten Veranstaltungen eingeführt wurden, dient nur zu Informationszwecken und impliziert keine Verbindung mit den jeweiligen Markeninhabern. Wenn Sie ein Markeninhaber sind und möchten, dass Ihre Marke von dieser Website entfernt wird, kontaktieren Sie uns bitte.

diff --git a/_i18n/de/trademark/pycon.md b/_i18n/de/trademark/pycon.md new file mode 100644 index 00000000000..597cc67e926 --- /dev/null +++ b/_i18n/de/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon, und PyLadies sind eingetragene Warenzeichen der Python Software Foundation. Diese Website, pythondeadlin.es, ist nicht mit der Python Software Foundation oder einer PyCon-Veranstaltung verbunden, wird nicht von ihr unterstützt oder gesponsert. Alle auf dieser Website verwendeten Marken und Logos sind Eigentum der jeweiligen Inhaber. Jeder Verweis auf PyCon oder andere Marken dient nur zu Informationszwecken und impliziert keine Verbindung mit den Markeninhabern.

diff --git a/_i18n/de/trademark/pydata.md b/_i18n/de/trademark/pydata.md new file mode 100644 index 00000000000..97926c9f433 --- /dev/null +++ b/_i18n/de/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS, PyData und Fiscally Sponsored Projects sind eingetragene Warenzeichen von NumFOCUS. Diese Website, pythondeadlin.es, ist weder mit NumFOCUS noch mit PyData oder einer angeschlossenen Veranstaltung verbunden, noch wird sie von PyData unterstützt oder gesponsert. Alle auf dieser Website verwendeten Marken und Logos sind Eigentum der jeweiligen Inhaber. Jeder Verweis auf NumFOCUS, PyData oder andere Marken dient nur zu Informationszwecken und impliziert keine Verbindung mit den Markeninhabern.

diff --git a/_i18n/en.yml b/_i18n/en.yml new file mode 100644 index 00000000000..3f52d6bb554 --- /dev/null +++ b/_i18n/en.yml @@ -0,0 +1,240 @@ +--- +global: + current: 'en' + choose: 'Choose Language' + sub_filter: 'Filter by Subcategory:' + cfp: 'Call for Participation' + cfp_ext: 'CfP extended from' + subscribe: 'Subscribe' +titles: + default: 'Python Conference Deadlines' + archive: 'Past Python Conferences' + visit_archive: 'Visit the Archive' + calendar: 'Calendar Overview of Python Conference Deadlines and Dates' + map: 'Map Overview of Python Conferences' + a404: 'Page Not Found' + privacy: 'Privacy Policy' + resources: 'Resources for Writing top-notch CfPs' + series: 'Python Event Series List' + impressum: 'Terms & Conditions' + past_events: 'Past Events' + past_cfps: 'Past Calls for Participation' + search: 'Search' + about: 'About Python Conference Deadlines' + languages: 'Available Languages' + formatter: 'Python Conference Formatter' +description: + summary: 'Summary of the conference and its instances throughout the years.' +header: + countdown: 'Countdowns' + calendar: 'Calendar' + maps: 'Map' + series: 'Series' + resources: 'Resources' + formatter: 'Formatter App' + course: 'Email Course' + articles: 'Getting Started' +conference: + title: 'Conference Deadlines' + finaid: 'Financial Aid' + sponsor: 'Sponsorship Opportunity' + all: 'All conferences for' + download_dl: 'Download Conference Deadline' + download_date: 'Download Conference Dates' + deadline_tz_theirs: 'Deadline in timezone from conference website' + deadline_tz_local: "Deadline in your local timezone" +buttons: + ical: Get the iCal + google: Add to Google Calendar + github: Submit a Conference on GitHub + all_selected: All Conferences Selected + none_selected: No Conference Selected +summary: + title: 'Conference Summary' +subs: + PY: 'General Python' + SCIPY: 'Scientific Python' + DATA: 'Python for Data' + WEB: 'Python for Web' + BIZ: 'Python for Business' + GEO: 'Python for Earth' + CAMP: 'Python Camps' + DAY: 'Python Day' +series: + always: 'Always held in' + place: + last: 'Last conference in' + next: 'Next conference in' + year: + last: 'Last year held in' + next: 'Next year held in' +times: + tba: "TBA" + from: "From" + until: "Until" + normal: + days: 'days' + hours: 'hours' + minutes: 'minutes' + seconds: 'seconds' + short: + days: 'd' + hours: 'h' + minutes: 'm' + seconds: 's' + months: + January: 'January' + February: 'February' + March: 'March' + April: 'April' + May: 'May' + June: 'June' + July: 'July' + August: 'August' + September: 'September' + October: 'October' + November: 'November' + December: 'December' +social: + twitter: 'Tweet Conference' + facebook: 'Share Conference on FB' + linkedin: 'Link Conference on LinkedIn' + whatsapp: 'Text Conference on WhatsApp' + email: 'Email Conference' +search: + no-results: 'No results found.' + error: 'Error loading search index. Please try again later.' +about: + toggle_fullscreen: "Toggle fullscreen presentation mode" + previous_slide: "Previous slide" + next_slide: "Next slide" + tagline: "Never miss another Python conference deadline!" + hero_description: "The community-driven platform that helps Python developers discover, track, and submit to conferences worldwide." + problem: + title: "The Challenge" + description: "Keeping track of Python conference deadlines across different websites, timezones, and formats is time-consuming and error-prone. Many developers miss opportunities to share their knowledge because they discover CFPs too late." + solution: + title: "Our Solution" + description: "Pythondeadlin.es consolidates all Python conference deadlines in one place, with automatic timezone conversion, multiple reminder options, and comprehensive details to help you plan your submissions effectively." + features: + title: "Key Features" + tracking: + title: "Comprehensive Tracking" + description: "Stay on top of every Call for Proposals (CfP) deadline for Python conferences worldwide with personalized countdown timers in your local timezone." + notifications: + title: "Flexible Notifications" + description: "Choose how you want to be reminded—subscribe via iCal, Google Calendar, or RSS feed to receive timely alerts that fit your workflow." + coverage: + title: "Global Coverage" + description: "Discover Python events from PyCon to PyData across six continents with our interactive map view and comprehensive calendar overview." + language: + title: "Multi-language Support" + description: "Access the platform in English, Spanish, or German, making Python conferences accessible to developers from diverse language backgrounds." + community: + title: "Community Driven" + description: "Benefit from our open-source approach where the Python community collaboratively maintains up-to-date and accurate conference information." + mobile: + title: "Mobile Friendly" + description: "Check deadlines on the go with our responsive design that adapts seamlessly to any device—perfect for busy developers." + categories: + title: "Conference Categories" + intro: "We track Python conferences across multiple specializations:" + stats: + title: "By The Numbers" + conferences: + label: "Conferences Tracked" + description: "Comprehensive database of Python events worldwide" + categories: + label: "Conference Categories" + description: "From general Python to specialized niches" + guides: + label: "Resource Guides" + description: "Comprehensive guides for first-time and experienced speakers" + countries: + label: "Distinct Countries" + description: "Python conferences from around the world" + languages: + label: "Languages" + description: "Making Python conferences globally accessible" + testimonials: + title: "What Users Say" + first: + quote: "\"Thanks to Pythondeadlin.es, I was able to submit my first conference talk proposal with plenty of time to prepare. The site has become an essential tool in my professional development.\"" + author: "— Python Developer" + second: + quote: "\"As a conference organizer, I appreciate that our event is accurately represented. The platform has helped us reach a wider audience of potential speakers.\"" + author: "— PyCon Organizer" + third: + quote: "\"We now regularly show PythonDeadlin.es at our Meetup to keep track of conferences our participants might be interested in.\"" + author: "— Meetup Organizer" + use_cases: + title: "How People Use Pythondeadlin.es" + first_time: + title: "First-time Speakers" + description: "Discover beginner-friendly conferences with enough lead time to prepare a compelling proposal and use the resource section for inspiration and guidance." + frequent: + title: "Frequent Presenters" + description: "Plan your annual speaking schedule and prioritize submission deadlines across multiple events." + organizers: + title: "Conference Organizers" + description: "Ensure your event reaches potential speakers by adding your conference to our database." + cta: + title: "Start Tracking Conference Deadlines Today" + description: "Join the Python community in staying on top of conference opportunities. Scan the QR code or visit pythondeadlin.es to get started." + visit_button: "Visit Website" + github_button: "Contribute on GitHub" + qr_alt: "QR code for pythondeadlin.es" +languages: + native_speaker: 'Native Speaker' + language_learner: 'Language Learner' + ai_translated: 'AI Translated' + switch_to: 'Switch' + translated_by: 'Translated by:' + legend: 'Legend' +formatter: + description: 'Submit Python Conference Deadlines in Various Formats' + basic: + title: 'Basic Information' + name: 'Conference Name' + year: 'Year' + type: 'Conference Type' + attendees: 'Expected Attendees' + url: 'Website URL' + location_date: + title: 'Location & Date' + city: 'City' + city_help: 'Enter only the city name' + country: 'Country' + country_help: 'Start typing to see matching countries with flags' + venue: 'Venue' + extra_places: "Extra Places" + extra_help: "For hybrid or online events, add extra comma-separated locations here." + start_date: 'Start Date' + end_date: 'End Date' + timezone: 'Timezone' + timezone_help: 'Start typing to select the timezone of the conference' + cfp: + title: 'Call for Proposals' + status: 'CfP Status' + tba: 'To Be Announced' + none: 'No CfP' + date: 'Use Date' + deadline: 'Submission Deadline' + deadline_help: 'The deadline for submitting talk proposals' + link: 'CfP Link' + additional_info: + title: 'Additional Information' + sponsor: 'Sponsorship URL' + finaid: 'Financial Aid URL' + mastodon: 'Mastodon URL' + bsky: 'Bluesky URL' + notes: 'Additional Notes' + notes_place: 'Additional notes about the conference' + submission_guidelines: 'Submission Guidelines' + generate_output: 'Generate Output' + generated_outputs: 'Generated Outputs' + csv_format: 'CSV Format' + yaml_format: 'YAML Format' + calendar_format: 'Calendar Format' + copy: 'Copy to Clipboard' + required: 'Please fill in all required fields marked with *.' diff --git a/_i18n/en/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/en/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..0a821095b40 --- /dev/null +++ b/_i18n/en/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,44 @@ +--- +title: How to get to talk at Python conferences? +author: Jesper Dramsch +layout: post +tags: ["Python", "CfP"] +--- + +Python conferences are an excellent platform for sharing knowledge, networking with peers, and staying up-to-date with the latest developments in the Python community. Speaking at a Python conference can be a great opportunity if you're passionate about Python and want to share your insights with a wider audience. In this blog post, we'll explore how to get to speak at Python conferences. + +## Be Invited +One way to get invited to speak at Python conferences is to have an established reputation in the community. Suppose you've contributed to open-source projects, written articles or blog posts about Python, or spoken at smaller meetups or events. In that case, you may catch the attention of conference organizers. + +Additionally, if you're an expert in a specific field, such as machine learning or web development, you may be invited to speak at conferences that focus on those topics. To increase your chances of being invited, attend conferences and meetups, participate in online discussions, and contribute to the Python community in any way you can. + +## Submit a Proposal to a Call for Proposal (CfP) + +Another way to get to speak at Python conferences is to submit a proposal to a Call for Proposals (CfP). Most conferences open up CfPs several months before the event, and anyone can submit a proposal. +When submitting a proposal, it's essential to remember that conference organizers seek original and engaging talks that appeal to a diverse audience. Ensure your submission is well-written, clear, and concise and addresses a topic relevant and interesting to the Python community. + +Here are a few [tips for submitting a successful proposal](/resources/good-conference-talk-proposals/): +- Choose a topic you're passionate about and have expertise in. +- Make sure your proposal is relevant to the conference theme or focus. +- Write a compelling title and summary that will grab the attention of conference organizers and attendees. +- Outline your talk in detail, including what you'll cover and how you'll present it. +- Include any supporting materials, such as code samples or slides, to give organizers a better sense of your presentation style and content. + +## Build Your Speaking Skills +If you're new to public speaking, it's a good idea to start small by speaking at local meetups or events. + +This will help you build your confidence and refine your presentation skills. As you gain more experience, you can branch out and speak at larger events, such as regional or national conferences. + +Ask for feedback from attendees and organizers after each talk, and use that feedback to improve your speaking skills. + +## Network with Other Speakers and Attendees +Finally, networking is vital to getting to speak at Python conferences. + +Attend as many conferences and meetups as possible, and try to connect with other speakers and attendees. + +By building relationships with other members of the Python community, you'll increase your visibility and credibility, which can lead to more speaking opportunities in the future. + +## Conclusion +In conclusion, getting to speak at Python conferences requires a combination of expertise, preparation, and networking. + +By following these tips, you can increase your chances of being invited to speak or successfully submitting a proposal to a CfP and ultimately sharing your knowledge with the broader Python community. diff --git a/_i18n/en/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/en/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..0ac23506205 --- /dev/null +++ b/_i18n/en/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: How to create a fantastic presentation for Python conferences? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Python conferences offer an excellent platform for developers to showcase their skills, share knowledge, and network with fellow professionals. + +Speaking at a Python conference can be a fantastic opportunity to gain recognition, build credibility, and make a valuable contribution to the Python community. However, presenting at a conference can also be daunting, especially if you are new to public speaking or have never presented before. In this resource, we will share some tips on how to speak at Python conferences and make your presentation a success. + +## Choose a topic that you are passionate about + +The first step to delivering a successful presentation is choosing a topic you are passionate about. If you are excited about your topic, your enthusiasm will show in your presentation. You will be more likely to engage and captivate your audience. Pick a topic relevant to the Python community and offers valuable insights or solutions to common problems. + +## Understand your audience + +Before you start preparing your presentation, it's essential to understand your audience's demographics, expertise level, and interests. This will help you tailor your content and delivery to meet their expectations and needs. For example, if your audience consists of beginner Python developers, you can simplify technical jargon and focus on fundamental concepts. + +## Create a compelling narrative + +A compelling narrative is a critical aspect of any successful presentation. It's essential to structure your presentation in a way that tells a story and keeps your audience engaged. Use anecdotes, case studies, and real-life examples to help illustrate your points and add a personal touch to your presentation. Make sure to highlight and present the most critical takeaways clearly and concisely. + +## Practice, practice, practice + +Practice is vital to delivering a polished and confident presentation. Rehearse your presentation multiple times until you feel comfortable with your content and delivery. Time your presentation to ensure that it fits within the allocated time frame. Consider recording your practice sessions and reviewing them to identify improvement areas. + +## Use visuals to support your message + +Visual aids like slides and diagrams can help support your message and keep your audience engaged. However, be careful not to overload your presentation with too many visuals, which can distract you from your message. Use graphics and images to illustrate complex concepts and data, and keep your slides simple and visually appealing. + +## Engage with your audience + +Engaging with your audience is a crucial aspect of a successful presentation. Encourage your audience to participate by asking questions, conducting polls, or using interactive tools. This will help keep your audience engaged and allow them to contribute to the discussion. Be prepared to answer questions and address any concerns or feedback that may arise. + +## Conclusion + +Speaking at a Python conference can be a great way to share your knowledge and make a valuable contribution to the community. Following these tips, you can prepare a compelling presentation that engages and resonates with your audience. Remember to choose a topic you are passionate about, understand your audience, create a compelling narrative, practice your delivery, use visuals to support your message, and engage with your audience. Good luck, and happy presenting! diff --git a/_i18n/en/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/en/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..625c409be21 --- /dev/null +++ b/_i18n/en/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,35 @@ +--- +title: What is a Python conference CfP? +author: Jesper Dramsch +layout: post +tags: ["Python", "CfP", "conference"] +--- + +A Call for Proposals (CfP) or Call for Participation is a common term used in academic, research, and professional communities to invite individuals or groups to submit proposals or abstracts for conferences, workshops, symposiums, and other events. + +Since the Python community is a bunch of lovely nerds, this same terminology made it into the Python vernacular. + +## What's a CfP? +In simple terms, a CfP is an open invitation to experts, scholars, researchers, and practitioners to present their ideas, research findings, and case studies in a particular field or area of interest. + +A CfP is typically issued by event organizers, conference committees, or academic institutions to solicit submissions from interested individuals or groups. + +## What are CfPs for? +The purpose of a CfP is to encourage a broad range of participants to engage with an event or a conference, ensuring a diversity of perspectives and ideas. + +CfPs often outline the event's theme, the topics of interest, and the submission guidelines. They also specify the types of submissions that are accepted, such as research papers, case studies, posters, or workshops. + +## How do you participate in a CfP? +The submission process for a CfP typically involves preparing a proposal or abstract that includes a summary of the proposed topic, the research methodology or approach, and the expected outcomes. + +Some academic CfPs may require a full paper submission, while others may ask for a short abstract or a summary. + +Python CfPs rarely require the submission of full materials, as they do not publish papers. However, it is vital to avoid the [common pitfall](/resources/common-pitfalls/) of promising solely future work. + +## Conclusion + +In summary, a CfP invites experts, scholars, researchers, and practitioners to submit proposals or abstracts for an event or conference. + +It plays a vital role in facilitating the sharing of knowledge and expertise, promoting discussions, and creating opportunities for networking among professionals in a particular field. + +If you are interested in attending or presenting at a conference or event, [keep an eye out for CfPs](https://pythondeadlin.es)! diff --git a/_i18n/en/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/en/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..5bb80a393cf --- /dev/null +++ b/_i18n/en/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,40 @@ +--- +title: How to write a great Python Conference Talk Proposal +author: Jesper Dramsch +layout: post +tags: ["Python", "conference", "CfP", "audience"] +--- + +Writing a good conference proposal can be challenging. Still, some key elements can help make your proposal stand out. Here are five essential components of a successful conference proposal. + +## The topic and why it's interesting +The first component of a good conference proposal is a clear and compelling description of the topic you plan to discuss. Communicating why your topic is relevant and exciting to the conference audience is essential. Be sure to highlight any unique or innovative aspects of your topic and any challenges or opportunities it presents. + +## The audience that will benefit from attending this talk/tutorial +Identifying your [target audience](/resources/find-target-audience/) is crucial in creating a successful conference proposal. + +Be specific about who will benefit from your talk or tutorial and what they will learn. + +Understanding your audience will help you tailor your content and ensure that you're providing valuable insights and takeaways. + +## The takeaway for the audience +What can attendees expect to gain from your talk or tutorial? Be clear about the key takeaways you hope to provide. + +This will help attendees evaluate whether your presentation aligns with their interests and needs. + +It will also help you structure your talk and stay on track to deliver the promised value. + +## Any background knowledge needed to understand the talk/tutorial +When crafting your proposal, it's important to consider what background knowledge your audience will need to understand and engage with your content. + +Be clear about any prerequisites, and provide links or resources that attendees can use to brush up on their knowledge before attending. + +## Approximate time breakdowns of how the material will be covered +A detailed breakdown of how you plan to cover your material is vital to help attendees understand what they can expect from your talk or tutorial. + +By outlining a clear structure and timeline for your presentation, you will help attendees stay engaged and focused on your content. It will also help you stay on track and cover all the key points you want to make. + +## Conclusion +In conclusion, a good conference proposal should provide a clear and compelling description of the topic, identify the [target audience](/resources/find-target-audience/) and their needs, clearly communicate the takeaways and any background knowledge required, and provide a detailed breakdown of the material. Including these essential components will increase the chances of your proposal being accepted and delivering a successful presentation at the conference. + +_This list expands on excellent points made by the [Pydata Global conference](https://pydata.org/global2022/present/)._ diff --git a/_i18n/en/_posts/2023-03-07-find-target-audience.md b/_i18n/en/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..26dc96dfb16 --- /dev/null +++ b/_i18n/en/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,48 @@ +--- +title: How do you define your target audience for a Python conference talk? +author: Jesper Dramsch +layout: post +tags: ["Python", "presentation", "conference", "audience"] +--- + +When it comes to submitting a proposal for a conference presentation, it's essential to define your target audience. Knowing who you are speaking to can help you tailor your presentation to the audience's needs, interests, and background knowledge. In this post, we will discuss how to define your target audience for a conference proposal and why it matters. + +## Consider their Job Role +First, you need to consider the job role of your target audience. Are they data scientists, machine learning or software engineers, researchers, or something else? + +Knowing their job role can help you determine what topics and techniques are most relevant to them. + +For example, if you present a new data visualization technique, data scientists and researchers may be more interested in how it works. + +At the same time, engineers may be more interested in how it can be implemented in their existing systems. + +## Think about Experience +Next, consider the experience level of your target audience. Are they beginners, intermediate, or advanced in the subject matter? + +This will affect how you present your ideas and how much background information you provide. + +For example, suppose your presentation is on a complex algorithm. In that case, an advanced audience may be interested in the technical details and code examples. At the same time, beginners may need a simplified explanation of the concepts to follow the presentation. + +## Consider a Secondary Niche +Believe me, I love talking about machine learning. But when people don't know me, they're unlikely to be interested in that talk. + +However, you could talk about "machine learning in medicine" or "applying neural networks in weather and climate prediction", making the talk a must-watch for certain people who might have missed the proposal otherwise. + +This is a way to tell your target audience exactly that a presentation is for them. + +## Why do we define our Target Audience? +Defining your target audience is crucial for two main reasons. + +First, it helps you focus your presentation on the most relevant and interesting topics for your audience. This can make your presentation more engaging and valuable for attendees. + +Second, it helps potential attendees decide if your presentation matches their needs and interests. + +Suppose they can easily see that your presentation targets their job role and experience level. In that case, they are more likely to attend and find value in your talk. + +## Consider the Conference itself +When writing your conference proposal, make sure to include information about your target audience. + +This could be as simple as including a statement like "This presentation is targeted towards data scientists with intermediate experience level." Providing this information can help reviewers and attendees understand who your talk is for and whether it aligns with the goals of the conference. + +## Conclusion +Defining your target audience is an essential step in preparing a conference presentation. By considering your audience's job role and experience level, you can tailor your presentation to their needs and interests, making it more engaging and useful for attendees. Be sure to include information about your target audience in your conference proposal to help reviewers and attendees understand who your talk is for and whether it's a good fit for them. diff --git a/_i18n/en/_posts/2023-03-08-common-pitfalls.md b/_i18n/en/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..d6283da3d6a --- /dev/null +++ b/_i18n/en/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,37 @@ +--- +title: 9 Common Pitfalls that get your Python Conference Talk Proposal rejected +author: Jesper Dramsch +layout: post +tags: ["Python", "CfP", "pitfalls"] +--- + +Suppose you're looking to submit a proposal for a conference talk. In that case, knowing what to avoid is essential to increase your chances of acceptance. Here are nine common pitfalls to watch out for: + +## Sales pitches +Remember that the conference is a community of creators and users of open-source scientific computing tools. While you can reference your closed-source product or platform, the audience will find the talk more interesting if they can try your techniques with the open-source PyData stack. Avoid making a hard sell, and focus on problem definition, proposed strategies, and business domain instead. + +## Repeated talks +Conferences prefer new talks and new speakers. If your talk is already available online, it will unlikely be accepted for the conference. Try to bring new insights, techniques, or perspectives on a topic that hasn't been covered before. + +## Lack of clarity +Your proposal should clearly communicate what your talk is about and what attendees can expect to learn. Suppose your proposal is unclear, rambling, or difficult to follow. In that case, reviewers may be unable to determine if your talk aligns with the conference's goals or is suitable for the intended audience. + +## Lack of originality +Reviewers seek unique, insightful, and innovative talks that offer fresh perspectives or new solutions to common problems. If your proposal covers a topic that has already been covered multiple times or doesn't provide any new insights or techniques, reviewers may pass on it. That doesn't mean a case study or new spin on an issue won't be accepted, but it's worth considering that added perspective. + +## Overly long proposals +Keep your proposal simple and clear. Good proposals typically provide all the vital information within 250 words. This is not a strict limit and varies per conference. This is a suggestion to help you stay focused and avoid losing the attention of the reviewers. + +## Lack of relevance +Make sure your talk aligns with the conference's theme or focus. Suppose your proposal is only tangentially related to the conference's goals. In that case, reviewers may not see how it fits into the larger picture or how it would benefit attendees. + +## Future work +While discussing future work is exciting and could be mentioned in your talk, the core content of the talk should already be shaped, and you should be able to describe it in your proposal. Don't rely too heavily on future data collection or future prototyping because things often don't go as expected. Be sure to provide concrete examples and use cases. + +## Inappropriate or offensive content +Keep your language and tone professional and respectful, and avoid controversial or sensitive topics that could offend or alienate attendees. Proposals containing inappropriate, offensive, or discriminatory content will likely be rejected. + +## Poor fit with the conference format +Conferences have different formats, from lightning talks to workshops to keynote speeches. Ensure your proposal aligns with the format and duration of the conference and can be delivered effectively in that format. Consider any equipment, materials, or resources required for your talk. + +By avoiding these common pitfalls, you can increase your chances of submitting a successful proposal for a conference talk that aligns with the conference's goals, is relevant to attendees, and delivers fresh insights or techniques. diff --git a/_i18n/en/_posts/2023-03-09-what-about.md b/_i18n/en/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..ac9456b5d53 --- /dev/null +++ b/_i18n/en/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: What should my Python conference talk be about? +author: Jesper Dramsch +layout: post +tags: ["Python", "presentation"] +--- + +We often get a paradox conundrum when we finally decide to give a talk at a Python conference. We learned about so many exciting things. So much is interesting. But what should my Python talk be about?! + +So, Congratulations on deciding to present on Python! You're eager to share your knowledge and experience with others. Let's dive in! + +First things first, think about your audience. Who do you want to attend your talk? Are they beginners, intermediate or advanced Python users? Do they have a specific interest or problem they want to solve using Python? Understanding your audience's expertise and interest will help you decide on a topic that will appeal to them and keep them engaged. + +Next, consider the type of talk you want to give. Do you want to dive deep into a complex topic or keep it simple with a hands-on tutorial? Do you want to focus on Python's mathematical capabilities or practical applications? It's crucial to pick a topic that aligns with your expertise and passion and keeps your audience in mind. + +Once you've decided on your topic and type of talk, think about the tone you want to set. Do you want to be light-hearted and funny or more severe and cautionary? There's no right or wrong answer here, but ensure your tone is appropriate for your topic and audience. + +Remember, your talk aims to educate and inspire others about Python, so make sure your takeaways are clear and valuable. What should your audience learn or take away from your talk? How can they apply what they've learned in their Python projects or careers? + +In summary, when deciding on the topic of your Python talk, consider your audience, the type of talk, and the tone you want to set. Make sure your takeaways are clear and valuable to your audience. And most importantly, have fun and share your passion for Python with others! diff --git a/_i18n/en/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/en/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..3607a97bfab --- /dev/null +++ b/_i18n/en/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,50 @@ +--- +title: Exploring Additional Resources for Conference Deadlines +author: Jesper Dramsch +layout: post +tags: ["Python", "conferences"] +--- + +Pythondeadlin.es has been a popular destination for the Python community to find conference deadlines in one convenient location for the last year. + +However, it's important to be aware of other valuable resources that can enhance your conference planning experience and foster collaboration within the Python community. + +In this blog post, we will delve into two such resources that play a vital role in aggregating conference information and uniting the Python community. Let's dive in! + +## Python-Organizers GitHub: A Treasure Trove of Information + +The [Python-Organizers GitHub repository](https://github.com/python-organizers/conferences) is a valuable resource for conference organizers, attendees, and speakers alike. + +It serves as a centralized hub of conference data, providing an organized collection of conferences, submission deadlines, event dates, sponsor information, and location details. This collaborative platform encourages event organizers to share their conference information and contribute to the accuracy and comprehensiveness of the data. + +By leveraging the Python-Organizers GitHub, you can tap into a wealth of knowledge and collaborate with fellow organizers. + +Whether you are planning to attend or present at a Python conference, this resource empowers you to make informed decisions and stay up to date with the latest conference deadlines. + +The GitHub repository makes interaction easy and fosters community engagement and encourages individuals to actively participate in the promotion, growth and success of Python conferences worldwide. + +## The Official Python Event List: Uniting the Community + +The [official Python event list](https://www.python.org/events/) managed over the Python mailing list serves as a unifying platform for the Python community. + +This comprehensive resource provides an overview of upcoming Python events, including conferences, meetups, workshops, and more. While it offers information on deadlines, it goes beyond that to promote collaboration, networking, and idea sharing within the community. + +You can subscribe to the mailing list, but the webpage offers you a map and a Google calendar you can easily subscribe to to get updates. This allows you to visualize and plan your conference schedule more effectively. + +This inclusive platform brings together Python enthusiasts from diverse backgrounds and encourages them to connect, learn, and contribute to the vibrant Python ecosystem. + +## Embracing Collaboration for Enhanced Conference Planning + +While Pythondeadlin.es remains a valuable resource, it's important to explore the wider landscape of conference information aggregation. + +The Python-Organizers GitHub repository and the official Python event list are instrumental in uniting the Python community and fostering collaboration. + +By utilizing these resources, you can stay up to date with upcoming Python events, connect with like-minded individuals, and actively contribute to the growth and success of Python conferences. Embracing collaboration enables us to create stronger, more vibrant conferences that cater to the diverse needs and interests of the Python community. + +Make sure to check out the following resources for more information: +- [Python-Organizers GitHub](https://github.com/python-organizers/conferences) +- [Official Python Event List](https://www.python.org/events/) + +By utilizing these platforms, we can stay informed about upcoming Python events, connect with like-minded individuals, and actively contribute to the success of our conferences. Let's collaborate, share our knowledge, and forge a stronger Python community. + +Together, we can shape the future of Python events and foster an environment where everyone can learn, grow, and thrive. diff --git a/_i18n/en/calendar/description.md b/_i18n/en/calendar/description.md new file mode 100644 index 00000000000..ed5f7433690 --- /dev/null +++ b/_i18n/en/calendar/description.md @@ -0,0 +1,6 @@ +The PythonDeadlin.es overview of deadlines and Pyhton conference dates in a calendar. + +You can optionally export **all deadlines** to Google Calendar or +iCal. This calendar is great for keeping track of the actual deadlines! + +Alternatively, subscribe to **upcoming Python events** on your Google Calendar or iCal. This one is the classic "event calendar". diff --git a/_i18n/en/dates/pretty_dates.html b/_i18n/en/dates/pretty_dates.html new file mode 100644 index 00000000000..aa7863a87d4 --- /dev/null +++ b/_i18n/en/dates/pretty_dates.html @@ -0,0 +1,53 @@ +{% if include.start == nil and include.end == nil %} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture %} +{% elsif include.start == nil %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.until" %} {{ end_month }} {{ end_day }}, {{ end_year }}{% endcapture %} +{% elsif include.end == nil %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign start_day = start_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.from" %} {{ start_month }} {{ start_day }}, {{ start_year }}{% endcapture %} +{% else %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + + {% if start_date == end_date %} + {%- comment -%}When start and end dates are the same{%- endcomment -%} + {% assign day = start_date | date: "%-d" %} + {% assign year = start_date | date: "%Y" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture pretty_date %}{{ month }} {{ day }}, {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" %} + {%- comment -%}When start and end dates are in the same month{% endcomment %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ month }} {{ start_day }} – {{ end_day }}, {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" %} + {%- comment -%}When start and end dates are in the same year{%- endcomment -%} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_month }} {{ start_day }} – {{ end_month }} {{ end_day }}, {{ year }}{% endcapture %} + + {% else %} + {%- comment -%}When start and end dates are in different years{%- endcomment -%} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{{ start_month}} {{start_day}}, {{ start_year }} – {{ end_month }} {{ end_day }}, {{ end_year }}{% endcapture %} + {% endif %} +{% endif %}{{pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/en/footer/jesper.md b/_i18n/en/footer/jesper.md new file mode 100644 index 00000000000..b0be13f4ff6 --- /dev/null +++ b/_i18n/en/footer/jesper.md @@ -0,0 +1 @@ +Jesper Dramsch is the creator of ML.recipes, data-science-gui.de, Late to the Party 🎉 and the Latent Space Community. diff --git a/_i18n/en/footer/maintainer.md b/_i18n/en/footer/maintainer.md new file mode 100644 index 00000000000..4ee970b33d3 --- /dev/null +++ b/_i18n/en/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

Created by Jesper Dramsch • Open Source • Community Driven

+

Inspired by aideadlin.es • Archiving {{confs | size}} Python conferences since 2022

diff --git a/_i18n/en/footer/terms.md b/_i18n/en/footer/terms.md new file mode 100644 index 00000000000..f3841e128f6 --- /dev/null +++ b/_i18n/en/footer/terms.md @@ -0,0 +1,3 @@ +

No guarantee for correctness, please correct mistakes by submitting a pull request.

+ +TermsPrivacy Policy diff --git a/_i18n/en/formatter/countries.html b/_i18n/en/formatter/countries.html new file mode 100644 index 00000000000..1459ca319dc --- /dev/null +++ b/_i18n/en/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: 'Afghanistan', code: 'AFG', flag: '🇦🇫' }, +{ name: 'Albania', code: 'ALB', flag: '🇦🇱' }, +{ name: 'Algeria', code: 'DZA', flag: '🇩🇿' }, +{ name: 'Andorra', code: 'AND', flag: '🇦🇩' }, +{ name: 'Angola', code: 'AGO', flag: '🇦🇴' }, +{ name: 'Antigua and Barbuda', code: 'ATG', flag: '🇦🇬' }, +{ name: 'Argentina', code: 'ARG', flag: '🇦🇷' }, +{ name: 'Armenia', code: 'ARM', flag: '🇦🇲' }, +{ name: 'Australia', code: 'AUS', flag: '🇦🇺' }, +{ name: 'Austria', code: 'AUT', flag: '🇦🇹' }, +{ name: 'Azerbaijan', code: 'AZE', flag: '🇦🇿' }, +{ name: 'Bahamas', code: 'BHS', flag: '🇧🇸' }, +{ name: 'Bahrain', code: 'BHR', flag: '🇧🇭' }, +{ name: 'Bangladesh', code: 'BGD', flag: '🇧🇩' }, +{ name: 'Barbados', code: 'BRB', flag: '🇧🇧' }, +{ name: 'Belarus', code: 'BLR', flag: '🇧🇾' }, +{ name: 'Belgium', code: 'BEL', flag: '🇧🇪' }, +{ name: 'Belize', code: 'BLZ', flag: '🇧🇿' }, +{ name: 'Benin', code: 'BEN', flag: '🇧🇯' }, +{ name: 'Bhutan', code: 'BTN', flag: '🇧🇹' }, +{ name: 'Bolivia', code: 'BOL', flag: '🇧🇴' }, +{ name: 'Bosnia and Herzegovina', code: 'BIH', flag: '🇧🇦' }, +{ name: 'Botswana', code: 'BWA', flag: '🇧🇼' }, +{ name: 'Brazil', code: 'BRA', flag: '🇧🇷' }, +{ name: 'Brunei', code: 'BRN', flag: '🇧🇳' }, +{ name: 'Bulgaria', code: 'BGR', flag: '🇧🇬' }, +{ name: 'Burkina Faso', code: 'BFA', flag: '🇧🇫' }, +{ name: 'Burundi', code: 'BDI', flag: '🇧🇮' }, +{ name: 'Cambodia', code: 'KHM', flag: '🇰🇭' }, +{ name: 'Cameroon', code: 'CMR', flag: '🇨🇲' }, +{ name: 'Canada', code: 'CAN', flag: '🇨🇦' }, +{ name: 'Cape Verde', code: 'CPV', flag: '🇨🇻' }, +{ name: 'Central African Republic', code: 'CAF', flag: '🇨🇫' }, +{ name: 'Chad', code: 'TCD', flag: '🇹🇩' }, +{ name: 'Chile', code: 'CHL', flag: '🇨🇱' }, +{ name: 'China', code: 'CHN', flag: '🇨🇳' }, +{ name: 'Colombia', code: 'COL', flag: '🇨🇴' }, +{ name: 'Comoros', code: 'COM', flag: '🇰🇲' }, +{ name: 'Congo', code: 'COG', flag: '🇨🇬' }, +{ name: 'Costa Rica', code: 'CRI', flag: '🇨🇷' }, +{ name: 'Croatia', code: 'HRV', flag: '🇭🇷' }, +{ name: 'Cuba', code: 'CUB', flag: '🇨🇺' }, +{ name: 'Cyprus', code: 'CYP', flag: '🇨🇾' }, +{ name: 'Czech Republic', code: 'CZE', flag: '🇨🇿' }, +{ name: 'Denmark', code: 'DNK', flag: '🇩🇰' }, +{ name: 'Djibouti', code: 'DJI', flag: '🇩🇯' }, +{ name: 'Dominica', code: 'DMA', flag: '🇩🇲' }, +{ name: 'Dominican Republic', code: 'DOM', flag: '🇩🇴' }, +{ name: 'Ecuador', code: 'ECU', flag: '🇪🇨' }, +{ name: 'Egypt', code: 'EGY', flag: '🇪🇬' }, +{ name: 'El Salvador', code: 'SLV', flag: '🇸🇻' }, +{ name: 'Equatorial Guinea', code: 'GNQ', flag: '🇬🇶' }, +{ name: 'Eritrea', code: 'ERI', flag: '🇪🇷' }, +{ name: 'Estonia', code: 'EST', flag: '🇪🇪' }, +{ name: 'Ethiopia', code: 'ETH', flag: '🇪🇹' }, +{ name: 'Fiji', code: 'FJI', flag: '🇫🇯' }, +{ name: 'Finland', code: 'FIN', flag: '🇫🇮' }, +{ name: 'France', code: 'FRA', flag: '🇫🇷' }, +{ name: 'Gabon', code: 'GAB', flag: '🇬🇦' }, +{ name: 'Gambia', code: 'GMB', flag: '🇬🇲' }, +{ name: 'Georgia', code: 'GEO', flag: '🇬🇪' }, +{ name: 'Germany', code: 'DEU', flag: '🇩🇪' }, +{ name: 'Ghana', code: 'GHA', flag: '🇬🇭' }, +{ name: 'Greece', code: 'GRC', flag: '🇬🇷' }, +{ name: 'Grenada', code: 'GRD', flag: '🇬🇩' }, +{ name: 'Guatemala', code: 'GTM', flag: '🇬🇹' }, +{ name: 'Guinea', code: 'GIN', flag: '🇬🇳' }, +{ name: 'Guinea-Bissau', code: 'GNB', flag: '🇬🇼' }, +{ name: 'Guyana', code: 'GUY', flag: '🇬🇾' }, +{ name: 'Haiti', code: 'HTI', flag: '🇭🇹' }, +{ name: 'Honduras', code: 'HND', flag: '🇭🇳' }, +{ name: 'Hungary', code: 'HUN', flag: '🇭🇺' }, +{ name: 'Iceland', code: 'ISL', flag: '🇮🇸' }, +{ name: 'India', code: 'IND', flag: '🇮🇳' }, +{ name: 'Indonesia', code: 'IDN', flag: '🇮🇩' }, +{ name: 'Iran', code: 'IRN', flag: '🇮🇷' }, +{ name: 'Iraq', code: 'IRQ', flag: '🇮🇶' }, +{ name: 'Ireland', code: 'IRL', flag: '🇮🇪' }, +{ name: 'Israel', code: 'ISR', flag: '🇮🇱' }, +{ name: 'Italy', code: 'ITA', flag: '🇮🇹' }, +{ name: 'Jamaica', code: 'JAM', flag: '🇯🇲' }, +{ name: 'Japan', code: 'JPN', flag: '🇯🇵' }, +{ name: 'Jordan', code: 'JOR', flag: '🇯🇴' }, +{ name: 'Kazakhstan', code: 'KAZ', flag: '🇰🇿' }, +{ name: 'Kenya', code: 'KEN', flag: '🇰🇪' }, +{ name: 'Kiribati', code: 'KIR', flag: '🇰🇮' }, +{ name: 'North Korea', code: 'PRK', flag: '🇰🇵' }, +{ name: 'South Korea', code: 'KOR', flag: '🇰🇷' }, +{ name: 'Kuwait', code: 'KWT', flag: '🇰🇼' }, +{ name: 'Kyrgyzstan', code: 'KGZ', flag: '🇰🇬' }, +{ name: 'Laos', code: 'LAO', flag: '🇱🇦' }, +{ name: 'Latvia', code: 'LVA', flag: '🇱🇻' }, +{ name: 'Lebanon', code: 'LBN', flag: '🇱🇧' }, +{ name: 'Lesotho', code: 'LSO', flag: '🇱🇸' }, +{ name: 'Liberia', code: 'LBR', flag: '🇱🇷' }, +{ name: 'Libya', code: 'LBY', flag: '🇱🇾' }, +{ name: 'Liechtenstein', code: 'LIE', flag: '🇱🇮' }, +{ name: 'Lithuania', code: 'LTU', flag: '🇱🇹' }, +{ name: 'Luxembourg', code: 'LUX', flag: '🇱🇺' }, +{ name: 'Macedonia', code: 'MKD', flag: '🇲🇰' }, +{ name: 'Madagascar', code: 'MDG', flag: '🇲🇬' }, +{ name: 'Malawi', code: 'MWI', flag: '🇲🇼' }, +{ name: 'Malaysia', code: 'MYS', flag: '🇲🇾' }, +{ name: 'Maldives', code: 'MDV', flag: '🇲🇻' }, +{ name: 'Mali', code: 'MLI', flag: '🇲🇱' }, +{ name: 'Malta', code: 'MLT', flag: '🇲🇹' }, +{ name: 'Marshall Islands', code: 'MHL', flag: '🇲🇭' }, +{ name: 'Mauritania', code: 'MRT', flag: '🇲🇷' }, +{ name: 'Mauritius', code: 'MUS', flag: '🇲🇺' }, +{ name: 'Mexico', code: 'MEX', flag: '🇲🇽' }, +{ name: 'Micronesia', code: 'FSM', flag: '🇫🇲' }, +{ name: 'Moldova', code: 'MDA', flag: '🇲🇩' }, +{ name: 'Monaco', code: 'MCO', flag: '🇲🇨' }, +{ name: 'Mongolia', code: 'MNG', flag: '🇲🇳' }, +{ name: 'Montenegro', code: 'MNE', flag: '🇲🇪' }, +{ name: 'Morocco', code: 'MAR', flag: '🇲🇦' }, +{ name: 'Mozambique', code: 'MOZ', flag: '🇲🇿' }, +{ name: 'Myanmar', code: 'MMR', flag: '🇲🇲' }, +{ name: 'Namibia', code: 'NAM', flag: '🇳🇦' }, +{ name: 'Nauru', code: 'NRU', flag: '🇳🇷' }, +{ name: 'Nepal', code: 'NPL', flag: '🇳🇵' }, +{ name: 'Netherlands', code: 'NLD', flag: '🇳🇱' }, +{ name: 'New Zealand', code: 'NZL', flag: '🇳🇿' }, +{ name: 'Nicaragua', code: 'NIC', flag: '🇳🇮' }, +{ name: 'Niger', code: 'NER', flag: '🇳🇪' }, +{ name: 'Nigeria', code: 'NGA', flag: '🇳🇬' }, +{ name: 'Norway', code: 'NOR', flag: '🇳🇴' }, +{ name: 'Oman', code: 'OMN', flag: '🇴🇲' }, +{ name: 'Pakistan', code: 'PAK', flag: '🇵🇰' }, +{ name: 'Palau', code: 'PLW', flag: '🇵🇼' }, +{ name: 'Panama', code: 'PAN', flag: '🇵🇦' }, +{ name: 'Papua New Guinea', code: 'PNG', flag: '🇵🇬' }, +{ name: 'Paraguay', code: 'PRY', flag: '🇵🇾' }, +{ name: 'Peru', code: 'PER', flag: '🇵🇪' }, +{ name: 'Philippines', code: 'PHL', flag: '🇵🇭' }, +{ name: 'Poland', code: 'POL', flag: '🇵🇱' }, +{ name: 'Portugal', code: 'PRT', flag: '🇵🇹' }, +{ name: 'Qatar', code: 'QAT', flag: '🇶🇦' }, +{ name: 'Romania', code: 'ROU', flag: '🇷🇴' }, +{ name: 'Russia', code: 'RUS', flag: '🇷🇺' }, +{ name: 'Rwanda', code: 'RWA', flag: '🇷🇼' }, +{ name: 'Saint Kitts and Nevis', code: 'KNA', flag: '🇰🇳' }, +{ name: 'Saint Lucia', code: 'LCA', flag: '🇱🇨' }, +{ name: 'Saint Vincent and the Grenadines', code: 'VCT', flag: '🇻🇨' }, +{ name: 'Samoa', code: 'WSM', flag: '🇼🇸' }, +{ name: 'San Marino', code: 'SMR', flag: '🇸🇲' }, +{ name: 'Sao Tome and Principe', code: 'STP', flag: '🇸🇹' }, +{ name: 'Saudi Arabia', code: 'SAU', flag: '🇸🇦' }, +{ name: 'Senegal', code: 'SEN', flag: '🇸🇳' }, +{ name: 'Serbia', code: 'SRB', flag: '🇷🇸' }, +{ name: 'Seychelles', code: 'SYC', flag: '🇸🇨' }, +{ name: 'Sierra Leone', code: 'SLE', flag: '🇸🇱' }, +{ name: 'Singapore', code: 'SGP', flag: '🇸🇬' }, +{ name: 'Slovakia', code: 'SVK', flag: '🇸🇰' }, +{ name: 'Slovenia', code: 'SVN', flag: '🇸🇮' }, +{ name: 'Solomon Islands', code: 'SLB', flag: '🇸🇧' }, +{ name: 'Somalia', code: 'SOM', flag: '🇸🇴' }, +{ name: 'South Africa', code: 'ZAF', flag: '🇿🇦' }, +{ name: 'South Sudan', code: 'SSD', flag: '🇸🇸' }, +{ name: 'Spain', code: 'ESP', flag: '🇪🇸' }, +{ name: 'Sri Lanka', code: 'LKA', flag: '🇱🇰' }, +{ name: 'Sudan', code: 'SDN', flag: '🇸🇩' }, +{ name: 'Suriname', code: 'SUR', flag: '🇸🇷' }, +{ name: 'Swaziland', code: 'SWZ', flag: '🇸🇿' }, +{ name: 'Sweden', code: 'SWE', flag: '🇸🇪' }, +{ name: 'Switzerland', code: 'CHE', flag: '🇨🇭' }, +{ name: 'Syria', code: 'SYR', flag: '🇸🇾' }, +{ name: 'Taiwan', code: 'TWN', flag: '🇹🇼' }, +{ name: 'Tajikistan', code: 'TJK', flag: '🇹🇯' }, +{ name: 'Tanzania', code: 'TZA', flag: '🇹🇿' }, +{ name: 'Thailand', code: 'THA', flag: '🇹🇭' }, +{ name: 'Timor-Leste', code: 'TLS', flag: '🇹🇱' }, +{ name: 'Togo', code: 'TGO', flag: '🇹🇬' }, +{ name: 'Tonga', code: 'TON', flag: '🇹🇴' }, +{ name: 'Trinidad and Tobago', code: 'TTO', flag: '🇹🇹' }, +{ name: 'Tunisia', code: 'TUN', flag: '🇹🇳' }, +{ name: 'Turkey', code: 'TUR', flag: '🇹🇷' }, +{ name: 'Turkmenistan', code: 'TKM', flag: '🇹🇲' }, +{ name: 'Tuvalu', code: 'TUV', flag: '🇹🇻' }, +{ name: 'Uganda', code: 'UGA', flag: '🇺🇬' }, +{ name: 'Ukraine', code: 'UKR', flag: '🇺🇦' }, +{ name: 'United Arab Emirates', code: 'ARE', flag: '🇦🇪' }, +{ name: 'United Kingdom', code: 'GBR', flag: '🇬🇧' }, +{ name: 'United States', code: 'USA', flag: '🇺🇸' }, +{ name: 'Uruguay', code: 'URY', flag: '🇺🇾' }, +{ name: 'Uzbekistan', code: 'UZB', flag: '🇺🇿' }, +{ name: 'Vanuatu', code: 'VUT', flag: '🇻🇺' }, +{ name: 'Vatican City', code: 'VAT', flag: '🇻🇦' }, +{ name: 'Venezuela', code: 'VEN', flag: '🇻🇪' }, +{ name: 'Vietnam', code: 'VNM', flag: '🇻🇳' }, +{ name: 'Yemen', code: 'YEM', flag: '🇾🇪' }, +{ name: 'Zambia', code: 'ZMB', flag: '🇿🇲' }, +{ name: 'Zimbabwe', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/en/formatter/submission.html b/_i18n/en/formatter/submission.html new file mode 100644 index 00000000000..313e42f7efd --- /dev/null +++ b/_i18n/en/formatter/submission.html @@ -0,0 +1,56 @@ +
+
How to Submit Your Conference Information
+ +
+
1. Python-Organizers CSV Format
+

+ Add your conference to the + python-organizers/conferences + repository: +

+
    +
  • Fork the repository
  • +
  • Edit the corresponding year's CSV file
  • +
  • Add your conference data row
  • +
  • Submit a pull request
  • +
+
+ +
+
2. PythonDeadlin.es YAML Format
+

+ Add your conference to + jesperdramsch/python-deadlines: +

+
    +
  • Fork the repository
  • +
  • Edit the `_data/conferences.yml` file
  • +
  • Add your conference YAML data at the appropriate place
  • +
  • Submit a pull request
  • +
+
+ +
+
3. Python.org Calendar Format
+

Submit your conference to the official Python events calendar:

+
    +
  • + Email + events[at]python.org + with the calendar format text +
  • +
  • Include the subject line: "Python Event Submission: [Your Conference Name]"
  • +
  • Wait for confirmation from the Python events team
  • +
+
+ +
+ Tip: Submit to all three platforms to maximize visibility + of your Python conference! +
+
diff --git a/_i18n/en/frontpage/description.md b/_i18n/en/frontpage/description.md new file mode 100644 index 00000000000..9253f718b89 --- /dev/null +++ b/_i18n/en/frontpage/description.md @@ -0,0 +1,5 @@ +This community tool serves as a central repository for deadlines of calls for participitation, proposals, workshops, and tutorials at Python conferences. + +The dates are made available as countdowns, in local timezones and even as a Google calendar below! + +Deadlines are shown in your local time. To view them in conference website timezones, click on the conference. diff --git a/_i18n/en/frontpage/hook.md b/_i18n/en/frontpage/hook.md new file mode 100644 index 00000000000..d77428c34e4 --- /dev/null +++ b/_i18n/en/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es curates your favourite Python conferences. diff --git a/_i18n/en/maps/description.md b/_i18n/en/maps/description.md new file mode 100644 index 00000000000..89ad4c675d8 --- /dev/null +++ b/_i18n/en/maps/description.md @@ -0,0 +1,3 @@ +Overview of deadlines and conference dates on a map. + +Below are all the future Python conferences listed on PythonDeadlin.es in a nice spatial format. diff --git a/_i18n/en/resources/description.md b/_i18n/en/resources/description.md new file mode 100644 index 00000000000..293b9034c21 --- /dev/null +++ b/_i18n/en/resources/description.md @@ -0,0 +1,5 @@ +This page is dedicated to helping you craft outstanding Call for Proposals (CfPs) for Python conferences. Here, you'll find a collection of blog posts, guides, and tips on writing compelling proposals. + +Our resources cover various aspects of CfP writing, from choosing a topic to structuring your submission. Whether you're a first-time speaker or a seasoned presenter, these tools aim to enhance your proposal-writing skills. + +Explore our curated content to increase your chances of getting your talk or workshop accepted at Python events worldwide. diff --git a/_i18n/en/search/description.md b/_i18n/en/search/description.md new file mode 100644 index 00000000000..70df08abb74 --- /dev/null +++ b/_i18n/en/search/description.md @@ -0,0 +1,5 @@ +The search results from our comprehensive database of Python conference deadlines and events. The results are presented as a list of relevant pages matching your query. + +Each result includes key details such as the conference name, deadline dates, and brief descriptions. Deadlines are shown in your local time zone. + +Click on a conference name to view more detailed information, including guidelines and links to the official conference website. diff --git a/_i18n/en/series/description.md b/_i18n/en/series/description.md new file mode 100644 index 00000000000..068991f9ebd --- /dev/null +++ b/_i18n/en/series/description.md @@ -0,0 +1,4 @@ +This section of our community tool serves as a comprehensive directory of recurring Python conference series. Here, you'll find an overview of regular events, their typical schedules, and historical information. + +The series are presented with brief descriptions and links to past events, helping you plan your long-term conference participation. +Check out a series to view more details and access information about its upcoming and past events. diff --git a/_i18n/en/trademark/django.md b/_i18n/en/trademark/django.md new file mode 100644 index 00000000000..d3139ebf45d --- /dev/null +++ b/_i18n/en/trademark/django.md @@ -0,0 +1,2 @@ +

Django is a registered trademark of the Django Software Foundation. This website, pythondeadlin.es, is not affiliated with, endorsed by, or sponsored by the Django Software Foundation or any Django event. All trademarks and logos used on this site remain the property of their respective owners. Any reference to Django or other trademarks is for informational purposes only and does not imply association with the trademark holders.

+

For more information about the Django Software Foundation and its trademark, visit https://www.djangoproject.com/foundation/.

diff --git a/_i18n/en/trademark/generic.md b/_i18n/en/trademark/generic.md new file mode 100644 index 00000000000..d85f883b05b --- /dev/null +++ b/_i18n/en/trademark/generic.md @@ -0,0 +1 @@ +

Any use of trademarks or logos established by events listed on this site is for informational purposes only and does not imply association with the respective trademark holders. If you are a trademark holder and would like your trademark to be removed from this site, please contact us.

diff --git a/_i18n/en/trademark/pycon.md b/_i18n/en/trademark/pycon.md new file mode 100644 index 00000000000..21304710d7e --- /dev/null +++ b/_i18n/en/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon, and PyLadies are registered trademarks of the Python Software Foundation. This website, pythondeadlin.es, is not affiliated with, endorsed by, or sponsored by the Python Software Foundation or any PyCon event. All trademarks and logos used on this site remain the property of their respective owners. Any reference to PyCon or other trademarks is for informational purposes only and does not imply association with the trademark holders.

diff --git a/_i18n/en/trademark/pydata.md b/_i18n/en/trademark/pydata.md new file mode 100644 index 00000000000..d3bdc688493 --- /dev/null +++ b/_i18n/en/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS, PyData, and Fiscally Sponsored Projects are registered trademarks of NumFOCUS. This website, pythondeadlin.es, is not affiliated with, endorsed by, or sponsored by the NumFOCUS or any PyData or affiliated event. All trademarks and logos used on this site remain the property of their respective owners. Any reference to NumFOCUS, PyData, or other trademarks is for informational purposes only and does not imply association with the trademark holders.

diff --git a/_i18n/es.yml b/_i18n/es.yml new file mode 100644 index 00000000000..bf90a9dcd2d --- /dev/null +++ b/_i18n/es.yml @@ -0,0 +1,240 @@ +--- +global: + current: 'es' + choose: 'Elija Idioma' + sub_filter: 'Filtrar por Subcategoría:' + cfp: 'Llamada por participación' + cfp_ext: 'CfP extendido de' + subscribe: 'Suscribirse' +titles: + default: 'Fechas Limites de Conferencias de Python ' + archive: 'Conferencias anteriores de Python' + visit_archive: 'Visitar el Archivo' + calendar: 'Calendario de conferencias de Python' + map: 'Mapa de conferencias de Python' + a404: 'Página No Encontrada' + privacy: 'Privacidad' + resources: 'Recursos para submeter CfP' + series: 'Lista de Series de Eventos de Python' + impressum: 'Condiciones' + past_events: 'Eventos Pasados' + past_cfps: 'Llamadas pasadas' + search: 'Buscar' + about: 'Sobre las fechas de conferencias de Python' + languages: 'Idiomas Disponibles' + formatter: 'Herramienta de Formato' +buttons: + ical: Obtener el iCal + google: Añadir al Calendario de Google + github: Enviar una Conferencia en GitHub + all_selected: Todas las Conferencias + none_selected: Ninguna Seleccionada +description: + summary: 'Resumen de la conferencia y sus instancias a lo largo de los años.' +header: + countdown: 'Fechas' + calendar: 'Calendario' + maps: 'Mapa' + series: 'Serie' + resources: 'Recursos' + formatter: 'Formateador' + course: 'Curso por Email' + articles: 'Comenzando' +conference: + title: 'Fechas de Conferencias' + finaid: 'Ayuda financiera' + sponsor: 'Oportunidad de patrocinio' + all: 'Todas conferencias de ' + download_dl: 'Descargar fecha límite de la conferencia' + download_date: 'Descargar datos de la conferencia' + deadline_tz_theirs: 'Fecha límite en la zona horaria de la conferencia' + deadline_tz_local: "Fecha límite en sua zona horaria " +summary: + title: 'Resumen de la Conferencia' +subs: + PY: 'Python General' + SCIPY: 'Python Científico' + DATA: 'Python para Datos' + WEB: 'Python para Web' + BIZ: 'Python para Negocios' + GEO: 'Python para la Tierra' + CAMP: 'Campamentos de Python' + DAY: 'Día de Python' +series: + always: 'Todos los años en' + place: + last: 'Última conferencia en' + next: 'Próxima conferencia en' + year: + last: 'Ùltimo año en' + next: 'Próximo año en' +times: + tba: "Por anunciar" + from: "Desde" + until: "Hasta" + normal: + days: 'dias' + hours: 'horas' + minutes: 'minutos' + seconds: 'segundas' + short: + days: 'd' + hours: 'h' + minutes: 'm' + seconds: 's' + months: + January: 'enero' + February: 'febrero' + March: 'marzo' + April: 'abril' + May: 'mayo' + June: 'junio' + July: 'julio' + August: 'agosto' + September: 'septiembre' + October: 'octubre' + November: 'noviembre' + December: 'diciembre' +social: + twitter: 'Tweet Conferencia' + facebook: 'Compartir Conferencia en FB' + linkedin: 'Enlace Conferencia en LinkedIn' + whatsapp: 'Enviar Conferencia en WhatsApp' + email: 'Email Conferencia' +search: + no-results: 'No ha encontrado resultados.' + error: 'Hay un error en el indice de busca. Por favor prueba de nuevo mas tarde.' +about: + toggle_fullscreen: "Alternar modo de presentación de pantalla completa" + previous_slide: "Diapositiva anterior" + next_slide: "Siguiente diapositiva" + tagline: "¡Nunca pierdas otra fecha límite de conferencia Python!" + hero_description: "La plataforma impulsada por la comunidad que ayuda a los desarrolladores de Python a descubrir, seguir y enviar propuestas a conferencias en todo el mundo." + problem: + title: "El Desafío" + description: "Hacer seguimiento de las fechas límite de conferencias Python en diferentes sitios web, zonas horarias y formatos consume tiempo y es propenso a errores. Muchos desarrolladores pierden oportunidades de compartir su conocimiento porque descubren las convocatorias demasiado tarde." + solution: + title: "Nuestra Solución" + description: "Pythondeadlin.es consolida todas las fechas límite de conferencias Python en un solo lugar, con conversión automática de zona horaria, múltiples opciones de recordatorio e información detallada para ayudarte a planificar tus propuestas de manera efectiva." + features: + title: "Características Principales" + tracking: + title: "Seguimiento Completo" + description: "Mantente al día con cada fecha límite de convocatoria de propuestas (CfP) para conferencias Python en todo el mundo con temporizadores de cuenta regresiva personalizados en tu zona horaria local." + notifications: + title: "Notificaciones Flexibles" + description: "Elige cómo quieres recibir recordatorios: suscríbete vía iCal, Google Calendar o feed RSS para recibir alertas oportunas que se adapten a tu flujo de trabajo." + coverage: + title: "Cobertura Global" + description: "Descubre eventos Python desde PyCon hasta PyData en seis continentes con nuestra vista de mapa interactivo y calendario completo." + language: + title: "Soporte Multilingüe" + description: "Accede a la plataforma en inglés, español o alemán, haciendo que las conferencias Python sean accesibles para desarrolladores de diversos orígenes lingüísticos." + community: + title: "Impulsado por la Comunidad" + description: "Benefíciate de nuestro enfoque de código abierto donde la comunidad Python mantiene colaborativamente información precisa y actualizada de conferencias." + mobile: + title: "Compatible con Móviles" + description: "Consulta las fechas límite sobre la marcha con nuestro diseño responsivo que se adapta perfectamente a cualquier dispositivo, perfecto para desarrolladores ocupados." + categories: + title: "Categorías de Conferencias" + intro: "Hacemos seguimiento de conferencias Python en múltiples especializaciones:" + stats: + title: "En Números" + conferences: + label: "Conferencias Seguidas" + description: "Base de datos completa de eventos Python en todo el mundo" + categories: + label: "Categorías de Conferencias" + description: "Desde Python general hasta nichos especializados" + guides: + label: "Guías de Recursos" + description: "Guías completas para oradores primerizos y experimentados" + countries: + label: "Países Distintos" + description: "Conferencias Python de todo el mundo" + languages: + label: "Idiomas" + description: "Haciendo las conferencias Python accesibles globalmente" + testimonials: + title: "Lo Que Dicen Los Usuarios" + first: + quote: "\"Gracias a Pythondeadlin.es, pude enviar mi primera propuesta de charla para una conferencia con tiempo suficiente para prepararme. El sitio se ha convertido en una herramienta esencial en mi desarrollo profesional.\"" + author: "— Desarrollador Python" + second: + quote: "\"Como organizador de conferencias, agradezco que nuestro evento esté representado con precisión. La plataforma nos ha ayudado a llegar a una audiencia más amplia de potenciales ponentes.\"" + author: "— Organizador de PyCon" + third: + quote: "\"Ahora mostramos regularmente PythonDeadlin.es en nuestro Meetup para hacer seguimiento de las conferencias que podrían interesar a nuestros participantes.\"" + author: "— Organizador de Meetup" + use_cases: + title: "Cómo La Gente Usa Pythondeadlin.es" + first_time: + title: "Oradores Primerizos" + description: "Descubre conferencias amigables para principiantes con tiempo suficiente para preparar una propuesta convincente y utiliza la sección de recursos para inspiración y orientación." + frequent: + title: "Presentadores Frecuentes" + description: "Planifica tu agenda anual de presentaciones y prioriza las fechas límite de envío en múltiples eventos." + organizers: + title: "Organizadores de Conferencias" + description: "Asegúrate de que tu evento llegue a potenciales ponentes añadiendo tu conferencia a nuestra base de datos." + cta: + title: "Comienza a Seguir Las Fechas Límite de Conferencias Hoy" + description: "Únete a la comunidad Python para estar al día con las oportunidades de conferencias. Escanea el código QR o visita pythondeadlin.es para comenzar." + visit_button: "Visitar Sitio Web" + github_button: "Contribuir en GitHub" + qr_alt: "Código QR para pythondeadlin.es" +languages: + native_speaker: 'Hablante nativo' + language_learner: 'Aprendiz de idiomas' + ai_translated: 'Traducido por IA' + switch_to: 'Cambiar' + translated_by: 'Traducido por:' + legend: 'Leyenda' +formatter: + description: 'Enviar plazos de conferencias Python en varios formatos' + basic: + title: 'Información básica' + name: 'Nombre de la conferencia' + year: 'Año' + type: 'Tipo de conferencia' + attendees: 'Asistentes esperados' + url: 'URL del sitio web' + location_date: + title: 'Ubicación y fecha' + city: 'Ciudad' + city_help: 'Ingrese solo el nombre de la ciudad' + country: 'País' + country_help: 'Comience a escribir para ver países coincidentes con banderas' + venue: 'Lugar' + extra_places: "Lugares adicionales" + extra_help: "Para eventos híbridos o en línea, agregue ubicaciones adicionales separadas por comas aquí." + start_date: 'Fecha de inicio' + end_date: 'Fecha de finalización' + timezone: 'Zona horaria' + timezone_help: 'Comience a escribir para seleccionar la zona horaria de la conferencia' + cfp: + title: 'Convocatoria de propuestas' + status: 'Estado de la CfP' + tba: 'Por anunciar' + none: 'Sin CfP' + date: 'Usar fecha' + deadline: 'Fecha límite de envío' + deadline_help: 'La fecha límite para enviar propuestas de charlas' + link: 'Enlace de CfP' + additional_info: + title: 'Información adicional' + sponsor: 'URL de patrocinio' + finaid: 'URL de ayuda financiera' + mastodon: 'URL de Mastodon' + bsky: 'URL de Bluesky' + notes: 'Notas adicionales' + notes_place: 'Notas adicionales sobre la conferencia' + submission_guidelines: 'Pautas de envío' + generate_output: 'Generar formato' + generated_outputs: 'Formatos generados' + csv_format: 'Formato CSV' + yaml_format: 'Formato YAML' + calendar_format: 'Formato de calendario' + copy: 'Copiar al portapapeles' + required: 'Por favor, complete todos los campos obligatorios marcados con *.' diff --git a/_i18n/es/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/es/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..720c05b26da --- /dev/null +++ b/_i18n/es/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: ¿Cómo conseguir hablar en conferencias de Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +Las conferencias de Python son una excelente plataforma para compartir conocimientos, establecer contactos con colegas y mantenerse al día con los últimos desarrollos en la comunidad Python. Si te apasiona Python y quieres compartir tus conocimientos con una audiencia más amplia, hablar en una conferencia de Python puede ser una gran oportunidad. En esta entrada de blog, exploraremos cómo conseguir hablar en conferencias de Python. + +### Ser invitado + +Una forma de ser invitado a hablar en conferencias de Python es tener una reputación establecida en la comunidad. Supongamos que has contribuido a proyectos de código abierto, escrito artículos o entradas de blog sobre Python, o hablado en reuniones o eventos más pequeños. En ese caso, podrías llamar la atención de los organizadores de conferencias. + +Además, si eres un experto en un campo específico, como aprendizaje automático o desarrollo web, podrías ser invitado a hablar en conferencias centradas en esos temas. Para aumentar tus posibilidades de ser invitado, asiste a conferencias y reuniones, participa en discusiones en línea y contribuye a la comunidad Python de cualquier manera posible. + +### Enviar una propuesta a una Convocatoria de Propuestas (CfP) + +Otra manera de conseguir hablar en conferencias de Python es enviar una propuesta a una Convocatoria de Propuestas (CfP). La mayoría de las conferencias abren CfPs varios meses antes del evento, y cualquier persona puede enviar una propuesta. +Al enviar una propuesta, es esencial recordar que los organizadores de conferencias buscan charlas originales y atractivas que atraigan a una audiencia diversa. Asegúrate de que tu envío esté bien escrito, sea claro y conciso, y aborde un tema relevante e interesante para la comunidad Python. + +Aquí hay algunos consejos para enviar una propuesta exitosa: + +- Elige un tema sobre el que estés apasionado y en el que tengas experiencia. +- Asegúrate de que tu propuesta sea relevante para el tema o enfoque de la conferencia. +- Escribe un título y resumen convincentes que capturen la atención de los organizadores de la conferencia y los asistentes. +- Describe tu charla en detalle, incluyendo lo que cubrirás y cómo lo presentarás. +- Incluye cualquier material de apoyo, como ejemplos de código o diapositivas, para dar a los organizadores una mejor idea de tu estilo de presentación y contenido. + +### Desarrollar tus habilidades como orador + +Si eres nuevo en hablar en público, es una buena idea comenzar poco a poco hablando en reuniones o eventos locales. + +Esto te ayudará a construir tu confianza y perfeccionar tus habilidades de presentación. A medida que ganes más experiencia, puedes expandirte y hablar en eventos más grandes, como conferencias regionales o nacionales. + +Pide retroalimentación a los asistentes y organizadores después de cada charla, y usa esa retroalimentación para mejorar tus habilidades de oratoria. + +### Establecer contactos con otros oradores y asistentes + +Finalmente, el networking es vital para conseguir hablar en conferencias de Python. + +Asiste a tantas conferencias y reuniones como sea posible, e intenta conectar con otros oradores y asistentes. + +Al construir relaciones con otros miembros de la comunidad Python, aumentarás tu visibilidad y credibilidad, lo que puede llevar a más oportunidades de hablar en el futuro. + +### Conclusión + +En conclusión, conseguir hablar en conferencias de Python requiere una combinación de experiencia, preparación y networking. + +Siguiendo estos consejos, puedes aumentar tus posibilidades de ser invitado a hablar o enviar con éxito una propuesta a un CfP y, en última instancia, compartir tu conocimiento con la comunidad Python más amplia. diff --git a/_i18n/es/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/es/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..23d11740b64 --- /dev/null +++ b/_i18n/es/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: ¿Cómo crear una presentación fantástica para conferencias de Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Las conferencias de Python ofrecen una excelente plataforma para que los desarrolladores muestren sus habilidades, compartan conocimientos y establezcan contactos con otros profesionales. + +Hablar en una conferencia de Python puede ser una oportunidad fantástica para ganar reconocimiento, generar credibilidad y hacer una contribución valiosa a la comunidad Python. Sin embargo, presentar en una conferencia también puede ser intimidante, especialmente si eres nuevo en hablar en público o nunca has presentado antes. En este recurso, compartiremos algunos consejos sobre cómo hablar en conferencias de Python y hacer que tu presentación sea un éxito. + +## Elige un tema que te apasione + +El primer paso para realizar una presentación exitosa es elegir un tema que te apasione. Si estás entusiasmado con tu tema, tu entusiasmo se notará en tu presentación. Tendrás más probabilidades de involucrar y cautivar a tu audiencia. Elige un tema relevante para la comunidad Python y que ofrezca ideas valiosas o soluciones a problemas comunes. + +## Comprende a tu audiencia + +Antes de comenzar a preparar tu presentación, es esencial entender la demografía, el nivel de experiencia y los intereses de tu audiencia. Esto te ayudará a adaptar tu contenido y forma de entrega para satisfacer sus expectativas y necesidades. Por ejemplo, si tu audiencia está compuesta por desarrolladores principiantes de Python, puedes simplificar la jerga técnica y centrarte en conceptos fundamentales. + +## Crea una narrativa convincente + +Una narrativa convincente es un aspecto crítico de cualquier presentación exitosa. Es esencial estructurar tu presentación de manera que cuente una historia y mantenga a tu audiencia involucrada. Usa anécdotas, casos de estudio y ejemplos de la vida real para ayudar a ilustrar tus puntos y añadir un toque personal a tu presentación. Asegúrate de resaltar y presentar las conclusiones más importantes de manera clara y concisa. + +## Practica, practica, practica + +La práctica es vital para ofrecer una presentación pulida y segura. Ensaya tu presentación varias veces hasta que te sientas cómodo con tu contenido y forma de entrega. Cronometra tu presentación para asegurarte de que se ajusta al tiempo asignado. Considera grabar tus sesiones de práctica y revisarlas para identificar áreas de mejora. + +## Utiliza elementos visuales para apoyar tu mensaje + +Las ayudas visuales como diapositivas y diagramas pueden ayudar a respaldar tu mensaje y mantener a tu audiencia involucrada. Sin embargo, ten cuidado de no sobrecargar tu presentación con demasiados elementos visuales, lo que puede distraer de tu mensaje. Utiliza gráficos e imágenes para ilustrar conceptos y datos complejos, y mantén tus diapositivas simples y visualmente atractivas. + +## Interactúa con tu audiencia + +Interactuar con tu audiencia es un aspecto crucial de una presentación exitosa. Anima a tu audiencia a participar haciendo preguntas, realizando encuestas o utilizando herramientas interactivas. Esto ayudará a mantener a tu audiencia involucrada y les permitirá contribuir a la discusión. Prepárate para responder preguntas y abordar cualquier inquietud o comentario que pueda surgir. + +## Conclusión + +Hablar en una conferencia de Python puede ser una excelente manera de compartir tus conocimientos y hacer una contribución valiosa a la comunidad. Siguiendo estos consejos, puedes preparar una presentación convincente que involucre y resuene con tu audiencia. Recuerda elegir un tema que te apasione, entender a tu audiencia, crear una narrativa convincente, practicar tu entrega, utilizar elementos visuales para apoyar tu mensaje e interactuar con tu audiencia. ¡Buena suerte y feliz presentación! diff --git a/_i18n/es/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/es/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..7bd3fecf237 --- /dev/null +++ b/_i18n/es/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,38 @@ +--- +title: ¿Qué es un CfP de conferencia Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'conference'] +--- + +Call for Proposals (CfP) o Convocatoria de Participación es un término común utilizado en comunidades académicas, de investigación y profesionales para invitar a individuos o grupos a enviar propuestas o resúmenes para conferencias, talleres, simposios y otros eventos. + +Como la comunidad Python es un grupo de adorables nerds, esta misma terminología se incorporó al lenguaje común de Python. + +## ¿Qué es un CfP? + +En términos simples, un CfP es una invitación abierta a expertos, académicos, investigadores y profesionales para presentar sus ideas, hallazgos de investigación y estudios de caso en un campo particular o área de interés. + +Un CfP generalmente es emitido por organizadores de eventos, comités de conferencias o instituciones académicas para solicitar presentaciones de individuos o grupos interesados. + +## ¿Para qué sirven los CfPs? + +El propósito de un CfP es fomentar que una amplia gama de participantes se involucre con un evento o conferencia, asegurando diversidad de perspectivas e ideas. + +Los CfPs suelen describir el tema del evento, los tópicos de interés y las pautas para envío. También especifican los tipos de presentaciones que se aceptan, como artículos de investigación, estudios de caso, pósters o talleres. + +## ¿Cómo participar en un CfP? + +El proceso de envío para un CfP típicamente implica preparar una propuesta o resumen que incluya un sumario del tema propuesto, la metodología de investigación o enfoque, y los resultados esperados. + +Algunos CfPs académicos pueden requerir el envío de un artículo completo, mientras que otros pueden pedir solo un breve resumen. + +Los CfPs de Python raramente requieren el envío de materiales completos, ya que no publican artículos. Sin embargo, es vital evitar el error común de prometer únicamente trabajo futuro. + +## Conclusión + +En resumen, un CfP invita a expertos, académicos, investigadores y profesionales a enviar propuestas o resúmenes para un evento o conferencia. + +Juega un papel vital en facilitar el intercambio de conocimiento y experiencia, promover discusiones y crear oportunidades para establecer contactos entre profesionales en un campo particular. + +Si estás interesado en asistir o presentar en una conferencia o evento, ¡mantente atento a los CfPs! diff --git a/_i18n/es/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/es/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..5153a525b12 --- /dev/null +++ b/_i18n/es/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: Cómo escribir una gran propuesta de charla para conferencias Python +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +Escribir una buena propuesta de conferencia puede ser desafiante. Sin embargo, hay algunos elementos clave que pueden ayudar a que tu propuesta destaque. Aquí hay cinco componentes esenciales de una propuesta de conferencia exitosa. + +## El tema y por qué es interesante + +El primer componente de una buena propuesta de conferencia es una descripción clara y convincente del tema que planeas discutir. Es esencial comunicar por qué tu tema es relevante y emocionante para la audiencia de la conferencia. Asegúrate de resaltar cualquier aspecto único o innovador de tu tema y cualquier desafío u oportunidad que presente. + +## La audiencia que se beneficiará de asistir a esta charla/tutorial + +Identificar a tu audiencia objetivo es crucial para crear una propuesta de conferencia exitosa. + +Sé específico sobre quién se beneficiará de tu charla o tutorial y qué aprenderán. + +Comprender a tu audiencia te ayudará a adaptar tu contenido y asegurar que estás proporcionando ideas valiosas y conclusiones útiles. + +## El beneficio para la audiencia + +¿Qué pueden esperar obtener los asistentes de tu charla o tutorial? Sé claro sobre las conclusiones clave que esperas proporcionar. + +Esto ayudará a los asistentes a evaluar si tu presentación se alinea con sus intereses y necesidades. + +También te ayudará a estructurar tu charla y a mantenerte enfocado en entregar el valor prometido. + +## Cualquier conocimiento previo necesario para entender la charla/tutorial + +Al elaborar tu propuesta, es importante considerar qué conocimiento previo necesitará tu audiencia para entender y participar en tu contenido. + +Sé claro sobre cualquier prerrequisito, y proporciona enlaces o recursos que los asistentes puedan usar para repasar sus conocimientos antes de asistir. + +## Desglose aproximado del tiempo de cómo se cubrirá el material + +Un desglose detallado de cómo planeas cubrir tu material es vital para ayudar a los asistentes a entender qué pueden esperar de tu charla o tutorial. + +Al esbozar una estructura clara y una línea de tiempo para tu presentación, ayudarás a los asistentes a mantenerse comprometidos y enfocados en tu contenido. También te ayudará a mantenerte en el camino correcto y cubrir todos los puntos clave que quieres hacer. + +## Conclusión + +En conclusión, una buena propuesta de conferencia debe proporcionar una descripción clara y convincente del tema, identificar a la audiencia objetivo y sus necesidades, comunicar claramente las conclusiones y cualquier conocimiento previo requerido, y proporcionar un desglose detallado del material. Incluir estos componentes esenciales aumentará las posibilidades de que tu propuesta sea aceptada y de que entregues una presentación exitosa en la conferencia. + +_Esta lista amplía excelentes puntos hechos por la [conferencia Pydata Global](https://pydata.org/global2022/present/)._ diff --git a/_i18n/es/_posts/2023-03-07-find-target-audience.md b/_i18n/es/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..f40f011eabd --- /dev/null +++ b/_i18n/es/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: ¿Cómo defines tu público objetivo para una charla de conferencia Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +Cuando se trata de enviar una propuesta para una presentación en una conferencia, es esencial definir tu público objetivo. Saber a quién le estás hablando puede ayudarte a adaptar tu presentación a las necesidades, intereses y conocimientos previos de la audiencia. En este post, discutiremos cómo definir tu público objetivo para una propuesta de conferencia y por qué es importante. + +## Considera su rol profesional + +Primero, necesitas considerar el rol profesional de tu público objetivo. ¿Son científicos de datos, ingenieros de machine learning o software, investigadores, o algo más? + +Conocer su rol profesional puede ayudarte a determinar qué temas y técnicas son más relevantes para ellos. + +Por ejemplo, si presentas una nueva técnica de visualización de datos, los científicos de datos e investigadores pueden estar más interesados en cómo funciona. + +Mientras tanto, los ingenieros pueden estar más interesados en cómo se puede implementar en sus sistemas existentes. + +## Piensa en la experiencia + +A continuación, considera el nivel de experiencia de tu público objetivo. ¿Son principiantes, intermedios o avanzados en la materia? + +Esto afectará cómo presentas tus ideas y cuánta información de contexto proporcionas. + +Por ejemplo, si tu presentación trata sobre un algoritmo complejo, una audiencia avanzada puede estar interesada en los detalles técnicos y ejemplos de código, mientras que los principiantes pueden necesitar una explicación simplificada de los conceptos para seguir la presentación. + +## Considera un nicho secundario + +Créeme, me encanta hablar sobre machine learning. Pero cuando la gente no me conoce, es poco probable que estén interesados en esa charla. + +Sin embargo, podrías hablar sobre "machine learning en medicina" o "aplicar redes neuronales en la predicción del tiempo y clima", convirtiendo la charla en imprescindible para ciertas personas que de otro modo podrían haber pasado por alto la propuesta. + +Esta es una forma de decirle exactamente a tu público objetivo que una presentación es para ellos. + +## ¿Por qué definimos nuestro público objetivo? + +Definir tu público objetivo es crucial por dos razones principales. + +Primero, te ayuda a enfocar tu presentación en los temas más relevantes e interesantes para tu audiencia. Esto puede hacer que tu presentación sea más atractiva y valiosa para los asistentes. + +Segundo, ayuda a los potenciales asistentes a decidir si tu presentación se ajusta a sus necesidades e intereses. + +Si pueden ver fácilmente que tu presentación está dirigida a su rol profesional y nivel de experiencia, es más probable que asistan y encuentren valor en tu charla. + +## Considera la conferencia en sí + +Al escribir tu propuesta para la conferencia, asegúrate de incluir información sobre tu público objetivo. + +Esto podría ser tan simple como incluir una declaración como "Esta presentación está dirigida a científicos de datos con nivel de experiencia intermedio." Proporcionar esta información puede ayudar a los revisores y asistentes a entender para quién es tu charla y si se alinea con los objetivos de la conferencia. + +## Conclusión + +Definir tu público objetivo es un paso esencial en la preparación de una presentación para una conferencia. Al considerar el rol profesional y nivel de experiencia de tu audiencia, puedes adaptar tu presentación a sus necesidades e intereses, haciéndola más atractiva y útil para los asistentes. Asegúrate de incluir información sobre tu público objetivo en tu propuesta de conferencia para ayudar a los revisores y asistentes a entender para quién es tu charla y si es adecuada para ellos. diff --git a/_i18n/es/_posts/2023-03-08-common-pitfalls.md b/_i18n/es/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..04684745438 --- /dev/null +++ b/_i18n/es/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 9 errores comunes que hacen que rechacen tu propuesta de charla para conferencias Python +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +Si estás pensando en enviar una propuesta para una charla en una conferencia, es esencial saber qué evitar para aumentar tus posibilidades de aceptación. Aquí hay nueve errores comunes a tener en cuenta: + +## Presentaciones de ventas + +Recuerda que la conferencia es una comunidad de creadores y usuarios de herramientas de computación científica de código abierto. Aunque puedes hacer referencia a tu producto o plataforma de código cerrado, la audiencia encontrará la charla más interesante si pueden probar tus técnicas con el stack PyData de código abierto. Evita hacer una venta agresiva y concéntrate en la definición del problema, estrategias propuestas y dominio del negocio. + +## Charlas repetidas + +Las conferencias prefieren charlas nuevas y oradores nuevos. Si tu charla ya está disponible en línea, es poco probable que sea aceptada para la conferencia. Intenta aportar nuevos conocimientos, técnicas o perspectivas sobre un tema que no se haya cubierto antes. + +## Falta de claridad + +Tu propuesta debe comunicar claramente de qué trata tu charla y qué pueden esperar aprender los asistentes. Si tu propuesta es poco clara, divaga o es difícil de seguir, los revisores pueden no ser capaces de determinar si tu charla se alinea con los objetivos de la conferencia o es adecuada para la audiencia prevista. + +## Falta de originalidad + +Los revisores buscan charlas únicas, perspicaces e innovadoras que ofrezcan perspectivas frescas o nuevas soluciones a problemas comunes. Si tu propuesta cubre un tema que ya ha sido tratado varias veces o no proporciona nuevos conocimientos o técnicas, los revisores pueden rechazarla. Esto no significa que un caso de estudio o un nuevo enfoque sobre un problema no sea aceptado, pero vale la pena considerar esa perspectiva adicional. + +## Propuestas demasiado largas + +Mantén tu propuesta simple y clara. Las buenas propuestas típicamente proporcionan toda la información vital dentro de 250 palabras. Este no es un límite estricto y varía según la conferencia. Es una sugerencia para ayudarte a mantenerte enfocado y evitar perder la atención de los revisores. + +## Falta de relevancia + +Asegúrate de que tu charla se alinee con el tema o enfoque de la conferencia. Si tu propuesta está solo tangencialmente relacionada con los objetivos de la conferencia, los revisores pueden no ver cómo encaja en el panorama más amplio o cómo beneficiaría a los asistentes. + +## Trabajo futuro + +Aunque hablar de trabajo futuro es emocionante y podría mencionarse en tu charla, el contenido principal de la charla ya debería estar formado, y deberías poder describirlo en tu propuesta. No confíes demasiado en la recopilación de datos futuros o prototipos futuros porque las cosas a menudo no salen como se espera. Asegúrate de proporcionar ejemplos concretos y casos de uso. + +## Contenido inapropiado u ofensivo + +Mantén tu lenguaje y tono profesional y respetuoso, y evita temas controvertidos o sensibles que podrían ofender o alienar a los asistentes. Las propuestas que contengan contenido inapropiado, ofensivo o discriminatorio probablemente serán rechazadas. + +## Mal ajuste con el formato de la conferencia + +Las conferencias tienen diferentes formatos, desde charlas relámpago hasta talleres y discursos principales. Asegúrate de que tu propuesta se alinee con el formato y duración de la conferencia y pueda ser entregada efectivamente en ese formato. Considera cualquier equipo, materiales o recursos requeridos para tu charla. + +Al evitar estos errores comunes, puedes aumentar tus posibilidades de enviar una propuesta exitosa para una charla de conferencia que se alinee con los objetivos de la conferencia, sea relevante para los asistentes y ofrezca nuevos conocimientos o técnicas. diff --git a/_i18n/es/_posts/2023-03-09-what-about.md b/_i18n/es/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..3dc5f9a9659 --- /dev/null +++ b/_i18n/es/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: ¿De qué debería tratar mi charla en una conferencia Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +A menudo enfrentamos una paradoja cuando finalmente decidimos dar una charla en una conferencia Python. Hemos aprendido tantas cosas emocionantes. Hay tanto que es interesante. Pero, ¿de qué debería tratar mi charla de Python? + +Así que, ¡felicidades por decidir presentar sobre Python! Estás ansioso por compartir tu conocimiento y experiencia con otros. ¡Vamos a sumergirnos! + +Lo primero es pensar en tu audiencia. ¿A quién quieres que asista a tu charla? ¿Son principiantes, intermedios o usuarios avanzados de Python? ¿Tienen un interés específico o un problema que quieran resolver usando Python? Entender la experiencia e interés de tu audiencia te ayudará a decidir un tema que les atraiga y los mantenga interesados. + +A continuación, considera el tipo de charla que quieres dar. ¿Quieres profundizar en un tema complejo o mantenerlo simple con un tutorial práctico? ¿Quieres centrarte en las capacidades matemáticas de Python o en aplicaciones prácticas? Es crucial elegir un tema que se alinee con tu experiencia y pasión y que tenga en cuenta a tu audiencia. + +Una vez que hayas decidido tu tema y tipo de charla, piensa en el tono que quieres establecer. ¿Quieres ser desenfadado y divertido o más serio y cauteloso? No hay una respuesta correcta o incorrecta aquí, pero asegúrate de que tu tono sea apropiado para tu tema y audiencia. + +Recuerda, el objetivo de tu charla es educar e inspirar a otros sobre Python, así que asegúrate de que tus conclusiones sean claras y valiosas. ¿Qué debería aprender o llevarse tu audiencia de tu charla? ¿Cómo pueden aplicar lo que han aprendido en sus proyectos de Python o carreras? + +En resumen, al decidir el tema de tu charla de Python, considera tu audiencia, el tipo de charla y el tono que quieres establecer. Asegúrate de que tus conclusiones sean claras y valiosas para tu audiencia. Y lo más importante, ¡diviértete y comparte tu pasión por Python con los demás! diff --git a/_i18n/es/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/es/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..f91a3d6650e --- /dev/null +++ b/_i18n/es/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,51 @@ +--- +title: Explorando recursos adicionales para fechas límite de conferencias +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +Pythondeadlin.es ha sido un destino popular para la comunidad Python para encontrar fechas límite de conferencias en un lugar conveniente durante el último año. + +Sin embargo, es importante ser consciente de otros recursos valiosos que pueden mejorar tu experiencia de planificación de conferencias y fomentar la colaboración dentro de la comunidad Python. + +En esta entrada de blog, profundizaremos en dos de estos recursos que juegan un papel vital en la agregación de información de conferencias y la unión de la comunidad Python. ¡Vamos a sumergirnos! + +## GitHub de Python-Organizers: un tesoro de información + +El [repositorio de GitHub de Python-Organizers](https://github.com/python-organizers/conferences) es un recurso valioso tanto para organizadores de conferencias, asistentes y ponentes. + +Sirve como un centro centralizado de datos de conferencias, proporcionando una colección organizada de conferencias, fechas límite de envío, fechas de eventos, información de patrocinadores y detalles de ubicación. Esta plataforma colaborativa anima a los organizadores de eventos a compartir su información de conferencias y contribuir a la precisión y exhaustividad de los datos. + +Al aprovechar el GitHub de Python-Organizers, puedes acceder a una riqueza de conocimiento y colaborar con otros organizadores. + +Ya sea que estés planeando asistir o presentar en una conferencia Python, este recurso te permite tomar decisiones informadas y mantenerte actualizado con las últimas fechas límite de conferencias. + +El repositorio de GitHub facilita la interacción y fomenta la participación comunitaria, animando a las personas a participar activamente en la promoción, crecimiento y éxito de las conferencias Python en todo el mundo. + +## La lista oficial de eventos de Python: uniendo a la comunidad + +La [lista oficial de eventos de Python](https://www.python.org/events/) gestionada a través de la lista de correo de Python sirve como una plataforma unificadora para la comunidad Python. + +Este recurso completo proporciona una visión general de los próximos eventos de Python, incluyendo conferencias, reuniones, talleres y más. Aunque ofrece información sobre fechas límite, va más allá para promover la colaboración, el networking y el intercambio de ideas dentro de la comunidad. + +Puedes suscribirte a la lista de correo, pero la página web te ofrece un mapa y un calendario de Google al que puedes suscribirte fácilmente para recibir actualizaciones. Esto te permite visualizar y planificar tu agenda de conferencias de manera más efectiva. + +Esta plataforma inclusiva reúne a entusiastas de Python de diversos orígenes y les anima a conectarse, aprender y contribuir al vibrante ecosistema de Python. + +## Abrazando la colaboración para una mejor planificación de conferencias + +Mientras que Pythondeadlin.es sigue siendo un recurso valioso, es importante explorar el panorama más amplio de la agregación de información de conferencias. + +El repositorio de GitHub de Python-Organizers y la lista oficial de eventos de Python son instrumentales en unir a la comunidad Python y fomentar la colaboración. + +Al utilizar estos recursos, puedes mantenerte al día con los próximos eventos de Python, conectarte con personas afines y contribuir activamente al crecimiento y éxito de las conferencias Python. Abrazar la colaboración nos permite crear conferencias más fuertes y vibrantes que atiendan a las diversas necesidades e intereses de la comunidad Python. + +Asegúrate de consultar los siguientes recursos para más información: + +- [GitHub de Python-Organizers](https://github.com/python-organizers/conferences) +- [Lista oficial de eventos de Python](https://www.python.org/events/) + +Al utilizar estas plataformas, podemos mantenernos informados sobre los próximos eventos de Python, conectarnos con personas afines y contribuir activamente al éxito de nuestras conferencias. Colaboremos, compartamos nuestro conocimiento y forjemos una comunidad Python más fuerte. + +Juntos, podemos dar forma al futuro de los eventos Python y fomentar un entorno donde todos puedan aprender, crecer y prosperar. diff --git a/_i18n/es/calendar/description.md b/_i18n/es/calendar/description.md new file mode 100644 index 00000000000..ec56e85a96e --- /dev/null +++ b/_i18n/es/calendar/description.md @@ -0,0 +1,6 @@ +El PythonDeadlin.es resumen de plazos y fechas de conferencias de Python en un calendario. + +Opcionalmente, puedes exportar **todas las fechas límite** a Google Calendar o +iCal. ¡Este calendario es excelente para realizar un seguimiento de los plazos reales! + +Alternativamente, suscríbete a **próximos eventos de Python** en tu Google Calendario o iCal. Éste es el clásico "calendario de eventos". diff --git a/_i18n/es/dates/pretty_dates.html b/_i18n/es/dates/pretty_dates.html new file mode 100644 index 00000000000..7620e025993 --- /dev/null +++ b/_i18n/es/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil -%} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture -%} +{% elsif include.start == nil -%} + {% assign end_date = include.end | date: "%Y-%m-%d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture -%} + {% assign end_year = end_date | date: "%Y" -%} + {% capture pretty_date %}{% t "times.until" %} el {{ end_day }} de {{ end_month }} de {{ end_year }}{% endcapture -%} +{% elsif include.end == nil -%} + {% assign start_date = include.start | date: "%Y-%m-%d" -%} + {% assign start_day = start_date | date: "%-d" -%} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% assign start_year = start_date | date: "%Y" -%} + {% capture pretty_date %}{% t "times.from" %} el {{ start_day }} de {{ start_month }} de {{ start_year }}{% endcapture -%} +{% else -%} + {% assign start_date = include.start | date: "%Y-%m-%d" -%} + {% assign end_date = include.end | date: "%Y-%m-%d" -%} + + {% if start_date == end_date -%} + {% assign day = start_date | date: "%-d" -%} + {% assign year = start_date | date: "%Y" -%} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% capture pretty_date %}{{ day }} de {{ month }} de {{ year }}{% endcapture -%} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" -%} + {% assign start_day = start_date | date: "%-d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% assign year = start_date | date: "%Y" -%} + {% capture pretty_date %}del {{ start_day }} al {{ end_day }} de {{ month }} de {{ year }}{% endcapture -%} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" -%} + {% assign start_day = start_date | date: "%-d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture -%} + {% assign year = start_date | date: "%Y" -%} + {% capture pretty_date %}del {{ start_day }} de {{ start_month }} al {{ end_day }} de {{ end_month }} de {{ year }}{% endcapture -%} + + {% else -%} + {% assign start_day = start_date | date: "%-d" -%} + {% assign end_day = end_date | date: "%-d" -%} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture -%} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture -%} + {% assign start_year = start_date | date: "%Y" -%} + {% assign end_year = end_date | date: "%Y" -%} + {% capture pretty_date %}del {{ start_day }} de {{ start_month }} de {{ start_year }} al {{ end_day }} de {{ end_month }} de {{ end_year }}{% endcapture -%} + {% endif -%} +{% endif -%}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/es/footer/jesper.md b/_i18n/es/footer/jesper.md new file mode 100644 index 00000000000..190eef530b3 --- /dev/null +++ b/_i18n/es/footer/jesper.md @@ -0,0 +1 @@ +Jesper Dramsch es el creador de ML.recipes, data-science-gui.de, Tarde a la fiesta 🎉 y la Comunidad del Espacio Latente. diff --git a/_i18n/es/footer/maintainer.md b/_i18n/es/footer/maintainer.md new file mode 100644 index 00000000000..c6d72f049d3 --- /dev/null +++ b/_i18n/es/footer/maintainer.md @@ -0,0 +1,4 @@ +{{ site.domain }} es mantenido por Jesper Dramsch desde + +

Creado por Jesper Dramsch • Open Source • Centrada en la Comunidad

+

Inspirada de aideadlin.es • Archivando {{confs | size}} conferencia de Python desde 2022

diff --git a/_i18n/es/footer/terms.md b/_i18n/es/footer/terms.md new file mode 100644 index 00000000000..78613767176 --- /dev/null +++ b/_i18n/es/footer/terms.md @@ -0,0 +1,3 @@ +

No hay garantía de que sea correcto; corrija los errores enviar un pull request por favor.

+ +CondicionesPrivacidad diff --git a/_i18n/es/formatter/countries.html b/_i18n/es/formatter/countries.html new file mode 100644 index 00000000000..22aac6dbc63 --- /dev/null +++ b/_i18n/es/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: 'Afganistán', code: 'AFG', flag: '🇦🇫' }, +{ name: 'Albania', code: 'ALB', flag: '🇦🇱' }, +{ name: 'Argelia', code: 'DZA', flag: '🇩🇿' }, +{ name: 'Andorra', code: 'AND', flag: '🇦🇩' }, +{ name: 'Angola', code: 'AGO', flag: '🇦🇴' }, +{ name: 'Antigua y Barbuda', code: 'ATG', flag: '🇦🇬' }, +{ name: 'Argentina', code: 'ARG', flag: '🇦🇷' }, +{ name: 'Armenia', code: 'ARM', flag: '🇦🇲' }, +{ name: 'Australia', code: 'AUS', flag: '🇦🇺' }, +{ name: 'Austria', code: 'AUT', flag: '🇦🇹' }, +{ name: 'Azerbaiyán', code: 'AZE', flag: '🇦🇿' }, +{ name: 'Bahamas', code: 'BHS', flag: '🇧🇸' }, +{ name: 'Baréin', code: 'BHR', flag: '🇧🇭' }, +{ name: 'Bangladés', code: 'BGD', flag: '🇧🇩' }, +{ name: 'Barbados', code: 'BRB', flag: '🇧🇧' }, +{ name: 'Bielorrusia', code: 'BLR', flag: '🇧🇾' }, +{ name: 'Bélgica', code: 'BEL', flag: '🇧🇪' }, +{ name: 'Belice', code: 'BLZ', flag: '🇧🇿' }, +{ name: 'Benín', code: 'BEN', flag: '🇧🇯' }, +{ name: 'Bután', code: 'BTN', flag: '🇧🇹' }, +{ name: 'Bolivia', code: 'BOL', flag: '🇧🇴' }, +{ name: 'Bosnia y Herzegovina', code: 'BIH', flag: '🇧🇦' }, +{ name: 'Botsuana', code: 'BWA', flag: '🇧🇼' }, +{ name: 'Brasil', code: 'BRA', flag: '🇧🇷' }, +{ name: 'Brunéi', code: 'BRN', flag: '🇧🇳' }, +{ name: 'Bulgaria', code: 'BGR', flag: '🇧🇬' }, +{ name: 'Burkina Faso', code: 'BFA', flag: '🇧🇫' }, +{ name: 'Burundi', code: 'BDI', flag: '🇧🇮' }, +{ name: 'Camboya', code: 'KHM', flag: '🇰🇭' }, +{ name: 'Camerún', code: 'CMR', flag: '🇨🇲' }, +{ name: 'Canadá', code: 'CAN', flag: '🇨🇦' }, +{ name: 'Cabo Verde', code: 'CPV', flag: '🇨🇻' }, +{ name: 'República Centroafricana', code: 'CAF', flag: '🇨🇫' }, +{ name: 'Chad', code: 'TCD', flag: '🇹🇩' }, +{ name: 'Chile', code: 'CHL', flag: '🇨🇱' }, +{ name: 'China', code: 'CHN', flag: '🇨🇳' }, +{ name: 'Colombia', code: 'COL', flag: '🇨🇴' }, +{ name: 'Comoras', code: 'COM', flag: '🇰🇲' }, +{ name: 'Congo', code: 'COG', flag: '🇨🇬' }, +{ name: 'Costa Rica', code: 'CRI', flag: '🇨🇷' }, +{ name: 'Croacia', code: 'HRV', flag: '🇭🇷' }, +{ name: 'Cuba', code: 'CUB', flag: '🇨🇺' }, +{ name: 'Chipre', code: 'CYP', flag: '🇨🇾' }, +{ name: 'República Checa', code: 'CZE', flag: '🇨🇿' }, +{ name: 'Dinamarca', code: 'DNK', flag: '🇩🇰' }, +{ name: 'Yibuti', code: 'DJI', flag: '🇩🇯' }, +{ name: 'Dominica', code: 'DMA', flag: '🇩🇲' }, +{ name: 'República Dominicana', code: 'DOM', flag: '🇩🇴' }, +{ name: 'Ecuador', code: 'ECU', flag: '🇪🇨' }, +{ name: 'Egipto', code: 'EGY', flag: '🇪🇬' }, +{ name: 'El Salvador', code: 'SLV', flag: '🇸🇻' }, +{ name: 'Guinea Ecuatorial', code: 'GNQ', flag: '🇬🇶' }, +{ name: 'Eritrea', code: 'ERI', flag: '🇪🇷' }, +{ name: 'Estonia', code: 'EST', flag: '🇪🇪' }, +{ name: 'Etiopía', code: 'ETH', flag: '🇪🇹' }, +{ name: 'Fiyi', code: 'FJI', flag: '🇫🇯' }, +{ name: 'Finlandia', code: 'FIN', flag: '🇫🇮' }, +{ name: 'Francia', code: 'FRA', flag: '🇫🇷' }, +{ name: 'Gabón', code: 'GAB', flag: '🇬🇦' }, +{ name: 'Gambia', code: 'GMB', flag: '🇬🇲' }, +{ name: 'Georgia', code: 'GEO', flag: '🇬🇪' }, +{ name: 'Alemania', code: 'DEU', flag: '🇩🇪' }, +{ name: 'Ghana', code: 'GHA', flag: '🇬🇭' }, +{ name: 'Grecia', code: 'GRC', flag: '🇬🇷' }, +{ name: 'Granada', code: 'GRD', flag: '🇬🇩' }, +{ name: 'Guatemala', code: 'GTM', flag: '🇬🇹' }, +{ name: 'Guinea', code: 'GIN', flag: '🇬🇳' }, +{ name: 'Guinea-Bisáu', code: 'GNB', flag: '🇬🇼' }, +{ name: 'Guyana', code: 'GUY', flag: '🇬🇾' }, +{ name: 'Haití', code: 'HTI', flag: '🇭🇹' }, +{ name: 'Honduras', code: 'HND', flag: '🇭🇳' }, +{ name: 'Hungría', code: 'HUN', flag: '🇭🇺' }, +{ name: 'Islandia', code: 'ISL', flag: '🇮🇸' }, +{ name: 'India', code: 'IND', flag: '🇮🇳' }, +{ name: 'Indonesia', code: 'IDN', flag: '🇮🇩' }, +{ name: 'Irán', code: 'IRN', flag: '🇮🇷' }, +{ name: 'Irak', code: 'IRQ', flag: '🇮🇶' }, +{ name: 'Irlanda', code: 'IRL', flag: '🇮🇪' }, +{ name: 'Israel', code: 'ISR', flag: '🇮🇱' }, +{ name: 'Italia', code: 'ITA', flag: '🇮🇹' }, +{ name: 'Jamaica', code: 'JAM', flag: '🇯🇲' }, +{ name: 'Japón', code: 'JPN', flag: '🇯🇵' }, +{ name: 'Jordania', code: 'JOR', flag: '🇯🇴' }, +{ name: 'Kazajistán', code: 'KAZ', flag: '🇰🇿' }, +{ name: 'Kenia', code: 'KEN', flag: '🇰🇪' }, +{ name: 'Kiribati', code: 'KIR', flag: '🇰🇮' }, +{ name: 'Corea del Norte', code: 'PRK', flag: '🇰🇵' }, +{ name: 'Corea del Sur', code: 'KOR', flag: '🇰🇷' }, +{ name: 'Kuwait', code: 'KWT', flag: '🇰🇼' }, +{ name: 'Kirguistán', code: 'KGZ', flag: '🇰🇬' }, +{ name: 'Laos', code: 'LAO', flag: '🇱🇦' }, +{ name: 'Letonia', code: 'LVA', flag: '🇱🇻' }, +{ name: 'Líbano', code: 'LBN', flag: '🇱🇧' }, +{ name: 'Lesoto', code: 'LSO', flag: '🇱🇸' }, +{ name: 'Liberia', code: 'LBR', flag: '🇱🇷' }, +{ name: 'Libia', code: 'LBY', flag: '🇱🇾' }, +{ name: 'Liechtenstein', code: 'LIE', flag: '🇱🇮' }, +{ name: 'Lituania', code: 'LTU', flag: '🇱🇹' }, +{ name: 'Luxemburgo', code: 'LUX', flag: '🇱🇺' }, +{ name: 'Macedonia', code: 'MKD', flag: '🇲🇰' }, +{ name: 'Madagascar', code: 'MDG', flag: '🇲🇬' }, +{ name: 'Malaui', code: 'MWI', flag: '🇲🇼' }, +{ name: 'Malasia', code: 'MYS', flag: '🇲🇾' }, +{ name: 'Maldivas', code: 'MDV', flag: '🇲🇻' }, +{ name: 'Malí', code: 'MLI', flag: '🇲🇱' }, +{ name: 'Malta', code: 'MLT', flag: '🇲🇹' }, +{ name: 'Islas Marshall', code: 'MHL', flag: '🇲🇭' }, +{ name: 'Mauritania', code: 'MRT', flag: '🇲🇷' }, +{ name: 'Mauricio', code: 'MUS', flag: '🇲🇺' }, +{ name: 'México', code: 'MEX', flag: '🇲🇽' }, +{ name: 'Micronesia', code: 'FSM', flag: '🇫🇲' }, +{ name: 'Moldavia', code: 'MDA', flag: '🇲🇩' }, +{ name: 'Mónaco', code: 'MCO', flag: '🇲🇨' }, +{ name: 'Mongolia', code: 'MNG', flag: '🇲🇳' }, +{ name: 'Montenegro', code: 'MNE', flag: '🇲🇪' }, +{ name: 'Marruecos', code: 'MAR', flag: '🇲🇦' }, +{ name: 'Mozambique', code: 'MOZ', flag: '🇲🇿' }, +{ name: 'Myanmar', code: 'MMR', flag: '🇲🇲' }, +{ name: 'Namibia', code: 'NAM', flag: '🇳🇦' }, +{ name: 'Nauru', code: 'NRU', flag: '🇳🇷' }, +{ name: 'Nepal', code: 'NPL', flag: '🇳🇵' }, +{ name: 'Países Bajos', code: 'NLD', flag: '🇳🇱' }, +{ name: 'Nueva Zelanda', code: 'NZL', flag: '🇳🇿' }, +{ name: 'Nicaragua', code: 'NIC', flag: '🇳🇮' }, +{ name: 'Níger', code: 'NER', flag: '🇳🇪' }, +{ name: 'Nigeria', code: 'NGA', flag: '🇳🇬' }, +{ name: 'Noruega', code: 'NOR', flag: '🇳🇴' }, +{ name: 'Omán', code: 'OMN', flag: '🇴🇲' }, +{ name: 'Pakistán', code: 'PAK', flag: '🇵🇰' }, +{ name: 'Palaos', code: 'PLW', flag: '🇵🇼' }, +{ name: 'Panamá', code: 'PAN', flag: '🇵🇦' }, +{ name: 'Papúa Nueva Guinea', code: 'PNG', flag: '🇵🇬' }, +{ name: 'Paraguay', code: 'PRY', flag: '🇵🇾' }, +{ name: 'Perú', code: 'PER', flag: '🇵🇪' }, +{ name: 'Filipinas', code: 'PHL', flag: '🇵🇭' }, +{ name: 'Polonia', code: 'POL', flag: '🇵🇱' }, +{ name: 'Portugal', code: 'PRT', flag: '🇵🇹' }, +{ name: 'Catar', code: 'QAT', flag: '🇶🇦' }, +{ name: 'Rumania', code: 'ROU', flag: '🇷🇴' }, +{ name: 'Rusia', code: 'RUS', flag: '🇷🇺' }, +{ name: 'Ruanda', code: 'RWA', flag: '🇷🇼' }, +{ name: 'San Cristóbal y Nieves', code: 'KNA', flag: '🇰🇳' }, +{ name: 'Santa Lucía', code: 'LCA', flag: '🇱🇨' }, +{ name: 'San Vicente y las Granadinas', code: 'VCT', flag: '🇻🇨' }, +{ name: 'Samoa', code: 'WSM', flag: '🇼🇸' }, +{ name: 'San Marino', code: 'SMR', flag: '🇸🇲' }, +{ name: 'Santo Tomé y Príncipe', code: 'STP', flag: '🇸🇹' }, +{ name: 'Arabia Saudita', code: 'SAU', flag: '🇸🇦' }, +{ name: 'Senegal', code: 'SEN', flag: '🇸🇳' }, +{ name: 'Serbia', code: 'SRB', flag: '🇷🇸' }, +{ name: 'Seychelles', code: 'SYC', flag: '🇸🇨' }, +{ name: 'Sierra Leona', code: 'SLE', flag: '🇸🇱' }, +{ name: 'Singapur', code: 'SGP', flag: '🇸🇬' }, +{ name: 'Eslovaquia', code: 'SVK', flag: '🇸🇰' }, +{ name: 'Eslovenia', code: 'SVN', flag: '🇸🇮' }, +{ name: 'Islas Salomón', code: 'SLB', flag: '🇸🇧' }, +{ name: 'Somalia', code: 'SOM', flag: '🇸🇴' }, +{ name: 'Sudáfrica', code: 'ZAF', flag: '🇿🇦' }, +{ name: 'Sudán del Sur', code: 'SSD', flag: '🇸🇸' }, +{ name: 'España', code: 'ESP', flag: '🇪🇸' }, +{ name: 'Sri Lanka', code: 'LKA', flag: '🇱🇰' }, +{ name: 'Sudán', code: 'SDN', flag: '🇸🇩' }, +{ name: 'Surinam', code: 'SUR', flag: '🇸🇷' }, +{ name: 'Suazilandia', code: 'SWZ', flag: '🇸🇿' }, +{ name: 'Suecia', code: 'SWE', flag: '🇸🇪' }, +{ name: 'Suiza', code: 'CHE', flag: '🇨🇭' }, +{ name: 'Siria', code: 'SYR', flag: '🇸🇾' }, +{ name: 'Taiwán', code: 'TWN', flag: '🇹🇼' }, +{ name: 'Tayikistán', code: 'TJK', flag: '🇹🇯' }, +{ name: 'Tanzania', code: 'TZA', flag: '🇹🇿' }, +{ name: 'Tailandia', code: 'THA', flag: '🇹🇭' }, +{ name: 'Timor Oriental', code: 'TLS', flag: '🇹🇱' }, +{ name: 'Togo', code: 'TGO', flag: '🇹🇬' }, +{ name: 'Tonga', code: 'TON', flag: '🇹🇴' }, +{ name: 'Trinidad y Tobago', code: 'TTO', flag: '🇹🇹' }, +{ name: 'Túnez', code: 'TUN', flag: '🇹🇳' }, +{ name: 'Turquía', code: 'TUR', flag: '🇹🇷' }, +{ name: 'Turkmenistán', code: 'TKM', flag: '🇹🇲' }, +{ name: 'Tuvalu', code: 'TUV', flag: '🇹🇻' }, +{ name: 'Uganda', code: 'UGA', flag: '🇺🇬' }, +{ name: 'Ucrania', code: 'UKR', flag: '🇺🇦' }, +{ name: 'Emiratos Árabes Unidos', code: 'ARE', flag: '🇦🇪' }, +{ name: 'Reino Unido', code: 'GBR', flag: '🇬🇧' }, +{ name: 'Estados Unidos', code: 'USA', flag: '🇺🇸' }, +{ name: 'Uruguay', code: 'URY', flag: '🇺🇾' }, +{ name: 'Uzbekistán', code: 'UZB', flag: '🇺🇿' }, +{ name: 'Vanuatu', code: 'VUT', flag: '🇻🇺' }, +{ name: 'Ciudad del Vaticano', code: 'VAT', flag: '🇻🇦' }, +{ name: 'Venezuela', code: 'VEN', flag: '🇻🇪' }, +{ name: 'Vietnam', code: 'VNM', flag: '🇻🇳' }, +{ name: 'Yemen', code: 'YEM', flag: '🇾🇪' }, +{ name: 'Zambia', code: 'ZMB', flag: '🇿🇲' }, +{ name: 'Zimbabue', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/es/formatter/submission.html b/_i18n/es/formatter/submission.html new file mode 100644 index 00000000000..c63b9f2b800 --- /dev/null +++ b/_i18n/es/formatter/submission.html @@ -0,0 +1,55 @@ +
+
Cómo enviar la información de su conferencia
+ +
+
1. Formato CSV de Python-Organizers
+

+ Agregue su conferencia al repositorio + python-organizers/conferences: +

+
    +
  • Haga un fork del repositorio
  • +
  • Edite el archivo CSV del año correspondiente
  • +
  • Agregue la fila de datos de su conferencia
  • +
  • Envíe una solicitud de extracción (pull request)
  • +
+
+ +
+
2. Formato YAML de PythonDeadlin.es
+

+ Agregue su conferencia a + jesperdramsch/python-deadlines: +

+
    +
  • Haga un fork del repositorio
  • +
  • Edite el archivo `_data/conferences.yml`
  • +
  • Agregue los datos YAML de su conferencia en el lugar apropiado
  • +
  • Envíe una solicitud de extracción (pull request)
  • +
+
+ +
+
3. Formato de calendario de Python.org
+

Envíe su conferencia al calendario oficial de eventos de Python:

+
    +
  • + Envíe un correo electrónico a + + href="mailto:events@python.org" + >events[at]python.org + con el texto en formato de calendario +
  • +
  • Incluya la línea de asunto: "Python Event Submission: [Nombre de su conferencia]"
  • +
  • Espere la confirmación del equipo de eventos de Python
  • +
+
+ +
+ Consejo: ¡Envíe a las tres plataformas para maximizar la visibilidad + de su conferencia Python! +
+
diff --git a/_i18n/es/frontpage/description.md b/_i18n/es/frontpage/description.md new file mode 100644 index 00000000000..19e00175e98 --- /dev/null +++ b/_i18n/es/frontpage/description.md @@ -0,0 +1,5 @@ +Esta herramienta comunitaria sirve como depósito central de fechas límite de invitaciones de participación, propuestas, talleres y tutoriales en conferencias de Python. + +Las fechas están disponibles como cuentas regresivas, en zonas horarias locales. + +Los plazos se muestran en tu hora local. Para verlos en las zonas horarias del sitio web de la conferencia, haga clic en la conferencia. diff --git a/_i18n/es/frontpage/hook.md b/_i18n/es/frontpage/hook.md new file mode 100644 index 00000000000..3b3773f7009 --- /dev/null +++ b/_i18n/es/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es junta tus conferencias favoritas de Python. diff --git a/_i18n/es/maps/description.md b/_i18n/es/maps/description.md new file mode 100644 index 00000000000..066029dd74f --- /dev/null +++ b/_i18n/es/maps/description.md @@ -0,0 +1,3 @@ +¡A veces es mejor ver todas las conferencias en un mapa! + +Todas las conferencias futuras por PythonDeadlin.es se encontran aquí. diff --git a/_i18n/es/resources/description.md b/_i18n/es/resources/description.md new file mode 100644 index 00000000000..2fa3008de7e --- /dev/null +++ b/_i18n/es/resources/description.md @@ -0,0 +1,5 @@ +Esta página está dedicada a ayudarle a elaborar excelentes Convocatorias de Propuestas (CfPs) para conferencias de Python. Aquí encontrará una colección de publicaciones de blog, guías y consejos sobre cómo escribir propuestas convincentes. + +Nuestros recursos cubren varios aspectos de la redacción de CfP, desde la elección de un tema hasta la estructuración de su presentación. Ya sea un orador novato o un presentador experimentado, estas herramientas tienen como objetivo mejorar sus habilidades de redacción de propuestas. + +Explore nuestro contenido seleccionado para aumentar sus posibilidades de que su charla o taller sea aceptado en eventos de Python en todo el mundo. diff --git a/_i18n/es/search/description.md b/_i18n/es/search/description.md new file mode 100644 index 00000000000..f6c08b0a079 --- /dev/null +++ b/_i18n/es/search/description.md @@ -0,0 +1,5 @@ +Esta página muestra los resultados de búsqueda de nuestra exhaustiva base de datos de plazos y eventos de conferencias de Python. Los resultados se presentan como una lista de conferencias relevantes que coinciden con su consulta. + +Cada resultado incluye detalles clave como el nombre de la conferencia, las fechas límite y breves descripciones. Los plazos se muestran en su zona horaria local. + +Haga clic en el nombre de una conferencia para ver información más detallada, incluyendo pautas de presentación y enlaces al sitio web oficial de la conferencia. diff --git a/_i18n/es/series/description.md b/_i18n/es/series/description.md new file mode 100644 index 00000000000..642f9288cb2 --- /dev/null +++ b/_i18n/es/series/description.md @@ -0,0 +1,4 @@ +Esta sección de nuestra herramienta comunitaria sirve como un directorio completo de series de conferencias de Python recurrentes. Aquí encontrará una visión general de eventos regulares, sus horarios típicos e información histórica. + +Las series se presentan con breves descripciones y enlaces a eventos pasados, ayudándole a planificar su participación en conferencias a largo plazo. +Haga clic en una serie para ver más detalles y acceder a información sobre sus eventos próximos y pasados. diff --git a/_i18n/es/trademark/django.md b/_i18n/es/trademark/django.md new file mode 100644 index 00000000000..1f65ca57320 --- /dev/null +++ b/_i18n/es/trademark/django.md @@ -0,0 +1 @@ +

Django es una marca registrada de la Django Software Foundation. Este sitio web, pythondeadlin.es, no está afiliado, respaldado ni patrocinado por la Django Software Foundation ni por ningún evento de la Django. Todas las marcas comerciales y logotipos utilizados en este sitio son propiedad de sus respectivos dueños. Cualquier referencia a Django o a otras marcas comerciales se hace únicamente con fines informativos y no implica asociación alguna con los titulares de dichas marcas.

diff --git a/_i18n/es/trademark/generic.md b/_i18n/es/trademark/generic.md new file mode 100644 index 00000000000..610438bc613 --- /dev/null +++ b/_i18n/es/trademark/generic.md @@ -0,0 +1 @@ +

Cualquier uso de marcas comerciales o logotipos establecidos por eventos enumerados en este sitio es sólo para fines informativos y no implica asociación con los respectivos titulares de marcas comerciales. Si usted es el titular de una marca comercial y desea que su marca sea retirada de este sitio, póngase en contacto con nosotros.

diff --git a/_i18n/es/trademark/pycon.md b/_i18n/es/trademark/pycon.md new file mode 100644 index 00000000000..3579f370029 --- /dev/null +++ b/_i18n/es/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon, y PyLadies son marcas registradas de la Python Software Foundation. Este sitio web, pythondeadlin.es, no está afiliado, respaldado ni patrocinado por la Python Software Foundation ni por ningún evento de la PyCon. Todas las marcas comerciales y logotipos utilizados en este sitio son propiedad de sus respectivos dueños. Cualquier referencia a PyCon o a otras marcas comerciales se hace únicamente con fines informativos y no implica asociación alguna con los titulares de dichas marcas.

diff --git a/_i18n/es/trademark/pydata.md b/_i18n/es/trademark/pydata.md new file mode 100644 index 00000000000..adfbc1964c2 --- /dev/null +++ b/_i18n/es/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS, PyData y Fiscally Sponsored Projects son marcas registradas de NumFOCUS. Este sitio web, pythondeadlin.es, no está afiliado, respaldado ni patrocinado por NumFOCUS ni por ningún evento PyData o afiliado. Todas las marcas y logotipos utilizados en este sitio son propiedad de sus respectivos dueños. Cualquier referencia a NumFOCUS, PyData, u otras marcas registradas es sólo para fines informativos y no implica asociación con los titulares de las marcas.

diff --git a/_i18n/fr.yml b/_i18n/fr.yml new file mode 100644 index 00000000000..dc787e4b3fe --- /dev/null +++ b/_i18n/fr.yml @@ -0,0 +1,246 @@ +--- +global: + current: 'fr' + choose: 'Choisir la langue' + sub_filter: 'Filtrer par sous-catégorie:' + en: 'English' + es: 'Español' + de: 'Deutsch' + fr: 'Français' + pt-br: 'Português' + zh-cn: '中文' + cfp: 'Appel à participation' + cfp_ext: 'CfP prolongé de' + subscribe: "S'abonner" +titles: + default: 'Échéances des conférences Python' + archive: 'Conférences Python passées' + visit_archive: 'Visiter les archives' + calendar: 'Calendrier des échéances et dates des conférences Python' + map: 'Carte des conférences Python' + a404: 'Page non trouvée' + privacy: 'Politique de confidentialité' + resources: 'Ressources pour rédiger des CfP de qualité' + series: "Liste des séries d'événements Python" + impressum: 'Mentions légales' + past_events: 'Événements passés' + past_cfps: 'Appels à participation passés' + search: 'Rechercher' + about: 'À propos des échéances des conférences Python' + languages: 'Langues disponibles' + formatter: 'Formatteur de conférence' +buttons: + ical: Obtenir l'iCal + google: Ajouter à Google Agenda + github: Soumettre une conférence sur GitHub + all_selected: Toutes les conférences sélectionnées + none_selected: Aucune conférence sélectionnée +description: + summary: 'Résumé de la conférence et de ses éditions au fil des ans.' +header: + countdown: 'Décomptes' + calendar: 'Calendrier' + maps: 'Carte' + series: 'Séries' + resources: 'Ressources' + formatter: 'Formatteur' + course: 'Cours par Email' + articles: 'Commencer' +conference: + title: 'Échéances des conférences' + finaid: 'Aide financière' + sponsor: 'Opportunité de parrainage' + all: 'Toutes les conférences pour' + download_dl: "Télécharger l'échéance de la conférence" + download_date: 'Télécharger les dates de la conférence' + deadline_tz_theirs: 'Échéance dans le fuseau horaire du site de la conférence' + deadline_tz_local: "Échéance dans votre fuseau horaire local " +summary: + title: 'Résumé de la conférence' +subs: + PY: 'Python général' + SCIPY: 'Python scientifique' + DATA: 'Python pour les données' + WEB: 'Python pour le web' + BIZ: 'Python pour les entreprises' + GEO: 'Python pour la Terre' + CAMP: 'Camps Python' + DAY: 'Journée Python' +series: + always: 'Toujours tenu à' + place: + last: 'Dernière conférence à' + next: 'Prochaine conférence à' + year: + last: 'Dernière année tenue en' + next: 'Prochaine année en' +times: + tba: "À déterminer" + from: "À partir du" + until: "Jusqu'au" + normal: + days: 'jours' + hours: 'heures' + minutes: 'minutes' + seconds: 'secondes' + short: + days: 'j' + hours: 'h' + minutes: 'm' + seconds: 's' + months: + January: 'janvier' + February: 'février' + March: 'mars' + April: 'avril' + May: 'mai' + June: 'juin' + July: 'juillet' + August: 'août' + September: 'septembre' + October: 'octobre' + November: 'novembre' + December: 'décembre' +social: + twitter: 'Tweeter la conférence' + facebook: 'Partager la conférence sur FB' + linkedin: 'Partager la conférence sur LinkedIn' + whatsapp: 'Partager la conférence sur WhatsApp' + email: 'Envoyer la conférence par email' +search: + no-results: 'Aucun résultat trouvé.' + error: "Erreur lors du chargement de l'index de recherche. Veuillez réessayer plus tard." +about: + toggle_fullscreen: "Basculer en mode présentation plein écran" + previous_slide: "Diapositive précédente" + next_slide: "Diapositive suivante" + tagline: "Ne manquez plus jamais une échéance de conférence Python !" + hero_description: "La plateforme communautaire qui aide les développeurs Python à découvrir, suivre et soumettre des propositions aux conférences du monde entier." + problem: + title: "Le défi" + description: "Suivre les échéances des conférences Python sur différents sites web, fuseaux horaires et formats est chronophage et source d'erreurs. De nombreux développeurs manquent des opportunités de partager leurs connaissances car ils découvrent les CFP trop tard." + solution: + title: "Notre solution" + description: "Pythondeadlin.es regroupe toutes les échéances des conférences Python en un seul endroit, avec conversion automatique des fuseaux horaires, options de rappel multiples et informations détaillées pour vous aider à planifier efficacement vos soumissions." + features: + title: "Fonctionnalités clés" + tracking: + title: "Suivi complet" + description: "Restez informé de chaque échéance d'appel à propositions (CfP) pour les conférences Python dans le monde entier avec des chronomètres personnalisés dans votre fuseau horaire local." + notifications: + title: "Notifications flexibles" + description: "Choisissez comment vous souhaitez être rappelé — abonnez-vous via iCal, Google Agenda ou flux RSS pour recevoir des alertes opportunes qui s'adaptent à votre flux de travail." + coverage: + title: "Couverture mondiale" + description: "Découvrez les événements Python, de PyCon à PyData, sur six continents avec notre vue cartographique interactive et notre aperçu de calendrier complet." + language: + title: "Support multilingue" + description: "Accédez à la plateforme en anglais, espagnol, allemand, français, portugais brésilien ou chinois simplifié, rendant les conférences Python accessibles aux développeurs de diverses origines linguistiques." + community: + title: "Piloté par la communauté" + description: "Bénéficiez de notre approche open source où la communauté Python maintient collaborativement des informations précises et à jour sur les conférences." + mobile: + title: "Compatible mobile" + description: "Vérifiez les échéances en déplacement avec notre design responsive qui s'adapte parfaitement à tout appareil — idéal pour les développeurs occupés." + categories: + title: "Catégories de conférences" + intro: "Nous suivons les conférences Python dans plusieurs spécialisations :" + stats: + title: "En chiffres" + conferences: + label: "Conférences suivies" + description: "Base de données complète d'événements Python dans le monde entier" + categories: + label: "Catégories de conférences" + description: "Du Python général aux niches spécialisées" + guides: + label: "Guides de ressources" + description: "Guides complets pour les orateurs débutants et expérimentés" + countries: + label: "Pays distincts" + description: "Conférences Python du monde entier" + languages: + label: "Langues" + description: "Rendre les conférences Python accessibles mondialement" + testimonials: + title: "Ce que disent les utilisateurs" + first: + quote: "\"Grâce à Pythondeadlin.es, j'ai pu soumettre ma première proposition de conférence avec suffisamment de temps pour me préparer. Le site est devenu un outil essentiel dans mon développement professionnel.\"" + author: "— Développeur Python" + second: + quote: "\"En tant qu'organisateur de conférence, j'apprécie que notre événement soit représenté avec précision. La plateforme nous a aidés à atteindre un public plus large d'orateurs potentiels.\"" + author: "— Organisateur PyCon" + third: + quote: "\"Nous montrons maintenant régulièrement PythonDeadlin.es lors de notre Meetup pour suivre les conférences qui pourraient intéresser nos participants.\"" + author: "— Organisateur de Meetup" + use_cases: + title: "Comment les gens utilisent Pythondeadlin.es" + first_time: + title: "Orateurs débutants" + description: "Découvrez des conférences adaptées aux débutants avec suffisamment de temps pour préparer une proposition convaincante et utilisez la section ressources pour l'inspiration et les conseils." + frequent: + title: "Présentateurs fréquents" + description: "Planifiez votre calendrier annuel de présentations et priorisez les échéances de soumission pour plusieurs événements." + organizers: + title: "Organisateurs de conférences" + description: "Assurez-vous que votre événement atteigne des orateurs potentiels en ajoutant votre conférence à notre base de données." + cta: + title: "Commencez à suivre les échéances de conférences dès aujourd'hui" + description: "Rejoignez la communauté Python pour rester au courant des opportunités de conférences. Scannez le code QR ou visitez pythondeadlin.es pour commencer." + visit_button: "Visiter le site" + github_button: "Contribuer sur GitHub" + qr_alt: "Code QR pour pythondeadlin.es" +languages: + native_speaker: 'Locuteur natif' + language_learner: 'Apprenant de langue' + ai_translated: 'Traduit par IA' + switch_to: 'Passer' + translated_by: 'Traduit par:' + legend: 'Légende' +formatter: + description: 'Soumettre les délais des conférences Python dans différents formats' + basic: + title: 'Informations de base' + name: 'Nom de la conférence' + year: 'Année' + type: 'Type de conférence' + attendees: 'Participants attendus' + url: 'URL du site web' + location_date: + title: 'Lieu et date' + city: 'Ville' + city_help: 'Entrez uniquement le nom de la ville' + country: 'Pays' + country_help: 'Commencez à taper pour voir les pays correspondants avec drapeaux' + venue: 'Lieu' + extra_places: "Lieux supplémentaires" + extra_help: "Pour les événements hybrides ou en ligne, ajoutez des lieux supplémentaires séparés par des virgules ici." + start_date: 'Date de début' + end_date: 'Date de fin' + timezone: 'Fuseau horaire' + timezone_help: 'Commencez à taper pour sélectionner le fuseau horaire de la conférence' + cfp: + title: 'Appel à propositions' + status: 'Statut du CfP' + tba: 'À annoncer' + none: 'Pas de CfP' + date: 'Utiliser la date' + deadline: 'Date limite de soumission' + deadline_help: 'La date limite pour soumettre des propositions de présentations' + link: 'Lien du CfP' + additional_info: + title: 'Informations supplémentaires' + sponsor: 'URL de parrainage' + finaid: "URL d'aide financière" + mastodon: 'URL Mastodon' + bsky: 'URL Bluesky' + notes: 'Notes supplémentaires' + notes_place: 'Notes supplémentaires sur la conférence' + submission_guidelines: 'Directives de soumission' + generate_output: 'Générer les formats' + generated_outputs: 'Formats générées' + csv_format: 'Format CSV' + yaml_format: 'Format YAML' + calendar_format: 'Format calendrier' + copy: 'Copier dans le presse-papiers' + required: "Veuillez remplir tous les champs obligatoires marqués du *." diff --git a/_i18n/fr/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/fr/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..432a1c1c163 --- /dev/null +++ b/_i18n/fr/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: Comment obtenir une présentation lors de conférences Python ? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +Les conférences Python sont une excellente plateforme pour partager des connaissances, réseauter avec des pairs et se tenir au courant des derniers développements dans la communauté Python. Si vous êtes passionné par Python et souhaitez partager vos idées avec un public plus large, parler lors d'une conférence Python peut être une excellente opportunité. Dans cet article de blog, nous explorerons comment obtenir une présentation lors de conférences Python. + +### Être invité + +Une façon d'être invité à parler lors de conférences Python est d'avoir une réputation établie dans la communauté. Supposons que vous ayez contribué à des projets open-source, écrit des articles ou des billets de blog sur Python, ou parlé lors de meetups ou d'événements plus petits. Dans ce cas, vous pourriez attirer l'attention des organisateurs de conférences. + +De plus, si vous êtes un expert dans un domaine spécifique, comme l'apprentissage automatique ou le développement web, vous pourriez être invité à parler lors de conférences axées sur ces sujets. Pour augmenter vos chances d'être invité, assistez à des conférences et des meetups, participez à des discussions en ligne et contribuez à la communauté Python de toutes les façons possibles. + +### Soumettre une proposition à un appel à propositions (CfP) + +Une autre façon d'obtenir une présentation lors de conférences Python est de soumettre une proposition à un appel à propositions (CfP). La plupart des conférences ouvrent des CfP plusieurs mois avant l'événement, et n'importe qui peut soumettre une proposition. +Lors de la soumission d'une proposition, il est essentiel de se rappeler que les organisateurs de conférences recherchent des présentations originales et engageantes qui plaisent à un public diversifié. Assurez-vous que votre soumission est bien écrite, claire et concise, et aborde un sujet pertinent et intéressant pour la communauté Python. + +Voici quelques conseils pour soumettre une proposition réussie : + +- Choisissez un sujet qui vous passionne et dans lequel vous avez de l'expertise. +- Assurez-vous que votre proposition est pertinente pour le thème ou l'orientation de la conférence. +- Rédigez un titre et un résumé convaincants qui attireront l'attention des organisateurs de la conférence et des participants. +- Décrivez votre présentation en détail, y compris ce que vous couvrirez et comment vous le présenterez. +- Incluez tout matériel de soutien, comme des exemples de code ou des diapositives, pour donner aux organisateurs une meilleure idée de votre style de présentation et de votre contenu. + +### Développer vos compétences d'orateur + +Si vous êtes nouveau dans l'art de parler en public, c'est une bonne idée de commencer petit en parlant lors de meetups ou d'événements locaux. + +Cela vous aidera à développer votre confiance et à affiner vos compétences de présentation. Au fur et à mesure que vous gagnez en expérience, vous pouvez vous diversifier et parler lors d'événements plus importants, comme des conférences régionales ou nationales. + +Demandez des commentaires aux participants et aux organisateurs après chaque présentation, et utilisez ces commentaires pour améliorer vos compétences d'orateur. + +### Réseauter avec d'autres orateurs et participants + +Enfin, le réseautage est essentiel pour obtenir une présentation lors de conférences Python. + +Assistez à autant de conférences et de meetups que possible, et essayez de vous connecter avec d'autres orateurs et participants. + +En établissant des relations avec d'autres membres de la communauté Python, vous augmenterez votre visibilité et votre crédibilité, ce qui peut mener à davantage d'opportunités de présentation à l'avenir. + +### Conclusion + +En conclusion, obtenir une présentation lors de conférences Python nécessite une combinaison d'expertise, de préparation et de réseautage. + +En suivant ces conseils, vous pouvez augmenter vos chances d'être invité à parler ou de soumettre avec succès une proposition à un CfP, et finalement partager vos connaissances avec la communauté Python au sens large. diff --git a/_i18n/fr/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/fr/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..c3ee782509b --- /dev/null +++ b/_i18n/fr/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: Comment créer une présentation fantastique pour les conférences Python ? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Les conférences Python offrent une excellente plateforme aux développeurs pour présenter leurs compétences, partager leurs connaissances et établir des réseaux avec d'autres professionnels. + +S'exprimer lors d'une conférence Python peut être une opportunité fantastique pour gagner en reconnaissance, établir sa crédibilité et apporter une contribution précieuse à la communauté Python. Cependant, présenter lors d'une conférence peut également être intimidant, surtout si vous êtes novice en matière de prise de parole en public ou si vous n'avez jamais présenté auparavant. Dans cette ressource, nous partagerons quelques conseils sur la façon de s'exprimer lors des conférences Python et de faire de votre présentation un succès. + +## Choisissez un sujet qui vous passionne + +La première étape pour réussir une présentation est de choisir un sujet qui vous passionne. Si vous êtes enthousiaste à propos de votre sujet, votre enthousiasme transparaîtra dans votre présentation. Vous aurez plus de chances d'engager et de captiver votre audience. Choisissez un sujet pertinent pour la communauté Python et qui offre des perspectives précieuses ou des solutions à des problèmes courants. + +## Comprenez votre audience + +Avant de commencer à préparer votre présentation, il est essentiel de comprendre la démographie, le niveau d'expertise et les intérêts de votre audience. Cela vous aidera à adapter votre contenu et votre prestation pour répondre à leurs attentes et à leurs besoins. Par exemple, si votre audience est composée de développeurs Python débutants, vous pouvez simplifier le jargon technique et vous concentrer sur les concepts fondamentaux. + +## Créez un récit captivant + +Un récit captivant est un aspect crucial de toute présentation réussie. Il est essentiel de structurer votre présentation de manière à raconter une histoire et à maintenir l'engagement de votre audience. Utilisez des anecdotes, des études de cas et des exemples concrets pour illustrer vos propos et ajouter une touche personnelle à votre présentation. Assurez-vous de mettre en évidence et de présenter les points à retenir les plus importants de manière claire et concise. + +## Pratiquez, pratiquez, pratiquez + +La pratique est essentielle pour livrer une présentation soignée et confiante. Répétez votre présentation plusieurs fois jusqu'à ce que vous vous sentiez à l'aise avec votre contenu et votre prestation. Chronométrez votre présentation pour vous assurer qu'elle s'inscrit dans le temps imparti. Envisagez d'enregistrer vos sessions de pratique et de les revoir pour identifier les domaines à améliorer. + +## Utilisez des visuels pour soutenir votre message + +Les supports visuels comme les diapositives et les diagrammes peuvent aider à soutenir votre message et à maintenir l'engagement de votre audience. Cependant, veillez à ne pas surcharger votre présentation avec trop de visuels, ce qui pourrait distraire de votre message. Utilisez des graphiques et des images pour illustrer des concepts et des données complexes, et gardez vos diapositives simples et visuellement attrayantes. + +## Engagez-vous avec votre audience + +S'engager avec votre audience est un aspect crucial d'une présentation réussie. Encouragez votre audience à participer en posant des questions, en menant des sondages ou en utilisant des outils interactifs. Cela aidera à maintenir l'engagement de votre audience et leur permettra de contribuer à la discussion. Soyez prêt à répondre aux questions et à aborder toutes les préoccupations ou retours qui pourraient surgir. + +## Conclusion + +S'exprimer lors d'une conférence Python peut être un excellent moyen de partager vos connaissances et d'apporter une contribution précieuse à la communauté. En suivant ces conseils, vous pouvez préparer une présentation convaincante qui engage et résonne avec votre audience. N'oubliez pas de choisir un sujet qui vous passionne, de comprendre votre audience, de créer un récit captivant, de pratiquer votre prestation, d'utiliser des visuels pour soutenir votre message et de vous engager avec votre audience. Bonne chance et bonne présentation! diff --git a/_i18n/fr/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/fr/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..942ce048a06 --- /dev/null +++ b/_i18n/fr/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,38 @@ +--- +title: Qu'est-ce qu'un CfP de conférence Python ? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'conference'] +--- + +Un Appel à Propositions (CfP) ou Appel à Participation est un terme courant utilisé dans les communautés académiques, de recherche et professionnelles pour inviter des individus ou des groupes à soumettre des propositions ou des résumés pour des conférences, des ateliers, des symposiums et d'autres événements. + +Comme la communauté Python est composée de sympathiques passionnés, cette même terminologie a fait son chemin dans le langage courant de Python. + +## Qu'est-ce qu'un CfP ? + +En termes simples, un CfP est une invitation ouverte aux experts, universitaires, chercheurs et praticiens pour présenter leurs idées, résultats de recherche et études de cas dans un domaine particulier ou un domaine d'intérêt. + +Un CfP est généralement émis par des organisateurs d'événements, des comités de conférence ou des institutions académiques pour solliciter des soumissions de la part d'individus ou de groupes intéressés. + +## À quoi servent les CfP ? + +L'objectif d'un CfP est d'encourager un large éventail de participants à s'engager dans un événement ou une conférence, assurant ainsi une diversité de perspectives et d'idées. + +Les CfP décrivent souvent le thème de l'événement, les sujets d'intérêt et les directives de soumission. Ils précisent également les types de soumissions acceptées, comme les articles de recherche, les études de cas, les posters ou les ateliers. + +## Comment participer à un CfP ? + +Le processus de soumission pour un CfP implique généralement la préparation d'une proposition ou d'un résumé qui inclut un sommaire du sujet proposé, la méthodologie de recherche ou l'approche, et les résultats attendus. + +Certains CfP académiques peuvent exiger la soumission d'un article complet, tandis que d'autres peuvent demander un bref résumé. + +Les CfP Python exigent rarement la soumission de matériaux complets, car ils ne publient pas d'articles. Cependant, il est vital d'éviter le piège commun de promettre uniquement des travaux futurs. + +## Conclusion + +En résumé, un CfP invite des experts, des universitaires, des chercheurs et des praticiens à soumettre des propositions ou des résumés pour un événement ou une conférence. + +Il joue un rôle vital en facilitant le partage de connaissances et d'expertise, en promouvant les discussions et en créant des opportunités de réseautage entre professionnels dans un domaine particulier. + +Si vous êtes intéressé à assister ou à présenter lors d'une conférence ou d'un événement, gardez un œil sur les CfP! diff --git a/_i18n/fr/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/fr/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..32d56cda67e --- /dev/null +++ b/_i18n/fr/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: Comment rédiger une excellente proposition de présentation pour les conférences Python +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +Rédiger une bonne proposition de conférence peut être un défi. Cependant, certains éléments clés peuvent aider à faire ressortir votre proposition. Voici cinq composantes essentielles d'une proposition de conférence réussie. + +## Le sujet et pourquoi il est intéressant + +La première composante d'une bonne proposition de conférence est une description claire et convaincante du sujet que vous prévoyez d'aborder. Il est essentiel de communiquer pourquoi votre sujet est pertinent et passionnant pour le public de la conférence. Assurez-vous de mettre en évidence tout aspect unique ou innovant de votre sujet et tout défi ou opportunité qu'il présente. + +## Le public qui bénéficiera de cette présentation/tutoriel + +Identifier votre public cible est crucial pour créer une proposition de conférence réussie. + +Soyez précis sur qui bénéficiera de votre présentation ou tutoriel et ce qu'ils apprendront. + +Comprendre votre public vous aidera à adapter votre contenu et à vous assurer que vous fournissez des idées et des points à retenir précieux. + +## Les bénéfices pour le public + +Qu'est-ce que les participants peuvent s'attendre à retirer de votre présentation ou tutoriel ? Soyez clair sur les principaux points à retenir que vous espérez fournir. + +Cela aidera les participants à évaluer si votre présentation correspond à leurs intérêts et besoins. + +Cela vous aidera également à structurer votre présentation et à rester sur la bonne voie pour délivrer la valeur promise. + +## Toute connaissance préalable nécessaire pour comprendre la présentation/tutoriel + +Lors de l'élaboration de votre proposition, il est important de considérer quelles connaissances préalables votre public aura besoin pour comprendre et s'engager avec votre contenu. + +Soyez clair sur les prérequis, et fournissez des liens ou des ressources que les participants peuvent utiliser pour rafraîchir leurs connaissances avant d'assister. + +## Répartition approximative du temps consacré à chaque partie du contenu + +Une répartition détaillée de la façon dont vous prévoyez de couvrir votre matériel est vitale pour aider les participants à comprendre ce qu'ils peuvent attendre de votre présentation ou tutoriel. + +En esquissant une structure claire et un calendrier pour votre présentation, vous aiderez les participants à rester engagés et concentrés sur votre contenu. Cela vous aidera également à rester sur la bonne voie et à couvrir tous les points clés que vous souhaitez aborder. + +## Conclusion + +En conclusion, une bonne proposition de conférence devrait fournir une description claire et convaincante du sujet, identifier le public cible et ses besoins, communiquer clairement les points à retenir et toute connaissance préalable requise, et fournir une répartition détaillée du matériel. L'inclusion de ces composantes essentielles augmentera les chances que votre proposition soit acceptée et que vous délivriez une présentation réussie à la conférence. + +_Cette liste développe les excellents points formulés par la [conférence Pydata Global](https://pydata.org/global2022/present/)._ diff --git a/_i18n/fr/_posts/2023-03-07-find-target-audience.md b/_i18n/fr/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..5515ad094e8 --- /dev/null +++ b/_i18n/fr/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: Comment définir votre public cible pour une présentation lors d'une conférence Python ? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +Lorsqu'il s'agit de soumettre une proposition pour une présentation de conférence, il est essentiel de définir votre public cible. Savoir à qui vous vous adressez peut vous aider à adapter votre présentation aux besoins, aux intérêts et aux connaissances préalables de l'audience. Dans ce billet, nous discuterons de la manière de définir votre public cible pour une proposition de conférence et pourquoi c'est important. + +## Considérez leur rôle professionnel + +Tout d'abord, vous devez considérer le rôle professionnel de votre public cible. S'agit-il de data scientists, d'ingénieurs en apprentissage automatique ou logiciel, de chercheurs, ou autre chose ? + +Connaître leur rôle professionnel peut vous aider à déterminer quels sujets et techniques sont les plus pertinents pour eux. + +Par exemple, si vous présentez une nouvelle technique de visualisation de données, les data scientists et les chercheurs peuvent être plus intéressés par son fonctionnement. + +Pendant ce temps, les ingénieurs peuvent être plus intéressés par la façon dont elle peut être mise en œuvre dans leurs systèmes existants. + +## Pensez à l'expérience + +Ensuite, considérez le niveau d'expérience de votre public cible. Sont-ils débutants, intermédiaires ou avancés dans le sujet ? + +Cela affectera la façon dont vous présentez vos idées et la quantité d'informations contextuelles que vous fournissez. + +Par exemple, si votre présentation porte sur un algorithme complexe, un public avancé peut être intéressé par les détails techniques et les exemples de code, tandis que les débutants peuvent avoir besoin d'une explication simplifiée des concepts pour suivre la présentation. + +## Envisagez une niche secondaire + +Croyez-moi, j'aime parler d'apprentissage automatique. Mais lorsque les gens ne me connaissent pas, ils sont peu susceptibles d'être intéressés par cette présentation. + +Cependant, vous pourriez parler de "l'apprentissage automatique en médecine" ou "appliquer des réseaux de neurones dans la prévision météorologique et climatique", rendant la présentation incontournable pour certaines personnes qui auraient autrement pu manquer la proposition. + +C'est une façon de dire exactement à votre public cible qu'une présentation est pour eux. + +## Pourquoi définissons-nous notre public cible ? + +Définir votre public cible est crucial pour deux raisons principales. + +Premièrement, cela vous aide à concentrer votre présentation sur les sujets les plus pertinents et intéressants pour votre audience. Cela peut rendre votre présentation plus engageante et précieuse pour les participants. + +Deuxièmement, cela aide les participants potentiels à décider si votre présentation correspond à leurs besoins et intérêts. + +S'ils peuvent facilement voir que votre présentation cible leur rôle professionnel et leur niveau d'expérience, ils sont plus susceptibles d'y assister et d'y trouver de la valeur. + +## Considérez la conférence elle-même + +Lors de la rédaction de votre proposition de conférence, assurez-vous d'inclure des informations sur votre public cible. + +Cela pourrait être aussi simple que d'inclure une déclaration comme "Cette présentation est destinée aux data scientists avec un niveau d'expérience intermédiaire." Fournir cette information peut aider les évaluateurs et les participants à comprendre à qui s'adresse votre présentation et si elle s'aligne avec les objectifs de la conférence. + +## Conclusion + +Définir votre public cible est une étape essentielle dans la préparation d'une présentation de conférence. En considérant le rôle professionnel et le niveau d'expérience de votre audience, vous pouvez adapter votre présentation à leurs besoins et intérêts, la rendant plus engageante et utile pour les participants. Assurez-vous d'inclure des informations sur votre public cible dans votre proposition de conférence pour aider les évaluateurs et les participants à comprendre à qui s'adresse votre présentation et si elle leur convient. diff --git a/_i18n/fr/_posts/2023-03-08-common-pitfalls.md b/_i18n/fr/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..1c77a21b6d9 --- /dev/null +++ b/_i18n/fr/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 9 pièges courants qui font rejeter votre proposition de présentation pour les conférences Python +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +Si vous envisagez de soumettre une proposition pour une présentation en conférence, il est essentiel de savoir ce qu'il faut éviter pour augmenter vos chances d'acceptation. Voici neuf pièges courants à surveiller : + +## Les argumentaires de vente + +N'oubliez pas que la conférence est une communauté de créateurs et d'utilisateurs d'outils de calcul scientifique open-source. Bien que vous puissiez faire référence à votre produit ou plateforme propriétaire, l'audience trouvera la présentation plus intéressante s'ils peuvent essayer vos techniques avec la stack PyData open-source. Évitez de faire une vente agressive et concentrez-vous plutôt sur la définition du problème, les stratégies proposées et le domaine d'activité. + +## Les présentations répétées + +Les conférences préfèrent les nouvelles présentations et les nouveaux orateurs. Si votre présentation est déjà disponible en ligne, il est peu probable qu'elle soit acceptée pour la conférence. Essayez d'apporter de nouvelles perspectives, techniques ou points de vue sur un sujet qui n'a pas été couvert auparavant. + +## Le manque de clarté + +Votre proposition doit communiquer clairement de quoi parle votre présentation et ce que les participants peuvent s'attendre à apprendre. Si votre proposition est peu claire, décousue ou difficile à suivre, les examinateurs peuvent ne pas être en mesure de déterminer si votre présentation s'aligne sur les objectifs de la conférence ou convient à l'audience visée. + +## Le manque d'originalité + +Les examinateurs recherchent des présentations uniques, perspicaces et innovantes qui offrent des perspectives fraîches ou de nouvelles solutions à des problèmes courants. Si votre proposition couvre un sujet qui a déjà été abordé plusieurs fois ou n'apporte pas de nouvelles idées ou techniques, les examinateurs peuvent la rejeter. Cela ne signifie pas qu'une étude de cas ou une nouvelle approche d'un problème ne sera pas acceptée, mais il vaut la peine de considérer cette perspective supplémentaire. + +## Les propositions trop longues + +Gardez votre proposition simple et claire. Les bonnes propositions fournissent généralement toutes les informations vitales en 250 mots. Ce n'est pas une limite stricte et varie selon les conférences. C'est une suggestion pour vous aider à rester concentré et à éviter de perdre l'attention des examinateurs. + +## Le manque de pertinence + +Assurez-vous que votre présentation s'aligne sur le thème ou le focus de la conférence. Si votre proposition n'est que tangentiellement liée aux objectifs de la conférence, les examinateurs peuvent ne pas voir comment elle s'intègre dans le tableau d'ensemble ou comment elle bénéficierait aux participants. + +## Les travaux futurs + +Bien que la discussion sur les travaux futurs soit passionnante et puisse être mentionnée dans votre présentation, le contenu principal de la présentation devrait déjà être formé, et vous devriez être capable de le décrire dans votre proposition. Ne vous fiez pas trop à la collecte future de données ou au prototypage futur car les choses ne se passent souvent pas comme prévu. Assurez-vous de fournir des exemples concrets et des cas d'utilisation. + +## Le contenu inapproprié ou offensant + +Gardez votre langage et votre ton professionnels et respectueux, et évitez les sujets controversés ou sensibles qui pourraient offenser ou aliéner les participants. Les propositions contenant du contenu inapproprié, offensant ou discriminatoire seront probablement rejetées. + +## La mauvaise adéquation avec le format de la conférence + +Les conférences ont différents formats, des lightning talks aux ateliers en passant par les discours d'ouverture. Assurez-vous que votre proposition s'aligne sur le format et la durée de la conférence et peut être livrée efficacement dans ce format. Considérez tout équipement, matériel ou ressource nécessaire pour votre présentation. + +En évitant ces pièges courants, vous pouvez augmenter vos chances de soumettre une proposition réussie pour une présentation en conférence qui s'aligne sur les objectifs de la conférence, est pertinente pour les participants et offre de nouvelles perspectives ou techniques. diff --git a/_i18n/fr/_posts/2023-03-09-what-about.md b/_i18n/fr/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..b794628bdce --- /dev/null +++ b/_i18n/fr/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: Sur quoi devrait porter ma présentation à une conférence Python ? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Nous sommes souvent confrontés à un paradoxe lorsque nous décidons enfin de faire une présentation lors d'une conférence Python. Nous avons appris tant de choses passionnantes. Il y a tellement de sujets intéressants. Mais sur quoi ma présentation Python devrait-elle porter?! + +Alors, félicitations pour avoir décidé de présenter sur Python ! Vous êtes impatient de partager vos connaissances et votre expérience avec d'autres. Plongeons dans le sujet! + +Tout d'abord, pensez à votre public. Qui souhaitez-vous voir assister à votre présentation ? S'agit-il de débutants, d'utilisateurs intermédiaires ou avancés de Python? Ont-ils un intérêt spécifique ou un problème qu'ils souhaitent résoudre avec Python ? Comprendre l'expertise et l'intérêt de votre public vous aidera à choisir un sujet qui les attirera et les gardera engagés. + +Ensuite, considérez le type de présentation que vous souhaitez donner. Voulez-vous plonger profondément dans un sujet complexe ou rester simple avec un tutoriel pratique? Voulez-vous vous concentrer sur les capacités mathématiques de Python ou sur des applications pratiques ? Il est crucial de choisir un sujet qui correspond à votre expertise et à votre passion tout en gardant votre public à l'esprit. + +Une fois que vous avez décidé de votre sujet et du type de présentation, réfléchissez au ton que vous souhaitez adopter. Voulez-vous être léger et amusant ou plus sérieux et prudent ? Il n'y a pas de bonne ou de mauvaise réponse ici, mais assurez-vous que votre ton est approprié pour votre sujet et votre public. + +N'oubliez pas que votre présentation vise à éduquer et à inspirer les autres sur Python, alors assurez-vous que vos points à retenir sont clairs et précieux. Qu'est-ce que votre public devrait apprendre ou retenir de votre présentation ? Comment peuvent-ils appliquer ce qu'ils ont appris dans leurs projets Python ou leurs carrières ? + +En résumé, lorsque vous décidez du sujet de votre présentation Python, tenez compte de votre public, du type de présentation et du ton que vous souhaitez adopter. Assurez-vous que vos points à retenir sont clairs et précieux pour votre public. Et surtout, amusez-vous et partagez votre passion pour Python avec les autres! diff --git a/_i18n/fr/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/fr/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..0d88caf8a02 --- /dev/null +++ b/_i18n/fr/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,51 @@ +--- +title: Explorer des ressources supplémentaires pour les délais des conférences +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +Pythondeadlin.es est une destination populaire pour la communauté Python qui cherche à trouver les délais des conférences en un seul endroit pratique depuis l'année dernière. + +Cependant, il est important de connaître d'autres ressources précieuses qui peuvent améliorer votre expérience de planification de conférences et favoriser la collaboration au sein de la communauté Python. + +Dans ce billet de blog, nous explorerons deux de ces ressources qui jouent un rôle vital dans l'agrégation des informations sur les conférences et l'unification de la communauté Python. Plongeons-y ! + +## GitHub Python-Organizers : une mine d'informations + +Le [dépôt GitHub Python-Organizers](https://github.com/python-organizers/conferences) est une ressource précieuse pour les organisateurs de conférences, les participants et les orateurs. + +Il sert de centre de données centralisé pour les conférences, fournissant une collection organisée de conférences, de délais de soumission, de dates d'événements, d'informations sur les sponsors et de détails sur les lieux. Cette plateforme collaborative encourage les organisateurs d'événements à partager leurs informations sur les conférences et à contribuer à l'exactitude et à l'exhaustivité des données. + +En utilisant le GitHub Python-Organizers, vous pouvez accéder à une richesse de connaissances et collaborer avec d'autres organisateurs. + +Que vous prévoyiez d'assister ou de présenter à une conférence Python, cette ressource vous permet de prendre des décisions éclairées et de rester informé des derniers délais de conférences. + +Le dépôt GitHub facilite l'interaction et favorise l'engagement communautaire, encourageant les individus à participer activement à la promotion, à la croissance et au succès des conférences Python dans le monde entier. + +## La liste officielle des événements Python : unir la communauté + +La [liste officielle des événements Python](https://www.python.org/events/) gérée via la liste de diffusion Python sert de plateforme unificatrice pour la communauté Python. + +Cette ressource complète fournit un aperçu des prochains événements Python, y compris les conférences, les meetups, les ateliers et plus encore. Bien qu'elle offre des informations sur les délais, elle va au-delà pour promouvoir la collaboration, le réseautage et le partage d'idées au sein de la communauté. + +Vous pouvez vous abonner à la liste de diffusion, mais la page web vous offre une carte et un calendrier Google auxquels vous pouvez facilement vous abonner pour recevoir des mises à jour. Cela vous permet de visualiser et de planifier votre calendrier de conférences plus efficacement. + +Cette plateforme inclusive rassemble des passionnés de Python de divers horizons et les encourage à se connecter, à apprendre et à contribuer à l'écosystème Python dynamique. + +## Embrasser la collaboration pour une planification améliorée des conférences + +Bien que Pythondeadlin.es reste une ressource précieuse, il est important d'explorer le paysage plus large de l'agrégation d'informations sur les conférences. + +Le dépôt GitHub Python-Organizers et la liste officielle des événements Python sont essentiels pour unir la communauté Python et favoriser la collaboration. + +En utilisant ces ressources, vous pouvez rester informé des prochains événements Python, vous connecter avec des personnes partageant les mêmes idées et contribuer activement à la croissance et au succès des conférences Python. Embrasser la collaboration nous permet de créer des conférences plus fortes et plus dynamiques qui répondent aux besoins et intérêts divers de la communauté Python. + +Assurez-vous de consulter les ressources suivantes pour plus d'informations : + +- [GitHub Python-Organizers](https://github.com/python-organizers/conferences) +- [Liste officielle des événements Python](https://www.python.org/events/) + +En utilisant ces plateformes, nous pouvons rester informés des prochains événements Python, nous connecter avec des personnes partageant les mêmes idées et contribuer activement au succès de nos conférences. Collaborons, partageons nos connaissances et forgeons une communauté Python plus forte. + +Ensemble, nous pouvons façonner l'avenir des événements Python et favoriser un environnement où chacun peut apprendre, grandir et s'épanouir. diff --git a/_i18n/fr/calendar/description.md b/_i18n/fr/calendar/description.md new file mode 100644 index 00000000000..b5e56b65b00 --- /dev/null +++ b/_i18n/fr/calendar/description.md @@ -0,0 +1,6 @@ +Vue d'ensemble de PythonDeadlin.es des échéances et dates de conférences Python dans un calendrier. + +Vous pouvez optionnellement exporter **toutes les échéances** vers Google Agenda ou +iCal. Ce calendrier est parfait pour suivre les échéances réelles ! + +Alternativement, abonnez-vous aux **événements Python à venir** sur votre Google Agenda ou iCal. Celui-ci est le calendrier d'événements classique. diff --git a/_i18n/fr/dates/pretty_dates.html b/_i18n/fr/dates/pretty_dates.html new file mode 100644 index 00000000000..85668e97fe3 --- /dev/null +++ b/_i18n/fr/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil %} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture %} +{% elsif include.start == nil %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.until" %} {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} +{% elsif include.end == nil %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign start_day = start_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.from" %} {{ start_day }} {{ start_month }} {{ start_year }}{% endcapture %} +{% else %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + + {% if start_date == end_date %} + {% assign day = start_date | date: "%-d" %} + {% assign year = start_date | date: "%Y" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture pretty_date %}{{ day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} – {{ end_day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} – {{ end_day }} {{ end_month }} {{ year }}{% endcapture %} + + {% else %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} {{ start_year }} – {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} + {% endif %} +{% endif %}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/fr/footer/jesper.md b/_i18n/fr/footer/jesper.md new file mode 100644 index 00000000000..33058fa3b68 --- /dev/null +++ b/_i18n/fr/footer/jesper.md @@ -0,0 +1 @@ +Jesper Dramsch est le créateur de ML.recipes, data-science-gui.de, Late to the Party 🎉 et la Communauté Latent Space. diff --git a/_i18n/fr/footer/maintainer.md b/_i18n/fr/footer/maintainer.md new file mode 100644 index 00000000000..1e34b2151fd --- /dev/null +++ b/_i18n/fr/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

Créé par Jesper Dramsch • Open Source • Piloté par la communauté

+

Inspiré par aideadlin.es • Archivage de {{confs | size}} conférences Python depuis 2022

diff --git a/_i18n/fr/footer/terms.md b/_i18n/fr/footer/terms.md new file mode 100644 index 00000000000..971fd27e91e --- /dev/null +++ b/_i18n/fr/footer/terms.md @@ -0,0 +1,3 @@ +

Aucune garantie d'exactitude, veuillez corriger les erreurs en soumettant une pull request.

+ +Mentions légalesPolitique de confidentialité diff --git a/_i18n/fr/formatter/countries.html b/_i18n/fr/formatter/countries.html new file mode 100644 index 00000000000..2d6a9788d68 --- /dev/null +++ b/_i18n/fr/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: 'Afghanistan', code: 'AFG', flag: '🇦🇫' }, +{ name: 'Albanie', code: 'ALB', flag: '🇦🇱' }, +{ name: 'Algérie', code: 'DZA', flag: '🇩🇿' }, +{ name: 'Andorre', code: 'AND', flag: '🇦🇩' }, +{ name: 'Angola', code: 'AGO', flag: '🇦🇴' }, +{ name: 'Antigua-et-Barbuda', code: 'ATG', flag: '🇦🇬' }, +{ name: 'Argentine', code: 'ARG', flag: '🇦🇷' }, +{ name: 'Arménie', code: 'ARM', flag: '🇦🇲' }, +{ name: 'Australie', code: 'AUS', flag: '🇦🇺' }, +{ name: 'Autriche', code: 'AUT', flag: '🇦🇹' }, +{ name: 'Azerbaïdjan', code: 'AZE', flag: '🇦🇿' }, +{ name: 'Bahamas', code: 'BHS', flag: '🇧🇸' }, +{ name: 'Bahreïn', code: 'BHR', flag: '🇧🇭' }, +{ name: 'Bangladesh', code: 'BGD', flag: '🇧🇩' }, +{ name: 'Barbade', code: 'BRB', flag: '🇧🇧' }, +{ name: 'Biélorussie', code: 'BLR', flag: '🇧🇾' }, +{ name: 'Belgique', code: 'BEL', flag: '🇧🇪' }, +{ name: 'Belize', code: 'BLZ', flag: '🇧🇿' }, +{ name: 'Bénin', code: 'BEN', flag: '🇧🇯' }, +{ name: 'Bhoutan', code: 'BTN', flag: '🇧🇹' }, +{ name: 'Bolivie', code: 'BOL', flag: '🇧🇴' }, +{ name: 'Bosnie-Herzégovine', code: 'BIH', flag: '🇧🇦' }, +{ name: 'Botswana', code: 'BWA', flag: '🇧🇼' }, +{ name: 'Brésil', code: 'BRA', flag: '🇧🇷' }, +{ name: 'Brunei', code: 'BRN', flag: '🇧🇳' }, +{ name: 'Bulgarie', code: 'BGR', flag: '🇧🇬' }, +{ name: 'Burkina Faso', code: 'BFA', flag: '🇧🇫' }, +{ name: 'Burundi', code: 'BDI', flag: '🇧🇮' }, +{ name: 'Cambodge', code: 'KHM', flag: '🇰🇭' }, +{ name: 'Cameroun', code: 'CMR', flag: '🇨🇲' }, +{ name: 'Canada', code: 'CAN', flag: '🇨🇦' }, +{ name: 'Cap-Vert', code: 'CPV', flag: '🇨🇻' }, +{ name: 'République centrafricaine', code: 'CAF', flag: '🇨🇫' }, +{ name: 'Tchad', code: 'TCD', flag: '🇹🇩' }, +{ name: 'Chili', code: 'CHL', flag: '🇨🇱' }, +{ name: 'Chine', code: 'CHN', flag: '🇨🇳' }, +{ name: 'Colombie', code: 'COL', flag: '🇨🇴' }, +{ name: 'Comores', code: 'COM', flag: '🇰🇲' }, +{ name: 'Congo', code: 'COG', flag: '🇨🇬' }, +{ name: 'Costa Rica', code: 'CRI', flag: '🇨🇷' }, +{ name: 'Croatie', code: 'HRV', flag: '🇭🇷' }, +{ name: 'Cuba', code: 'CUB', flag: '🇨🇺' }, +{ name: 'Chypre', code: 'CYP', flag: '🇨🇾' }, +{ name: 'République tchèque', code: 'CZE', flag: '🇨🇿' }, +{ name: 'Danemark', code: 'DNK', flag: '🇩🇰' }, +{ name: 'Djibouti', code: 'DJI', flag: '🇩🇯' }, +{ name: 'Dominique', code: 'DMA', flag: '🇩🇲' }, +{ name: 'République dominicaine', code: 'DOM', flag: '🇩🇴' }, +{ name: 'Équateur', code: 'ECU', flag: '🇪🇨' }, +{ name: 'Égypte', code: 'EGY', flag: '🇪🇬' }, +{ name: 'Salvador', code: 'SLV', flag: '🇸🇻' }, +{ name: 'Guinée équatoriale', code: 'GNQ', flag: '🇬🇶' }, +{ name: 'Érythrée', code: 'ERI', flag: '🇪🇷' }, +{ name: 'Estonie', code: 'EST', flag: '🇪🇪' }, +{ name: 'Éthiopie', code: 'ETH', flag: '🇪🇹' }, +{ name: 'Fidji', code: 'FJI', flag: '🇫🇯' }, +{ name: 'Finlande', code: 'FIN', flag: '🇫🇮' }, +{ name: 'France', code: 'FRA', flag: '🇫🇷' }, +{ name: 'Gabon', code: 'GAB', flag: '🇬🇦' }, +{ name: 'Gambie', code: 'GMB', flag: '🇬🇲' }, +{ name: 'Géorgie', code: 'GEO', flag: '🇬🇪' }, +{ name: 'Allemagne', code: 'DEU', flag: '🇩🇪' }, +{ name: 'Ghana', code: 'GHA', flag: '🇬🇭' }, +{ name: 'Grèce', code: 'GRC', flag: '🇬🇷' }, +{ name: 'Grenade', code: 'GRD', flag: '🇬🇩' }, +{ name: 'Guatemala', code: 'GTM', flag: '🇬🇹' }, +{ name: 'Guinée', code: 'GIN', flag: '🇬🇳' }, +{ name: 'Guinée-Bissau', code: 'GNB', flag: '🇬🇼' }, +{ name: 'Guyana', code: 'GUY', flag: '🇬🇾' }, +{ name: 'Haïti', code: 'HTI', flag: '🇭🇹' }, +{ name: 'Honduras', code: 'HND', flag: '🇭🇳' }, +{ name: 'Hongrie', code: 'HUN', flag: '🇭🇺' }, +{ name: 'Islande', code: 'ISL', flag: '🇮🇸' }, +{ name: 'Inde', code: 'IND', flag: '🇮🇳' }, +{ name: 'Indonésie', code: 'IDN', flag: '🇮🇩' }, +{ name: 'Iran', code: 'IRN', flag: '🇮🇷' }, +{ name: 'Irak', code: 'IRQ', flag: '🇮🇶' }, +{ name: 'Irlande', code: 'IRL', flag: '🇮🇪' }, +{ name: 'Israël', code: 'ISR', flag: '🇮🇱' }, +{ name: 'Italie', code: 'ITA', flag: '🇮🇹' }, +{ name: 'Jamaïque', code: 'JAM', flag: '🇯🇲' }, +{ name: 'Japon', code: 'JPN', flag: '🇯🇵' }, +{ name: 'Jordanie', code: 'JOR', flag: '🇯🇴' }, +{ name: 'Kazakhstan', code: 'KAZ', flag: '🇰🇿' }, +{ name: 'Kenya', code: 'KEN', flag: '🇰🇪' }, +{ name: 'Kiribati', code: 'KIR', flag: '🇰🇮' }, +{ name: 'Corée du Nord', code: 'PRK', flag: '🇰🇵' }, +{ name: 'Corée du Sud', code: 'KOR', flag: '🇰🇷' }, +{ name: 'Koweït', code: 'KWT', flag: '🇰🇼' }, +{ name: 'Kirghizistan', code: 'KGZ', flag: '🇰🇬' }, +{ name: 'Laos', code: 'LAO', flag: '🇱🇦' }, +{ name: 'Lettonie', code: 'LVA', flag: '🇱🇻' }, +{ name: 'Liban', code: 'LBN', flag: '🇱🇧' }, +{ name: 'Lesotho', code: 'LSO', flag: '🇱🇸' }, +{ name: 'Liberia', code: 'LBR', flag: '🇱🇷' }, +{ name: 'Libye', code: 'LBY', flag: '🇱🇾' }, +{ name: 'Liechtenstein', code: 'LIE', flag: '🇱🇮' }, +{ name: 'Lituanie', code: 'LTU', flag: '🇱🇹' }, +{ name: 'Luxembourg', code: 'LUX', flag: '🇱🇺' }, +{ name: 'Macédoine', code: 'MKD', flag: '🇲🇰' }, +{ name: 'Madagascar', code: 'MDG', flag: '🇲🇬' }, +{ name: 'Malawi', code: 'MWI', flag: '🇲🇼' }, +{ name: 'Malaisie', code: 'MYS', flag: '🇲🇾' }, +{ name: 'Maldives', code: 'MDV', flag: '🇲🇻' }, +{ name: 'Mali', code: 'MLI', flag: '🇲🇱' }, +{ name: 'Malte', code: 'MLT', flag: '🇲🇹' }, +{ name: 'Îles Marshall', code: 'MHL', flag: '🇲🇭' }, +{ name: 'Mauritanie', code: 'MRT', flag: '🇲🇷' }, +{ name: 'Maurice', code: 'MUS', flag: '🇲🇺' }, +{ name: 'Mexique', code: 'MEX', flag: '🇲🇽' }, +{ name: 'Micronésie', code: 'FSM', flag: '🇫🇲' }, +{ name: 'Moldavie', code: 'MDA', flag: '🇲🇩' }, +{ name: 'Monaco', code: 'MCO', flag: '🇲🇨' }, +{ name: 'Mongolie', code: 'MNG', flag: '🇲🇳' }, +{ name: 'Monténégro', code: 'MNE', flag: '🇲🇪' }, +{ name: 'Maroc', code: 'MAR', flag: '🇲🇦' }, +{ name: 'Mozambique', code: 'MOZ', flag: '🇲🇿' }, +{ name: 'Myanmar', code: 'MMR', flag: '🇲🇲' }, +{ name: 'Namibie', code: 'NAM', flag: '🇳🇦' }, +{ name: 'Nauru', code: 'NRU', flag: '🇳🇷' }, +{ name: 'Népal', code: 'NPL', flag: '🇳🇵' }, +{ name: 'Pays-Bas', code: 'NLD', flag: '🇳🇱' }, +{ name: 'Nouvelle-Zélande', code: 'NZL', flag: '🇳🇿' }, +{ name: 'Nicaragua', code: 'NIC', flag: '🇳🇮' }, +{ name: 'Niger', code: 'NER', flag: '🇳🇪' }, +{ name: 'Nigeria', code: 'NGA', flag: '🇳🇬' }, +{ name: 'Norvège', code: 'NOR', flag: '🇳🇴' }, +{ name: 'Oman', code: 'OMN', flag: '🇴🇲' }, +{ name: 'Pakistan', code: 'PAK', flag: '🇵🇰' }, +{ name: 'Palaos', code: 'PLW', flag: '🇵🇼' }, +{ name: 'Panama', code: 'PAN', flag: '🇵🇦' }, +{ name: 'Papouasie-Nouvelle-Guinée', code: 'PNG', flag: '🇵🇬' }, +{ name: 'Paraguay', code: 'PRY', flag: '🇵🇾' }, +{ name: 'Pérou', code: 'PER', flag: '🇵🇪' }, +{ name: 'Philippines', code: 'PHL', flag: '🇵🇭' }, +{ name: 'Pologne', code: 'POL', flag: '🇵🇱' }, +{ name: 'Portugal', code: 'PRT', flag: '🇵🇹' }, +{ name: 'Qatar', code: 'QAT', flag: '🇶🇦' }, +{ name: 'Roumanie', code: 'ROU', flag: '🇷🇴' }, +{ name: 'Russie', code: 'RUS', flag: '🇷🇺' }, +{ name: 'Rwanda', code: 'RWA', flag: '🇷🇼' }, +{ name: 'Saint-Christophe-et-Niévès', code: 'KNA', flag: '🇰🇳' }, +{ name: 'Sainte-Lucie', code: 'LCA', flag: '🇱🇨' }, +{ name: 'Saint-Vincent-et-les-Grenadines', code: 'VCT', flag: '🇻🇨' }, +{ name: 'Samoa', code: 'WSM', flag: '🇼🇸' }, +{ name: 'Saint-Marin', code: 'SMR', flag: '🇸🇲' }, +{ name: 'Sao Tomé-et-Principe', code: 'STP', flag: '🇸🇹' }, +{ name: 'Arabie saoudite', code: 'SAU', flag: '🇸🇦' }, +{ name: 'Sénégal', code: 'SEN', flag: '🇸🇳' }, +{ name: 'Serbie', code: 'SRB', flag: '🇷🇸' }, +{ name: 'Seychelles', code: 'SYC', flag: '🇸🇨' }, +{ name: 'Sierra Leone', code: 'SLE', flag: '🇸🇱' }, +{ name: 'Singapour', code: 'SGP', flag: '🇸🇬' }, +{ name: 'Slovaquie', code: 'SVK', flag: '🇸🇰' }, +{ name: 'Slovénie', code: 'SVN', flag: '🇸🇮' }, +{ name: 'Îles Salomon', code: 'SLB', flag: '🇸🇧' }, +{ name: 'Somalie', code: 'SOM', flag: '🇸🇴' }, +{ name: 'Afrique du Sud', code: 'ZAF', flag: '🇿🇦' }, +{ name: 'Soudan du Sud', code: 'SSD', flag: '🇸🇸' }, +{ name: 'Espagne', code: 'ESP', flag: '🇪🇸' }, +{ name: 'Sri Lanka', code: 'LKA', flag: '🇱🇰' }, +{ name: 'Soudan', code: 'SDN', flag: '🇸🇩' }, +{ name: 'Suriname', code: 'SUR', flag: '🇸🇷' }, +{ name: 'Swaziland', code: 'SWZ', flag: '🇸🇿' }, +{ name: 'Suède', code: 'SWE', flag: '🇸🇪' }, +{ name: 'Suisse', code: 'CHE', flag: '🇨🇭' }, +{ name: 'Syrie', code: 'SYR', flag: '🇸🇾' }, +{ name: 'Taïwan', code: 'TWN', flag: '🇹🇼' }, +{ name: 'Tadjikistan', code: 'TJK', flag: '🇹🇯' }, +{ name: 'Tanzanie', code: 'TZA', flag: '🇹🇿' }, +{ name: 'Thaïlande', code: 'THA', flag: '🇹🇭' }, +{ name: 'Timor oriental', code: 'TLS', flag: '🇹🇱' }, +{ name: 'Togo', code: 'TGO', flag: '🇹🇬' }, +{ name: 'Tonga', code: 'TON', flag: '🇹🇴' }, +{ name: 'Trinité-et-Tobago', code: 'TTO', flag: '🇹🇹' }, +{ name: 'Tunisie', code: 'TUN', flag: '🇹🇳' }, +{ name: 'Turquie', code: 'TUR', flag: '🇹🇷' }, +{ name: 'Turkménistan', code: 'TKM', flag: '🇹🇲' }, +{ name: 'Tuvalu', code: 'TUV', flag: '🇹🇻' }, +{ name: 'Ouganda', code: 'UGA', flag: '🇺🇬' }, +{ name: 'Ukraine', code: 'UKR', flag: '🇺🇦' }, +{ name: 'Émirats arabes unis', code: 'ARE', flag: '🇦🇪' }, +{ name: 'Royaume-Uni', code: 'GBR', flag: '🇬🇧' }, +{ name: 'États-Unis', code: 'USA', flag: '🇺🇸' }, +{ name: 'Uruguay', code: 'URY', flag: '🇺🇾' }, +{ name: 'Ouzbékistan', code: 'UZB', flag: '🇺🇿' }, +{ name: 'Vanuatu', code: 'VUT', flag: '🇻🇺' }, +{ name: 'Vatican', code: 'VAT', flag: '🇻🇦' }, +{ name: 'Venezuela', code: 'VEN', flag: '🇻🇪' }, +{ name: 'Viêt Nam', code: 'VNM', flag: '🇻🇳' }, +{ name: 'Yémen', code: 'YEM', flag: '🇾🇪' }, +{ name: 'Zambie', code: 'ZMB', flag: '🇿🇲' }, +{ name: 'Zimbabwe', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/fr/formatter/submission.html b/_i18n/fr/formatter/submission.html new file mode 100644 index 00000000000..bc26a2fd472 --- /dev/null +++ b/_i18n/fr/formatter/submission.html @@ -0,0 +1,55 @@ +
+
Comment soumettre les informations de votre conférence
+ +
+
1. Format CSV Python-Organizers
+

+ Ajoutez votre conférence au dépôt + python-organizers/conferences : +

+
    +
  • Créez un fork du dépôt
  • +
  • Modifiez le fichier CSV de l'année correspondante
  • +
  • Ajoutez la ligne de données de votre conférence
  • +
  • Soumettez une demande de pull request
  • +
+
+ +
+
2. Format YAML de PythonDeadlin.es
+

+ Ajoutez votre conférence à + jesperdramsch/python-deadlines : +

+
    +
  • Créez un fork du dépôt
  • +
  • Modifiez le fichier `_data/conferences.yml`
  • +
  • Ajoutez les données YAML de votre conférence à l'endroit approprié
  • +
  • Soumettez une demande de pull request
  • +
+
+ +
+
3. Format Calendrier de Python.org
+

Soumettez votre conférence au calendrier officiel des événements Python :

+
    +
  • + Envoyez un email à + + href="mailto:events@python.org" + >events[at]python.org + avec le texte au format calendrier +
  • +
  • Incluez la ligne d'objet : "Python Event Submission: [Nom de votre conférence]"
  • +
  • Attendez la confirmation de l'équipe des événements Python
  • +
+
+ +
+ Conseil : Soumettez à ces trois plateformes pour maximiser la visibilité + de votre conférence Python ! +
+
diff --git a/_i18n/fr/frontpage/description.md b/_i18n/fr/frontpage/description.md new file mode 100644 index 00000000000..53de846254e --- /dev/null +++ b/_i18n/fr/frontpage/description.md @@ -0,0 +1,5 @@ +Cet outil communautaire sert de référentiel central pour les échéances des appels à participation, propositions, ateliers et tutoriels lors des conférences Python. + +Les dates sont disponibles sous forme de comptes à rebours, dans les fuseaux horaires locaux et même sous forme de calendrier Google ci-dessous ! + +Les échéances sont affichées dans votre fuseau horaire local. Pour les voir dans les fuseaux horaires du site web de la conférence, cliquez sur la conférence. diff --git a/_i18n/fr/frontpage/hook.md b/_i18n/fr/frontpage/hook.md new file mode 100644 index 00000000000..1bef6e81c2f --- /dev/null +++ b/_i18n/fr/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es rassemble vos conférences Python préférées. diff --git a/_i18n/fr/maps/description.md b/_i18n/fr/maps/description.md new file mode 100644 index 00000000000..9ba70e6ed23 --- /dev/null +++ b/_i18n/fr/maps/description.md @@ -0,0 +1,3 @@ +Vue d'ensemble des échéances et dates de conférences sur une carte. + +Ci-dessous se trouvent toutes les futures conférences Python répertoriées sur PythonDeadlin.es dans un format spatial pratique. diff --git a/_i18n/fr/resources/description.md b/_i18n/fr/resources/description.md new file mode 100644 index 00000000000..9a8fe2e7579 --- /dev/null +++ b/_i18n/fr/resources/description.md @@ -0,0 +1,5 @@ +Cette page est dédiée à vous aider à rédiger d'excellents appels à propositions (CfP) pour les conférences Python. Vous y trouverez une collection d'articles de blog, de guides et de conseils pour rédiger des propositions convaincantes. + +Nos ressources couvrent divers aspects de la rédaction de CfP, du choix d'un sujet à la structuration de votre soumission. Que vous soyez un orateur débutant ou un présentateur expérimenté, ces outils visent à améliorer vos compétences en rédaction de propositions. + +Explorez notre contenu sélectionné pour augmenter vos chances de faire accepter votre présentation ou atelier lors des événements Python du monde entier. diff --git a/_i18n/fr/search/description.md b/_i18n/fr/search/description.md new file mode 100644 index 00000000000..9411976ac22 --- /dev/null +++ b/_i18n/fr/search/description.md @@ -0,0 +1,5 @@ +Les résultats de recherche de notre base de données complète des échéances et événements de conférences Python. Les résultats sont présentés sous forme de liste de pages pertinentes correspondant à votre requête. + +Chaque résultat comprend des informations clés telles que le nom de la conférence, les dates limites et de brèves descriptions. Les échéances sont affichées dans votre fuseau horaire local. + +Cliquez sur le nom d'une conférence pour afficher des informations plus détaillées, y compris les directives et les liens vers le site web officiel de la conférence. diff --git a/_i18n/fr/series/description.md b/_i18n/fr/series/description.md new file mode 100644 index 00000000000..90c377e6a73 --- /dev/null +++ b/_i18n/fr/series/description.md @@ -0,0 +1,4 @@ +Cette section de notre outil communautaire sert de répertoire complet des séries de conférences Python récurrentes. Vous y trouverez un aperçu des événements réguliers, leurs calendriers typiques et des informations historiques. + +Les séries sont présentées avec de brèves descriptions et des liens vers les événements passés, vous aidant à planifier votre participation à long terme aux conférences. +Consultez une série pour voir plus de détails et accéder aux informations sur ses événements à venir et passés. diff --git a/_i18n/fr/trademark/django.md b/_i18n/fr/trademark/django.md new file mode 100644 index 00000000000..d5aa8802ec4 --- /dev/null +++ b/_i18n/fr/trademark/django.md @@ -0,0 +1,2 @@ +

Django est une marque déposée de la Django Software Foundation. Ce site web, pythondeadlin.es, n'est pas affilié, approuvé ou sponsorisé par la Django Software Foundation ou par tout événement Django. Toutes les marques et logos utilisés sur ce site restent la propriété de leurs propriétaires respectifs. Toute référence à Django ou à d'autres marques est uniquement à titre informatif et n'implique aucune association avec les détenteurs des marques.

+

Pour plus d'informations sur la Django Software Foundation et sa marque, visitez https://www.djangoproject.com/foundation/.

diff --git a/_i18n/fr/trademark/generic.md b/_i18n/fr/trademark/generic.md new file mode 100644 index 00000000000..b70a7599d37 --- /dev/null +++ b/_i18n/fr/trademark/generic.md @@ -0,0 +1 @@ +

Toute utilisation des marques commerciales ou logos établis par les événements répertoriés sur ce site est à des fins informatives uniquement et n'implique aucune association avec les détenteurs respectifs des marques. Si vous êtes titulaire d'une marque et souhaitez que votre marque soit retirée de ce site, veuillez nous contacter.

diff --git a/_i18n/fr/trademark/pycon.md b/_i18n/fr/trademark/pycon.md new file mode 100644 index 00000000000..693d029d204 --- /dev/null +++ b/_i18n/fr/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon et PyLadies sont des marques déposées de la Python Software Foundation. Ce site web, pythondeadlin.es, n'est pas affilié, approuvé ou sponsorisé par la Python Software Foundation ou par tout événement PyCon. Toutes les marques et logos utilisés sur ce site restent la propriété de leurs propriétaires respectifs. Toute référence à PyCon ou à d'autres marques est uniquement à titre informatif et n'implique aucune association avec les détenteurs des marques.

diff --git a/_i18n/fr/trademark/pydata.md b/_i18n/fr/trademark/pydata.md new file mode 100644 index 00000000000..155e43cfe79 --- /dev/null +++ b/_i18n/fr/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS, PyData et Fiscally Sponsored Projects sont des marques déposées de NumFOCUS. Ce site web, pythondeadlin.es, n'est pas affilié, approuvé ou sponsorisé par NumFOCUS ou par tout événement PyData ou affilié. Toutes les marques et logos utilisés sur ce site restent la propriété de leurs propriétaires respectifs. Toute référence à NumFOCUS, PyData ou à d'autres marques est uniquement à titre informatif et n'implique aucune association avec les détenteurs des marques.

diff --git a/_i18n/hi.yml b/_i18n/hi.yml new file mode 100644 index 00000000000..4b14d4df680 --- /dev/null +++ b/_i18n/hi.yml @@ -0,0 +1,240 @@ +--- +global: + current: 'hi' + choose: 'भाषा चुनें' + sub_filter: 'उपश्रेणी द्वारा फ़िल्टर करें:' + cfp: 'भागीदारी के लिए आमंत्रण' + cfp_ext: 'विस्तारित सीएफपी' + subscribe: 'सदस्यता लें' +titles: + default: 'पायथन सम्मेलन समय सीमाएँ' + archive: 'पिछले पायथन सम्मेलन' + visit_archive: 'अभिलेखागार देखें' + calendar: 'पायथन सम्मेलन समय सीमा और तिथियों का कैलेंडर' + map: 'पायथन सम्मेलनों का नक्शा' + a404: 'पृष्ठ नहीं मिला' + privacy: 'गोपनीयता नीति' + resources: 'उत्कृष्ट CfP लेखन के लिए संसाधन' + series: 'पायथन इवेंट श्रृंखला सूची' + impressum: 'नियम और शर्तें' + past_events: 'पिछले आयोजन' + past_cfps: 'पिछले आमंत्रण' + search: 'खोजें' + about: 'पायथन सम्मेलन समय सीमाओं के बारे में' + languages: 'उपलब्ध भाषाएँ' + formatter: 'सम्मेलन समय सीमा फॉर्मेटर' +buttons: + ical: iCal प्राप्त करें + google: Google कैलेंडर में जोड़ें + github: GitHub पर सम्मेलन जमा करें + all_selected: सभी सम्मेलन चयनित + none_selected: कोई सम्मेलन चयनित नहीं +description: + summary: 'सम्मेलन और वर्षों में इसके आयोजनों का सारांश।' +header: + countdown: 'काउंटडाउन' + calendar: 'कैलेंडर' + maps: 'नक्शा' + series: 'श्रृंखला' + resources: 'संसाधन' + formatter: 'फॉर्मेटर ऐप' + course: 'ईमेल कोर्स' + articles: 'शुरू करने के लिए लेख' +conference: + title: 'सम्मेलन समय सीमाएँ' + finaid: 'वित्तीय सहायता' + sponsor: 'प्रायोजन अवसर' + all: 'के लिए सभी सम्मेलन' + download_dl: 'सम्मेलन समय सीमा डाउनलोड करें' + download_date: 'सम्मेलन तिथियां डाउनलोड करें' + deadline_tz_theirs: 'सम्मेलन वेबसाइट के समय क्षेत्र में समय सीमा' + deadline_tz_local: "आपके स्थानीय समय क्षेत्र में समय सीमा" +summary: + title: 'सम्मेलन सारांश' +subs: + PY: 'सामान्य पायथन' + SCIPY: 'वैज्ञानिक पायथन' + DATA: 'डेटा के लिए पायथन' + WEB: 'वेब के लिए पायथन' + BIZ: 'व्यापार के लिए पायथन' + GEO: 'पृथ्वी के लिए पायथन' + CAMP: 'पायथन कैंप' + DAY: 'पायथन दिवस' +series: + always: 'हमेशा आयोजित' + place: + last: 'पिछला सम्मेलन स्थान' + next: 'अगला सम्मेलन स्थान' + year: + last: 'पिछला आयोजन वर्ष' + next: 'अगला आयोजन वर्ष' +times: + tba: "घोषित किया जाएगा" + from: "से" + until: "तक" + normal: + days: 'दिन' + hours: 'घंटे' + minutes: 'मिनट' + seconds: 'सेकंड' + short: + days: 'दि' + hours: 'घं' + minutes: 'मि' + seconds: 'से' + months: + January: 'जनवरी' + February: 'फरवरी' + March: 'मार्च' + April: 'अप्रैल' + May: 'मई' + June: 'जून' + July: 'जुलाई' + August: 'अगस्त' + September: 'सितंबर' + October: 'अक्टूबर' + November: 'नवंबर' + December: 'दिसंबर' +social: + twitter: 'सम्मेलन ट्वीट करें' + facebook: 'FB पर सम्मेलन साझा करें' + linkedin: 'LinkedIn पर सम्मेलन साझा करें' + whatsapp: 'WhatsApp पर सम्मेलन साझा करें' + email: 'ईमेल द्वारा सम्मेलन साझा करें' +search: + no-results: 'कोई परिणाम नहीं मिला।' + error: 'खोज अनुक्रमणिका लोड करने में त्रुटि। कृपया बाद में पुनः प्रयास करें।' +about: + toggle_fullscreen: "पूर्ण स्क्रीन प्रस्तुति मोड टॉगल करें" + previous_slide: "पिछली स्लाइड" + next_slide: "अगली स्लाइड" + tagline: "कभी भी पायथन सम्मेलन की समय सीमा न चूकें!" + hero_description: "समुदाय-संचालित प्लेटफॉर्म जो पायथन डेवलपर्स को दुनिया भर के सम्मेलनों की खोज, ट्रैकिंग और जमा करने में मदद करता है।" + problem: + title: "चुनौती" + description: "विभिन्न वेबसाइटों, समय क्षेत्रों और प्रारूपों में पायथन सम्मेलन समय सीमाओं का ट्रैक रखना समय लेने वाला और त्रुटि-प्रवण है। कई डेवलपर्स अपने ज्ञान को साझा करने के अवसरों को चूक जाते हैं क्योंकि वे CFP के बारे में बहुत देर से जानते हैं।" + solution: + title: "हमारा समाधान" + description: "Pythondeadlin.es सभी पायथन सम्मेलन समय सीमाओं को एक जगह पर समेकित करता है, स्वचालित समय क्षेत्र रूपांतरण, कई रिमाइंडर विकल्प और आपके जमा करने की योजना बनाने में मदद करने के लिए व्यापक विवरण के साथ।" + features: + title: "मुख्य विशेषताएँ" + tracking: + title: "व्यापक ट्रैकिंग" + description: "आपके स्थानीय समय क्षेत्र में व्यक्तिगत काउंटडाउन टाइमर के साथ दुनिया भर में पायथन सम्मेलनों के लिए हर प्रस्ताव आमंत्रण (CfP) समय सीमा पर नज़र रखें।" + notifications: + title: "लचीली सूचनाएँ" + description: "चुनें कि आपको कैसे याद दिलाया जाए — आपके कार्यप्रवाह के अनुरूप समय पर अलर्ट प्राप्त करने के लिए iCal, Google कैलेंडर या RSS फीड के माध्यम से सदस्यता लें।" + coverage: + title: "वैश्विक कवरेज" + description: "हमारे इंटरैक्टिव मानचित्र दृश्य और व्यापक कैलेंडर अवलोकन के साथ, छह महाद्वीपों में PyCon से PyData तक पायथन इवेंट खोजें।" + language: + title: "बहुभाषी समर्थन" + description: "अंग्रेजी, स्पैनिश, जर्मन, फ्रेंच, ब्राजीलियन पुर्तगाली, चीनी, हिंदी, इंडोनेशियाई या रूसी में प्लेटफॉर्म तक पहुंचें, जिससे पायथन सम्मेलन विविध भाषाई पृष्ठभूमि के डेवलपर्स के लिए सुलभ हो जाते हैं।" + community: + title: "समुदाय संचालित" + description: "हमारे ओपन-सोर्स दृष्टिकोण से लाभ उठाएं जहां पायथन समुदाय सहयोगात्मक रूप से सटीक और अप-टू-डेट सम्मेलन जानकारी बनाए रखता है।" + mobile: + title: "मोबाइल अनुकूल" + description: "हमारे प्रतिक्रियाशील डिज़ाइन के साथ चलते-फिरते समय सीमाओं की जांच करें जो किसी भी डिवाइस के लिए सहज रूप से अनुकूल है — व्यस्त डेवलपर्स के लिए एकदम सही।" + categories: + title: "सम्मेलन श्रेणियाँ" + intro: "हम कई विशेषज्ञताओं में पायथन सम्मेलनों की ट्रैकिंग करते हैं:" + stats: + title: "संख्याओं में" + conferences: + label: "ट्रैक किए गए सम्मेलन" + description: "दुनिया भर में पायथन इवेंट का व्यापक डेटाबेस" + categories: + label: "सम्मेलन श्रेणियाँ" + description: "सामान्य पायथन से विशेष निशों तक" + guides: + label: "संसाधन गाइड" + description: "पहली बार और अनुभवी वक्ताओं के लिए व्यापक गाइड" + countries: + label: "विभिन्न देश" + description: "दुनिया भर से पायथन सम्मेलन" + languages: + label: "भाषाएँ" + description: "पायथन सम्मेलनों को वैश्विक रूप से सुलभ बनाना" + testimonials: + title: "उपयोगकर्ता क्या कहते हैं" + first: + quote: "\"Pythondeadlin.es के लिए धन्यवाद, मैं अपना पहला सम्मेलन प्रस्ताव तैयारी के लिए पर्याप्त समय के साथ जमा कर पाया। यह साइट मेरे पेशेवर विकास में एक आवश्यक उपकरण बन गई है।\"" + author: "— पायथन डेवलपर" + second: + quote: "\"एक सम्मेलन आयोजक के रूप में, मैं सराहना करता हूं कि हमारा कार्यक्रम सटीक रूप से प्रस्तुत किया जाता है। प्लेटफॉर्म ने हमें संभावित वक्ताओं के व्यापक दर्शकों तक पहुंचने में मदद की है।\"" + author: "— PyCon आयोजक" + third: + quote: "\"हम अब नियमित रूप से अपने मीटअप में PythonDeadlin.es दिखाते हैं ताकि हमारे प्रतिभागियों के लिए रुचि के सम्मेलनों पर नज़र रख सकें।\"" + author: "— मीटअप आयोजक" + use_cases: + title: "लोग Pythondeadlin.es का उपयोग कैसे करते हैं" + first_time: + title: "पहली बार के वक्ता" + description: "आकर्षक प्रस्ताव तैयार करने के लिए पर्याप्त समय के साथ शुरुआती-अनुकूल सम्मेलनों का पता लगाएं और प्रेरणा और मार्गदर्शन के लिए संसाधन अनुभाग का उपयोग करें।" + frequent: + title: "नियमित प्रस्तुतकर्ता" + description: "अपने वार्षिक प्रेजेंटेशन शेड्यूल की योजना बनाएं और कई इवेंट्स के सबमिशन डेडलाइन को प्राथमिकता दें।" + organizers: + title: "सम्मेलन आयोजक" + description: "अपने इवेंट को हमारे डेटाबेस में जोड़कर यह सुनिश्चित करें कि आपका कार्यक्रम संभावित वक्ताओं तक पहुंचे।" + cta: + title: "आज ही सम्मेलन समय सीमाओं की ट्रैकिंग शुरू करें" + description: "सम्मेलन अवसरों पर अपडेट रहने के लिए पायथन समुदाय से जुड़ें। QR कोड स्कैन करें या आरंभ करने के लिए pythondeadlin.es पर जाएँ।" + visit_button: "वेबसाइट पर जाएँ" + github_button: "GitHub पर योगदान करें" + qr_alt: "pythondeadlin.es के लिए QR कोड" +languages: + native_speaker: 'भाषा के मूल वक्ता' + language_learner: 'भाषा सीखने वाला' + ai_translated: 'एआई द्वारा अनुवादित' + switch_to: 'पर स्विच करें' + translated_by: 'अनुवादक:' + legend: 'दिग्दर्शक' +formatter: + description: 'विभिन्न प्रारूपों में पायथन सम्मेलन की समय सीमा जमा करें' + basic: + title: 'मूल जानकारी' + name: 'सम्मेलन का नाम' + year: 'वर्ष' + type: 'सम्मेलन प्रकार' + attendees: 'अपेक्षित प्रतिभागी' + url: 'वेबसाइट URL' + location_date: + title: 'स्थान और दिनांक' + city: 'शहर' + city_help: 'केवल शहर का नाम दर्ज करें' + country: 'देश' + country_help: 'ध्वज के साथ मिलान वाले देशों को देखने के लिए टाइप करना शुरू करें' + venue: 'स्थल' + extra_places: "अतिरिक्त स्थान" + extra_help: "हाइब्रिड या ऑनलाइन इवेंट के लिए, यहां अतिरिक्त अल्पविराम से अलग किए गए स्थान जोड़ें।" + start_date: 'आरंभ तिथि' + end_date: 'समाप्ति तिथि' + timezone: 'समय क्षेत्र' + timezone_help: 'सम्मेलन का समय क्षेत्र चुनने के लिए टाइप करना शुरू करें' + cfp: + title: 'प्रस्ताव के लिए आह्वान' + status: 'CfP स्थिति' + tba: 'घोषित किया जाएगा' + none: 'कोई CfP नहीं' + date: 'तिथि का उपयोग करें' + deadline: 'जमा करने की अंतिम तिथि' + deadline_help: 'वार्ता प्रस्ताव जमा करने की अंतिम तिथि' + link: 'CfP लिंक' + additional_info: + title: 'अतिरिक्त जानकारी' + sponsor: 'प्रायोजन URL' + finaid: 'वित्तीय सहायता URL' + mastodon: 'मास्टोडन URL' + bsky: 'ब्लूस्काई URL' + notes: 'अतिरिक्त नोट्स' + notes_place: 'सम्मेलन के बारे में अतिरिक्त नोट्स' + submission_guidelines: 'सबमिशन दिशानिर्देश' + generate_output: 'उत्पन्न करें' + generated_outputs: 'उत्पन्न आउटपुट' + csv_format: 'CSV प्रारूप' + yaml_format: 'YAML प्रारूप' + calendar_format: 'कैलेंडर प्रारूप' + copy: 'क्लिपबोर्ड पर कॉपी करें' + required: 'कृपया सभी आवश्यक फ़ील्ड भरें जो * से चिह्नित हैं।' diff --git a/_i18n/hi/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/hi/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..bce896233ee --- /dev/null +++ b/_i18n/hi/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: पायथन सम्मेलनों में कैसे बात करें? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +पायथन सम्मेलन ज्ञान साझा करने, साथियों के साथ नेटवर्किंग करने और पायथन समुदाय में नवीनतम विकास से अपडेट रहने के लिए एक उत्कृष्ट मंच हैं। यदि आप पायथन के प्रति जुनूनी हैं और अपनी अंतर्दृष्टि को व्यापक दर्शकों के साथ साझा करना चाहते हैं, तो पायथन सम्मेलन में बोलना एक बेहतरीन अवसर हो सकता है। इस ब्लॉग पोस्ट में, हम पता करेंगे कि पायथन सम्मेलनों में कैसे बात करें। + +### आमंत्रित किया जाना + +पायथन सम्मेलनों में बोलने के लिए आमंत्रित किए जाने का एक तरीका समुदाय में एक स्थापित प्रतिष्ठा होना है। मान लीजिए कि आपने ओपन-सोर्स प्रोजेक्ट्स में योगदान दिया है, पायथन के बारे में लेख या ब्लॉग पोस्ट लिखे हैं, या छोटे मीटअप या इवेंट्स में बोले हैं। उस स्थिति में, आप सम्मेलन आयोजकों का ध्यान आकर्षित कर सकते हैं। + +इसके अतिरिक्त, यदि आप किसी विशिष्ट क्षेत्र, जैसे मशीन लर्निंग या वेब डेवलपमेंट के विशेषज्ञ हैं, तो आपको उन विषयों पर केंद्रित सम्मेलनों में बोलने के लिए आमंत्रित किया जा सकता है। आमंत्रित किए जाने की अपनी संभावनाओं को बढ़ाने के लिए, सम्मेलनों और मीटअप्स में भाग लें, ऑनलाइन चर्चाओं में भाग लें, और जितना संभव हो सके पायथन समुदाय में योगदान दें। + +### प्रस्ताव आह्वान (CfP) में प्रस्ताव जमा करें + +पायथन सम्मेलनों में बोलने का एक और तरीका प्रस्ताव आह्वान (CfP) में प्रस्ताव जमा करना है। अधिकांश सम्मेलन इवेंट से कई महीने पहले CfP खोलते हैं, और कोई भी प्रस्ताव जमा कर सकता है। +प्रस्ताव जमा करते समय, यह याद रखना आवश्यक है कि सम्मेलन आयोजक मौलिक और आकर्षक वार्ताओं की तलाश में होते हैं जो विविध दर्शकों को आकर्षित करें। सुनिश्चित करें कि आपका प्रस्ताव अच्छी तरह से लिखा गया है, स्पष्ट और संक्षिप्त है और एक ऐसे विषय को संबोधित करता है जो पायथन समुदाय के लिए प्रासंगिक और दिलचस्प है। + +यहां एक सफल प्रस्ताव जमा करने के लिए कुछ युक्तियां दी गई हैं: + +- एक ऐसा विषय चुनें जिसके बारे में आप जुनूनी हैं और जिसमें आपके पास विशेषज्ञता है। +- सुनिश्चित करें कि आपका प्रस्ताव सम्मेलन थीम या फोकस के लिए प्रासंगिक है। +- एक आकर्षक शीर्षक और सारांश लिखें जो सम्मेलन आयोजकों और प्रतिभागियों का ध्यान आकर्षित करेगा। +- अपनी वार्ता का विस्तार से वर्णन करें, जिसमें यह शामिल हो कि आप क्या कवर करेंगे और इसे कैसे प्रस्तुत करेंगे। +- कोई भी सहायक सामग्री शामिल करें, जैसे कोड के उदाहरण या स्लाइड्स, ताकि आयोजकों को आपके प्रस्तुतिकरण शैली और सामग्री का बेहतर अहसास हो। + +### अपने भाषण कौशल का निर्माण करें + +यदि आप सार्वजनिक भाषण में नए हैं, तो स्थानीय मीटअप या इवेंट्स में बोलकर छोटे से शुरुआत करना एक अच्छा विचार है। + +यह आपके आत्मविश्वास का निर्माण करने और आपके प्रस्तुतिकरण कौशल को परिष्कृत करने में मदद करेगा। जैसे-जैसे आप अधिक अनुभव प्राप्त करते हैं, आप बड़े इवेंट्स, जैसे क्षेत्रीय या राष्ट्रीय सम्मेलनों में बोलने का विस्तार कर सकते हैं। + +प्रत्येक वार्ता के बाद प्रतिभागियों और आयोजकों से प्रतिक्रिया मांगें, और उस प्रतिक्रिया का उपयोग अपने भाषण कौशल को सुधारने के लिए करें। + +### अन्य वक्ताओं और प्रतिभागियों के साथ नेटवर्क बनाएं + +अंत में, नेटवर्किंग पायथन सम्मेलनों में बोलने के लिए महत्वपूर्ण है। + +जितने संभव हो उतने सम्मेलनों और मीटअप्स में भाग लें, और अन्य वक्ताओं और प्रतिभागियों से जुड़ने का प्रयास करें। + +पायथन समुदाय के अन्य सदस्यों के साथ संबंध बनाकर, आप अपनी दृश्यता और विश्वसनीयता बढ़ाएंगे, जिससे भविष्य में अधिक भाषण के अवसर मिल सकते हैं। + +### निष्कर्ष + +निष्कर्षतः, पायथन सम्मेलनों में बोलने के लिए विशेषज्ञता, तैयारी और नेटवर्किंग का संयोजन आवश्यक है। + +इन युक्तियों का पालन करके, आप बोलने के लिए आमंत्रित किए जाने या CfP में सफलतापूर्वक प्रस्ताव जमा करने की अपनी संभावनाओं को बढ़ा सकते हैं और अंततः अपने ज्ञान को व्यापक पायथन समुदाय के साथ साझा कर सकते हैं। diff --git a/_i18n/hi/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/hi/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..f3018df3584 --- /dev/null +++ b/_i18n/hi/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: पायथन सम्मेलनों के लिए एक शानदार प्रस्तुति कैसे बनाएं? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +पायथन सम्मेलन डेवलपर्स को अपने कौशल दिखाने, ज्ञान साझा करने और साथी पेशेवरों के साथ नेटवर्क बनाने के लिए एक उत्कृष्ट मंच प्रदान करते हैं। + +पायथन सम्मेलन में बोलना मान्यता प्राप्त करने, विश्वसनीयता बनाने और पायथन समुदाय में महत्वपूर्ण योगदान देने का एक शानदार अवसर हो सकता है। हालांकि, एक सम्मेलन में प्रस्तुति देना भी डरावना हो सकता है, खासकर अगर आप पब्लिक स्पीकिंग में नए हैं या पहले कभी प्रस्तुति नहीं दी है। इस संसाधन में, हम पायथन सम्मेलनों में कैसे बोलें और अपनी प्रस्तुति को सफल बनाने के कुछ टिप्स साझा करेंगे। + +## ऐसा विषय चुनें जिसके लिए आप उत्साहित हैं + +एक सफल प्रस्तुति देने का पहला कदम ऐसा विषय चुनना है जिसके लिए आप उत्साहित हैं। अगर आप अपने विषय के बारे में उत्साहित हैं, तो आपका उत्साह आपकी प्रस्तुति में दिखेगा। आप अपने दर्शकों को आकर्षित करने की अधिक संभावना रखेंगे। ऐसा विषय चुनें जो पायथन समुदाय के लिए प्रासंगिक हो और सामान्य समस्याओं के लिए मूल्यवान अंतर्दृष्टि या समाधान प्रदान करता हो। + +## अपने दर्शकों को समझें + +अपनी प्रस्तुति तैयार करना शुरू करने से पहले, अपने दर्शकों के जनसांख्यिकी, विशेषज्ञता स्तर, और रुचियों को समझना आवश्यक है। यह आपको अपनी सामग्री और प्रस्तुति को उनकी अपेक्षाओं और आवश्यकताओं को पूरा करने के लिए अनुकूलित करने में मदद करेगा। उदाहरण के लिए, यदि आपके दर्शक शुरुआती पायथन डेवलपर्स हैं, तो आप तकनीकी शब्दजाल को सरल बना सकते हैं और मूल अवधारणाओं पर ध्यान केंद्रित कर सकते हैं। + +## एक आकर्षक कथा बनाएं + +एक आकर्षक कथा किसी भी सफल प्रस्तुति का एक महत्वपूर्ण पहलू है। अपनी प्रस्तुति को इस तरह से संरचित करना आवश्यक है जो एक कहानी बताता है और आपके दर्शकों को व्यस्त रखता है। अपने बिंदुओं को दर्शाने और अपनी प्रस्तुति में एक व्यक्तिगत स्पर्श जोड़ने के लिए किस्से, केस स्टडी, और वास्तविक जीवन के उदाहरणों का उपयोग करें। सबसे महत्वपूर्ण बिंदुओं को स्पष्ट और संक्षिप्त रूप से उजागर करना और प्रस्तुत करना सुनिश्चित करें। + +## अभ्यास, अभ्यास, अभ्यास + +एक परिष्कृत और आत्मविश्वास से भरी प्रस्तुति देने के लिए अभ्यास महत्वपूर्ण है। अपनी प्रस्तुति का कई बार अभ्यास करें जब तक आप अपनी सामग्री और प्रस्तुति के तरीके से सहज न हो जाएं। अपनी प्रस्तुति का समय निर्धारित करें ताकि यह सुनिश्चित हो सके कि यह आवंटित समय सीमा के भीतर फिट होती है। अपने अभ्यास सत्रों को रिकॉर्ड करने और समीक्षा करने पर विचार करें ताकि सुधार के क्षेत्रों की पहचान की जा सके। + +## अपने संदेश का समर्थन करने के लिए दृश्य का उपयोग करें + +स्लाइड्स और आरेख जैसे दृश्य सहायता आपके संदेश का समर्थन करने और आपके दर्शकों को व्यस्त रखने में मदद कर सकते हैं। हालांकि, अपनी प्रस्तुति को बहुत अधिक दृश्यों से ओवरलोड न करें, जो आपके संदेश से ध्यान भटका सकते हैं। जटिल अवधारणाओं और डेटा को दर्शाने के लिए ग्राफिक्स और छवियों का उपयोग करें, और अपनी स्लाइड्स को सरल और दृश्य रूप से आकर्षक रखें। + +## अपने दर्शकों के साथ जुड़ें + +अपने दर्शकों के साथ जुड़ना एक सफल प्रस्तुति का एक महत्वपूर्ण पहलू है। अपने दर्शकों को प्रश्न पूछकर, मतदान आयोजित करके, या इंटरैक्टिव टूल का उपयोग करके भाग लेने के लिए प्रोत्साहित करें। यह आपके दर्शकों को व्यस्त रखने में मदद करेगा और उन्हें चर्चा में योगदान देने की अनुमति देगा। प्रश्नों के उत्तर देने और किसी भी चिंता या प्रतिक्रिया को संबोधित करने के लिए तैयार रहें जो उत्पन्न हो सकती है। + +## निष्कर्ष + +पायथन सम्मेलन में बोलना अपने ज्ञान को साझा करने और समुदाय में मूल्यवान योगदान देने का एक बढ़िया तरीका हो सकता है। इन युक्तियों का पालन करके, आप एक आकर्षक प्रस्तुति तैयार कर सकते हैं जो आपके दर्शकों के साथ जुड़ती है और प्रतिध्वनित होती है। याद रखें कि ऐसा विषय चुनें जिसके लिए आप उत्साहित हैं, अपने दर्शकों को समझें, एक आकर्षक कथा बनाएं, अपनी प्रस्तुति का अभ्यास करें, अपने संदेश का समर्थन करने के लिए दृश्यों का उपयोग करें, और अपने दर्शकों के साथ जुड़ें। शुभकामनाएं, और खुशी से प्रस्तुति दें! diff --git a/_i18n/hi/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/hi/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..656bb2792b8 --- /dev/null +++ b/_i18n/hi/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,38 @@ +--- +title: पायथन सम्मेलन CfP क्या है? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'conference'] +--- + +कॉल फॉर प्रपोजल्स (CfP) या कॉल फॉर पार्टिसिपेशन एक सामान्य शब्द है जो शैक्षणिक, अनुसंधान और पेशेवर समुदायों में व्यक्तियों या समूहों को सम्मेलनों, कार्यशालाओं, संगोष्ठियों और अन्य कार्यक्रमों के लिए प्रस्ताव या सारांश प्रस्तुत करने के लिए आमंत्रित करने के लिए उपयोग किया जाता है। + +चूंकि पायथन समुदाय प्यारे नर्ड्स का एक समूह है, यही शब्दावली पायथन की बोलचाल में भी शामिल हो गई है। + +## CfP क्या है? + +सरल शब्दों में, CfP विशेषज्ञों, विद्वानों, शोधकर्ताओं और प्रैक्टिशनर्स को किसी विशेष क्षेत्र या रुचि के क्षेत्र में अपने विचार, शोध निष्कर्ष और केस स्टडी प्रस्तुत करने के लिए एक खुला निमंत्रण है। + +CfP आमतौर पर कार्यक्रम आयोजकों, सम्मेलन समितियों या शैक्षिक संस्थानों द्वारा इच्छुक व्यक्तियों या समूहों से प्रस्तुतियां आमंत्रित करने के लिए जारी किया जाता है। + +## CfP किसलिए होते हैं? + +CfP का उद्देश्य प्रतिभागियों के एक विस्तृत दायरे को किसी कार्यक्रम या सम्मेलन में भाग लेने के लिए प्रोत्साहित करना है, जिससे दृष्टिकोणों और विचारों की विविधता सुनिश्चित होती है। + +CfP अक्सर कार्यक्रम का विषय, रुचि के विषयों और प्रस्तुति दिशानिर्देशों की रूपरेखा प्रस्तुत करते हैं। वे स्वीकार किए जाने वाले प्रस्तुतियों के प्रकारों को भी निर्दिष्ट करते हैं, जैसे शोध पत्र, केस स्टडी, पोस्टर या कार्यशालाएं। + +## आप CfP में कैसे भाग लेते हैं? + +CfP के लिए प्रस्तुति प्रक्रिया में आमतौर पर एक प्रस्ताव या सारांश तैयार करना शामिल होता है जिसमें प्रस्तावित विषय का सारांश, शोध पद्धति या दृष्टिकोण और अपेक्षित परिणाम शामिल होते हैं। + +कुछ शैक्षिक CfP पूर्ण पेपर प्रस्तुति की आवश्यकता हो सकती है, जबकि अन्य एक संक्षिप्त सारांश या सारांश मांग सकते हैं। + +पायथन CfP शायद ही कभी पूर्ण सामग्री की प्रस्तुति की आवश्यकता होती है, क्योंकि वे पेपर प्रकाशित नहीं करते हैं। हालांकि, केवल भविष्य के काम का वादा करने की आम गलती से बचना महत्वपूर्ण है। + +## निष्कर्ष + +संक्षेप में, एक CfP विशेषज्ञों, विद्वानों, शोधकर्ताओं और प्रैक्टिशनर्स को किसी कार्यक्रम या सम्मेलन के लिए प्रस्ताव या सारांश प्रस्तुत करने के लिए आमंत्रित करता है। + +यह ज्ञान और विशेषज्ञता के आदान-प्रदान को सुविधाजनक बनाने, चर्चाओं को बढ़ावा देने और किसी विशेष क्षेत्र में पेशेवरों के बीच नेटवर्किंग के अवसर बनाने में महत्वपूर्ण भूमिका निभाता है। + +अगर आप किसी सम्मेलन या कार्यक्रम में भाग लेने या प्रस्तुति देने में रुचि रखते हैं, तो CfP के लिए नज़र रखें! diff --git a/_i18n/hi/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/hi/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..63b0d0b6633 --- /dev/null +++ b/_i18n/hi/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: पायथन कॉन्फ्रेंस टॉक प्रस्ताव कैसे लिखें +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +एक अच्छा सम्मेलन प्रस्ताव लिखना चुनौतीपूर्ण हो सकता है। फिर भी, कुछ प्रमुख तत्व हैं जो आपके प्रस्ताव को उभरने में मदद कर सकते हैं। यहां एक सफल सम्मेलन प्रस्ताव के पांच आवश्यक घटक हैं। + +## विषय और यह क्यों रोचक है + +एक अच्छे सम्मेलन प्रस्ताव का पहला घटक उस विषय का स्पष्ट और आकर्षक विवरण है जिस पर आप चर्चा करने की योजना बना रहे हैं। यह बताना आवश्यक है कि आपका विषय सम्मेलन के दर्शकों के लिए क्यों प्रासंगिक और रोमांचक है। अपने विषय के किसी भी अद्वितीय या नवीन पहलू और किसी भी चुनौती या अवसर को उजागर करना सुनिश्चित करें। + +## वह दर्शक जो इस वार्ता/ट्यूटोरियल में भाग लेने से लाभान्वित होंगे + +अपने लक्षित दर्शकों की पहचान करना एक सफल सम्मेलन प्रस्ताव बनाने में महत्वपूर्ण है। + +इस बारे में विशिष्ट रहें कि आपकी वार्ता या ट्यूटोरियल से कौन लाभान्वित होगा और वे क्या सीखेंगे। + +अपने दर्शकों को समझने से आपको अपनी सामग्री को अनुकूलित करने और यह सुनिश्चित करने में मदद मिलेगी कि आप मूल्यवान अंतर्दृष्टि और निष्कर्ष प्रदान कर रहे हैं। + +## दर्शकों के लिए क्या लाभ है + +प्रतिभागी आपकी वार्ता या ट्यूटोरियल से क्या प्राप्त करने की उम्मीद कर सकते हैं? उन प्रमुख निष्कर्षों के बारे में स्पष्ट रहें जिन्हें आप प्रदान करने की आशा करते हैं। + +यह प्रतिभागियों को यह मूल्यांकन करने में मदद करेगा कि क्या आपकी प्रस्तुति उनके हितों और जरूरतों के अनुरूप है। + +यह आपको अपनी वार्ता को संरचित करने और वादा किए गए मूल्य को प्रदान करने के लिए ट्रैक पर रहने में भी मदद करेगा। + +## वार्ता/ट्यूटोरियल को समझने के लिए आवश्यक कोई पूर्व ज्ञान + +अपना प्रस्ताव तैयार करते समय, यह विचार करना महत्वपूर्ण है कि आपके दर्शकों को आपकी सामग्री को समझने और उसमें संलग्न होने के लिए किस पृष्ठभूमि ज्ञान की आवश्यकता होगी। + +किसी भी पूर्वापेक्षा के बारे में स्पष्ट रहें, और ऐसे लिंक या संसाधन प्रदान करें जिन्हें प्रतिभागी भाग लेने से पहले अपने ज्ञान को ताज़ा करने के लिए उपयोग कर सकते हैं। + +## सामग्री को कैसे कवर किया जाएगा, इसका अनुमानित समय विभाजन + +आप अपनी सामग्री को कैसे कवर करने की योजना बनाते हैं, इसका विस्तृत विवरण प्रतिभागियों को यह समझने में मदद करने के लिए महत्वपूर्ण है कि वे आपकी वार्ता या ट्यूटोरियल से क्या उम्मीद कर सकते हैं। + +अपनी प्रस्तुति के लिए एक स्पष्ट संरचना और समयरेखा की रूपरेखा तैयार करके, आप प्रतिभागियों को आपकी सामग्री में संलग्न और केंद्रित रहने में मदद करेंगे। यह आपको ट्रैक पर रहने और उन सभी प्रमुख बिंदुओं को कवर करने में भी मदद करेगा जिन्हें आप बनाना चाहते हैं। + +## निष्कर्ष + +निष्कर्ष में, एक अच्छा सम्मेलन प्रस्ताव विषय का स्पष्ट और आकर्षक विवरण प्रदान करना चाहिए, लक्षित दर्शकों और उनकी जरूरतों की पहचान करना चाहिए, निष्कर्षों और किसी भी आवश्यक पूर्व ज्ञान को स्पष्ट रूप से संप्रेषित करना चाहिए, और सामग्री का विस्तृत विवरण प्रदान करना चाहिए। इन आवश्यक घटकों को शामिल करने से आपके प्रस्ताव के स्वीकार होने और सम्मेलन में सफल प्रस्तुति देने की संभावना बढ़ जाएगी। + +_यह सूची [Pydata Global सम्मेलन](https://pydata.org/global2022/present/) द्वारा किए गए उत्कृष्ट बिंदुओं का विस्तार करती है।_ diff --git a/_i18n/hi/_posts/2023-03-07-find-target-audience.md b/_i18n/hi/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..ecbf4dd1883 --- /dev/null +++ b/_i18n/hi/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: पायथन सम्मेलन वार्ता के लिए अपने लक्षित दर्शकों को कैसे परिभाषित करें? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +जब सम्मेलन प्रस्तुति के लिए एक प्रस्ताव जमा करने की बात आती है, तो अपने लक्षित दर्शकों को परिभाषित करना आवश्यक है। जानना कि आप किससे बात कर रहे हैं, आपको अपनी प्रस्तुति को दर्शकों की जरूरतों, रुचियों और पृष्ठभूमि ज्ञान के अनुसार तैयार करने में मदद कर सकता है। इस पोस्ट में, हम सम्मेलन प्रस्ताव के लिए अपने लक्षित दर्शकों को परिभाषित करने के तरीके और इसके महत्व के बारे में चर्चा करेंगे। + +## उनकी नौकरी भूमिका पर विचार करें + +सबसे पहले, आपको अपने लक्षित दर्शकों की नौकरी भूमिका पर विचार करने की आवश्यकता है। क्या वे डेटा वैज्ञानिक, मशीन लर्निंग या सॉफ्टवेयर इंजीनियर, शोधकर्ता, या कुछ और हैं? + +उनकी नौकरी भूमिका को जानने से आपको यह निर्धारित करने में मदद मिल सकती है कि कौन से विषय और तकनीकें उनके लिए सबसे अधिक प्रासंगिक हैं। + +उदाहरण के लिए, यदि आप एक नई डेटा विज़ुअलाइज़ेशन तकनीक प्रस्तुत कर रहे हैं, तो डेटा वैज्ञानिक और शोधकर्ता इसके काम करने के तरीके में अधिक रुचि रख सकते हैं। + +जबकि, इंजीनियर अधिक रुचि रख सकते हैं कि इसे उनके मौजूदा सिस्टम में कैसे लागू किया जा सकता है। + +## अनुभव के बारे में सोचें + +इसके बाद, अपने लक्षित दर्शकों के अनुभव स्तर पर विचार करें। क्या वे विषय में शुरुआती, मध्यवर्ती, या उन्नत हैं? + +यह आपके विचारों को प्रस्तुत करने के तरीके और आपके द्वारा प्रदान की जाने वाली पृष्ठभूमि जानकारी की मात्रा को प्रभावित करेगा। + +उदाहरण के लिए, यदि आपकी प्रस्तुति एक जटिल एल्गोरिदम पर है, तो एक उन्नत दर्शक तकनीकी विवरण और कोड उदाहरणों में रुचि रख सकता है, जबकि शुरुआती लोगों को प्रस्तुति का अनुसरण करने के लिए अवधारणाओं के सरलीकृत स्पष्टीकरण की आवश्यकता हो सकती है। + +## एक द्वितीयक निश से विचार करें + +मुझ पर विश्वास करें, मुझे मशीन लर्निंग के बारे में बात करना पसंद है। लेकिन जब लोग मुझे नहीं जानते, तो वे उस वार्ता में रुचि रखने की संभावना नहीं रखते। + +हालांकि, आप "चिकित्सा में मशीन लर्निंग" या "मौसम और जलवायु पूर्वानुमान में न्यूरल नेटवर्क लागू करना" के बारे में बात कर सकते हैं, जिससे वार्ता कुछ ऐसे लोगों के लिए अनिवार्य हो जाती है जो अन्यथा प्रस्ताव को याद कर सकते थे। + +यह अपने लक्षित दर्शकों को बिल्कुल यह बताने का एक तरीका है कि एक प्रस्तुति उनके लिए है। + +## हम अपने लक्षित दर्शकों को क्यों परिभाषित करते हैं? + +अपने लक्षित दर्शकों को परिभाषित करना दो मुख्य कारणों से महत्वपूर्ण है। + +पहला, यह आपको अपनी प्रस्तुति को अपने दर्शकों के लिए सबसे अधिक प्रासंगिक और दिलचस्प विषयों पर केंद्रित करने में मदद करता है। यह आपकी प्रस्तुति को प्रतिभागियों के लिए अधिक आकर्षक और मूल्यवान बना सकता है। + +दूसरा, यह संभावित प्रतिभागियों को यह तय करने में मदद करता है कि क्या आपकी प्रस्तुति उनकी जरूरतों और रुचियों से मेल खाती है। + +अगर वे आसानी से देख सकते हैं कि आपकी प्रस्तुति उनकी नौकरी भूमिका और अनुभव स्तर को लक्षित करती है, तो वे भाग लेने और आपकी वार्ता में मूल्य पाने की अधिक संभावना रखते हैं। + +## सम्मेलन पर ही विचार करें + +अपने सम्मेलन प्रस्ताव को लिखते समय, अपने लक्षित दर्शकों के बारे में जानकारी शामिल करना सुनिश्चित करें। + +यह "यह प्रस्तुति मध्यवर्ती अनुभव स्तर के डेटा वैज्ञानिकों के लिए लक्षित है" जैसे कथन को शामिल करने जितना सरल हो सकता है। यह जानकारी प्रदान करने से समीक्षकों और प्रतिभागियों को यह समझने में मदद मिल सकती है कि आपकी वार्ता किसके लिए है और क्या यह सम्मेलन के उद्देश्यों के अनुरूप है। + +## निष्कर्ष + +अपने लक्षित दर्शकों को परिभाषित करना सम्मेलन प्रस्तुति तैयार करने का एक आवश्यक कदम है। अपने दर्शकों की नौकरी भूमिका और अनुभव स्तर पर विचार करके, आप अपनी प्रस्तुति को उनकी जरूरतों और रुचियों के अनुसार तैयार कर सकते हैं, जिससे यह प्रतिभागियों के लिए अधिक आकर्षक और उपयोगी हो सकती है। अपने लक्षित दर्शकों के बारे में जानकारी अपने सम्मेलन प्रस्ताव में शामिल करना सुनिश्चित करें ताकि समीक्षकों और प्रतिभागियों को यह समझने में मदद मिले कि आपकी वार्ता किसके लिए है और क्या यह उनके लिए उपयुक्त है। diff --git a/_i18n/hi/_posts/2023-03-08-common-pitfalls.md b/_i18n/hi/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..a1874f76d2d --- /dev/null +++ b/_i18n/hi/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 9 सामान्य गलतियाँ जो आपके पायथन कॉन्फ्रेंस टॉक प्रस्ताव को अस्वीकार करवा देती हैं +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +अगर आप कॉन्फ्रेंस टॉक के लिए प्रस्ताव जमा करने की सोच रहे हैं, तो स्वीकृति के अपने अवसरों को बढ़ाने के लिए क्या टालना है, यह जानना आवश्यक है। यहां नौ सामान्य गलतियां हैं जिन्हें देखना चाहिए: + +## बिक्री प्रस्तुतियां + +याद रखें कि कॉन्फ्रेंस ओपन-सोर्स वैज्ञानिक कंप्यूटिंग टूल्स के निर्माताओं और उपयोगकर्ताओं का एक समुदाय है। जबकि आप अपने क्लोज्ड-सोर्स प्रोडक्ट या प्लेटफॉर्म का संदर्भ दे सकते हैं, दर्शकों को टॉक अधिक दिलचस्प लगेगा अगर वे आपकी तकनीकों को ओपन-सोर्स PyData स्टैक के साथ आजमा सकें। हार्ड सेल करने से बचें, और इसके बजाय समस्या परिभाषा, प्रस्तावित रणनीतियों और व्यापार डोमेन पर ध्यान केंद्रित करें। + +## दोहराए गए भाषण + +कॉन्फ्रेंस नए भाषणों और नए स्पीकरों को प्राथमिकता देती हैं। अगर आपका भाषण पहले से ही ऑनलाइन उपलब्ध है, तो इसके कॉन्फ्रेंस के लिए स्वीकार होने की संभावना कम है। ऐसे विषय पर नई अंतर्दृष्टि, तकनीकें या दृष्टिकोण लाने का प्रयास करें जिसे पहले कवर नहीं किया गया है। + +## स्पष्टता की कमी + +आपका प्रस्ताव स्पष्ट रूप से बताना चाहिए कि आपका भाषण किस बारे में है और प्रतिभागी क्या सीखने की उम्मीद कर सकते हैं। अगर आपका प्रस्ताव अस्पष्ट, बिखरा हुआ, या समझने में कठिन है, तो समीक्षक यह निर्धारित नहीं कर पाएंगे कि क्या आपका भाषण कॉन्फ्रेंस के उद्देश्यों के अनुरूप है या इच्छित दर्शकों के लिए उपयुक्त है। + +## मौलिकता की कमी + +समीक्षक अद्वितीय, अंतर्दृष्टिपूर्ण और नवीन भाषणों की तलाश करते हैं जो सामान्य समस्याओं के लिए ताजा दृष्टिकोण या नए समाधान प्रदान करते हैं। यदि आपका प्रस्ताव ऐसे विषय को कवर करता है जिसे पहले से ही कई बार कवर किया जा चुका है या कोई नई अंतर्दृष्टि या तकनीक प्रदान नहीं करता है, तो समीक्षक इसे अस्वीकार कर सकते हैं। इसका मतलब यह नहीं है कि एक केस स्टडी या किसी समस्या पर नया दृष्टिकोण स्वीकार नहीं किया जाएगा, लेकिन इस अतिरिक्त दृष्टिकोण पर विचार करना लाभदायक है। + +## अत्यधिक लंबे प्रस्ताव + +अपने प्रस्ताव को सरल और स्पष्ट रखें। अच्छे प्रस्ताव आमतौर पर 250 शब्दों के भीतर सभी महत्वपूर्ण जानकारी प्रदान करते हैं। यह एक सख्त सीमा नहीं है और कॉन्फ्रेंस के अनुसार भिन्न होती है। यह एक सुझाव है जो आपको केंद्रित रहने और समीक्षकों का ध्यान खोने से बचने में मदद करता है। + +## प्रासंगिकता की कमी + +सुनिश्चित करें कि आपका भाषण कॉन्फ्रेंस के थीम या फोकस के अनुरूप है। यदि आपका प्रस्ताव केवल स्पर्शरेखीय रूप से कॉन्फ्रेंस के उद्देश्यों से संबंधित है, तो समीक्षक यह नहीं देख सकते हैं कि यह बड़ी तस्वीर में कैसे फिट बैठता है या यह प्रतिभागियों को कैसे लाभ पहुंचाएगा। + +## भविष्य का काम + +हालांकि भविष्य के काम पर चर्चा करना रोमांचक है और आपके भाषण में इसका उल्लेख किया जा सकता है, लेकिन भाषण की मुख्य सामग्री पहले से ही आकार ले चुकी होनी चाहिए, और आप इसे अपने प्रस्ताव में वर्णित करने में सक्षम होने चाहिए। भविष्य के डेटा संग्रह या भविष्य के प्रोटोटाइपिंग पर बहुत अधिक निर्भर न करें क्योंकि चीजें अक्सर अपेक्षा के अनुसार नहीं होतीं। सुनिश्चित करें कि आप ठोस उदाहरण और उपयोग के मामले प्रदान करें। + +## अनुचित या आपत्तिजनक सामग्री + +अपनी भाषा और टोन को पेशेवर और सम्मानजनक रखें, और विवादास्पद या संवेदनशील विषयों से बचें जो प्रतिभागियों को नाराज या अलग-थलग कर सकते हैं। अनुचित, आपत्तिजनक या भेदभावपूर्ण सामग्री वाले प्रस्तावों को अस्वीकार कर दिया जाएगा। + +## कॉन्फ्रेंस फॉर्मेट के साथ खराब फिट + +कॉन्फ्रेंस के विभिन्न फॉर्मेट होते हैं, लाइटनिंग टॉक से लेकर वर्कशॉप और कीनोट स्पीच तक। सुनिश्चित करें कि आपका प्रस्ताव कॉन्फ्रेंस के फॉर्मेट और अवधि के अनुरूप है और उस फॉर्मेट में प्रभावी ढंग से प्रस्तुत किया जा सकता है। अपने भाषण के लिए आवश्यक किसी भी उपकरण, सामग्री या संसाधनों पर विचार करें। + +इन सामान्य गलतियों से बचकर, आप एक सफल कॉन्फ्रेंस टॉक प्रस्ताव जमा करने की अपनी संभावनाओं को बढ़ा सकते हैं जो कॉन्फ्रेंस के उद्देश्यों के अनुरूप हो, प्रतिभागियों के लिए प्रासंगिक हो, और ताजा अंतर्दृष्टि या तकनीकें प्रदान करे। diff --git a/_i18n/hi/_posts/2023-03-09-what-about.md b/_i18n/hi/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..86f1bff5112 --- /dev/null +++ b/_i18n/hi/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: मेरी पायथन कॉन्फ्रेंस टॉक किस विषय पर होनी चाहिए? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +जब हम आखिरकार पायथन कॉन्फ्रेंस में एक प्रस्तुति देने का फैसला करते हैं, तो हम अक्सर एक विरोधाभासी पहेली का सामना करते हैं। हमने इतनी सारी रोमांचक चीजों के बारे में सीखा है। इतना कुछ दिलचस्प है। लेकिन मेरी पायथन टॉक किस बारे में होनी चाहिए?! + +तो, पायथन पर प्रस्तुति देने का निर्णय लेने के लिए बधाई! आप अपने ज्ञान और अनुभव को दूसरों के साथ साझा करने के लिए उत्सुक हैं। आइए शुरू करें! + +सबसे पहले, अपने दर्शकों के बारे में सोचें। आप किसे अपनी प्रस्तुति में आने के लिए चाहते हैं? क्या वे शुरुआती, मध्यम या उन्नत पायथन उपयोगकर्ता हैं? क्या उनकी कोई विशिष्ट रुचि या समस्या है जिसे वे पायथन का उपयोग करके हल करना चाहते हैं? अपने दर्शकों की विशेषज्ञता और रुचि को समझने से आपको ऐसे विषय का चयन करने में मदद मिलेगी जो उन्हें आकर्षित करेगा और उन्हें व्यस्त रखेगा। + +अगला, आप जिस प्रकार की प्रस्तुति देना चाहते हैं, उस पर विचार करें। क्या आप एक जटिल विषय में गहराई से जाना चाहते हैं या एक हैंड्स-ऑन ट्यूटोरियल के साथ इसे सरल रखना चाहते हैं? क्या आप पायथन की गणितीय क्षमताओं या व्यावहारिक अनुप्रयोगों पर ध्यान केंद्रित करना चाहते हैं? ऐसा विषय चुनना महत्वपूर्ण है जो आपकी विशेषज्ञता और जुनून के साथ मेल खाता हो और आपके दर्शकों को ध्यान में रखता हो। + +एक बार जब आप अपने विषय और प्रस्तुति के प्रकार पर निर्णय ले लेते हैं, तो आप जो स्वर स्थापित करना चाहते हैं, उसके बारे में सोचें। क्या आप हल्के-फुल्के और मजेदार होना चाहते हैं या अधिक गंभीर और सावधान? यहां कोई सही या गलत जवाब नहीं है, लेकिन सुनिश्चित करें कि आपका स्वर आपके विषय और दर्शकों के लिए उपयुक्त है। + +याद रखें, आपकी प्रस्तुति का उद्देश्य पायथन के बारे में दूसरों को शिक्षित और प्रेरित करना है, इसलिए सुनिश्चित करें कि आपके मुख्य बिंदु स्पष्ट और मूल्यवान हैं। आपके दर्शकों को आपकी प्रस्तुति से क्या सीखना या ले जाना चाहिए? वे जो सीखा है उसे अपने पायथन प्रोजेक्ट्स या करियर में कैसे लागू कर सकते हैं? + +संक्षेप में, अपनी पायथन प्रस्तुति के विषय का निर्णय लेते समय, अपने दर्शकों, प्रस्तुति के प्रकार और आप जो स्वर स्थापित करना चाहते हैं, पर विचार करें। सुनिश्चित करें कि आपके मुख्य बिंदु आपके दर्शकों के लिए स्पष्ट और मूल्यवान हैं। और सबसे महत्वपूर्ण, मज़े करें और दूसरों के साथ पायथन के लिए अपना जुनून साझा करें! diff --git a/_i18n/hi/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/hi/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..12e0274e270 --- /dev/null +++ b/_i18n/hi/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,51 @@ +--- +title: सम्मेलन समय सीमाओं के लिए अतिरिक्त संसाधनों का अन्वेषण +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +Pythondeadlin.es पिछले एक वर्ष से एक सुविधाजनक स्थान पर सम्मेलन समय सीमाओं को खोजने के लिए Python समुदाय के लिए एक लोकप्रिय गंतव्य रहा है। + +हालांकि, अन्य मूल्यवान संसाधनों के बारे में जागरूक होना महत्वपूर्ण है जो आपके सम्मेलन योजना अनुभव को बढ़ा सकते हैं और Python समुदाय के भीतर सहयोग को बढ़ावा दे सकते हैं। + +इस ब्लॉग पोस्ट में, हम ऐसे दो संसाधनों का पता लगाएंगे जो सम्मेलन जानकारी के एकत्रीकरण और Python समुदाय को एकजुट करने में महत्वपूर्ण भूमिका निभाते हैं। आइए शुरू करें! + +## Python-Organizers GitHub: जानकारी का खजाना + +[Python-Organizers GitHub रिपॉजिटरी](https://github.com/python-organizers/conferences) सम्मेलन आयोजकों, प्रतिभागियों और वक्ताओं के लिए एक मूल्यवान संसाधन है। + +यह सम्मेलन डेटा का एक केंद्रीकृत हब के रूप में कार्य करता है, जो सम्मेलनों, प्रस्तुति समय सीमाओं, कार्यक्रम की तारीखों, प्रायोजक जानकारी और स्थान विवरण का एक व्यवस्थित संग्रह प्रदान करता है। यह सहयोगी मंच कार्यक्रम आयोजकों को अपनी सम्मेलन जानकारी साझा करने और डेटा की सटीकता और व्यापकता में योगदान देने के लिए प्रोत्साहित करता है। + +Python-Organizers GitHub का उपयोग करके, आप ज्ञान की भरपूर मात्रा तक पहुंच सकते हैं और अन्य आयोजकों के साथ सहयोग कर सकते हैं। + +चाहे आप Python सम्मेलन में भाग लेने या प्रस्तुत करने की योजना बना रहे हों, यह संसाधन आपको सूचित निर्णय लेने और नवीनतम सम्मेलन समय सीमाओं के बारे में अपडेट रहने में मदद करता है। + +GitHub रिपॉजिटरी बातचीत को आसान बनाती है और समुदाय की भागीदारी को बढ़ावा देती है, व्यक्तियों को दुनिया भर में Python सम्मेलनों के प्रचार, विकास और सफलता में सक्रिय रूप से भाग लेने के लिए प्रोत्साहित करती है। + +## आधिकारिक Python इवेंट सूची: समुदाय को एकजुट करना + +Python मेलिंग लिस्ट के माध्यम से प्रबंधित [आधिकारिक Python इवेंट सूची](https://www.python.org/events/) Python समुदाय के लिए एक एकीकृत मंच के रूप में कार्य करती है। + +यह व्यापक संसाधन आगामी Python कार्यक्रमों का एक अवलोकन प्रदान करता है, जिसमें सम्मेलन, मीटअप, कार्यशालाएं और बहुत कुछ शामिल हैं। जबकि यह समय सीमाओं पर जानकारी प्रदान करता है, यह समुदाय के भीतर सहयोग, नेटवर्किंग और विचारों के आदान-प्रदान को बढ़ावा देने के लिए इससे आगे जाता है। + +आप मेलिंग लिस्ट की सदस्यता ले सकते हैं, लेकिन वेबपेज आपको एक मानचित्र और एक Google कैलेंडर प्रदान करता है जिसकी आप अपडेट प्राप्त करने के लिए आसानी से सदस्यता ले सकते हैं। यह आपको अपने सम्मेलन कार्यक्रम को अधिक प्रभावी ढंग से देखने और योजना बनाने की अनुमति देता है। + +यह समावेशी मंच विविध पृष्ठभूमि के Python उत्साही लोगों को एक साथ लाता है और उन्हें जुड़ने, सीखने और जीवंत Python पारिस्थितिकी तंत्र में योगदान देने के लिए प्रोत्साहित करता है। + +## बेहतर सम्मेलन योजना के लिए सहयोग को अपनाना + +जबकि Pythondeadlin.es एक मूल्यवान संसाधन बना हुआ है, सम्मेलन जानकारी एकत्रीकरण के व्यापक परिदृश्य का पता लगाना महत्वपूर्ण है। + +Python-Organizers GitHub रिपॉजिटरी और आधिकारिक Python इवेंट सूची Python समुदाय को एकजुट करने और सहयोग को बढ़ावा देने में महत्वपूर्ण भूमिका निभाते हैं। + +इन संसाधनों का उपयोग करके, आप आगामी Python कार्यक्रमों के बारे में अपडेट रह सकते हैं, समान विचारधारा वाले व्यक्तियों के साथ जुड़ सकते हैं, और Python सम्मेलनों के विकास और सफलता में सक्रिय रूप से योगदान दे सकते हैं। सहयोग को अपनाने से हमें मजबूत, अधिक जीवंत सम्मेलन बनाने में मदद मिलती है जो Python समुदाय की विविध जरूरतों और रुचियों को पूरा करते हैं। + +अधिक जानकारी के लिए निम्नलिखित संसाधनों की जांच करना सुनिश्चित करें: + +- [Python-Organizers GitHub](https://github.com/python-organizers/conferences) +- [आधिकारिक Python इवेंट सूची](https://www.python.org/events/) + +इन प्लेटफार्मों का उपयोग करके, हम आगामी Python कार्यक्रमों के बारे में जानकारी रख सकते हैं, समान विचारधारा वाले व्यक्तियों के साथ जुड़ सकते हैं, और हमारे सम्मेलनों की सफलता में सक्रिय रूप से योगदान दे सकते हैं। आइए हम सहयोग करें, अपना ज्ञान साझा करें, और एक मजबूत Python समुदाय का निर्माण करें। + +साथ मिलकर, हम Python कार्यक्रमों के भविष्य को आकार दे सकते हैं और एक ऐसा वातावरण तैयार कर सकते हैं जहां हर कोई सीख सकता है, विकास कर सकता है और समृद्ध हो सकता है। diff --git a/_i18n/hi/calendar/description.md b/_i18n/hi/calendar/description.md new file mode 100644 index 00000000000..94ea2d5421d --- /dev/null +++ b/_i18n/hi/calendar/description.md @@ -0,0 +1,6 @@ +कैलेंडर में डेडलाइन और पायथन कॉन्फ्रेंस की तारीखों का PythonDeadlin.es अवलोकन। + +आप वैकल्पिक रूप से **सभी डेडलाइन** को Google Calendar या +iCal में निर्यात कर सकते हैं। यह कैलेंडर वास्तविक डेडलाइन पर नज़र रखने के लिए बहुत बढ़िया है! + +वैकल्पिक रूप से, अपने Google Calendar या iCal पर **आगामी Python इवेंट** की सदस्यता लें। यह एक क्लासिक "इवेंट कैलेंडर" है। diff --git a/_i18n/hi/dates/pretty_dates.html b/_i18n/hi/dates/pretty_dates.html new file mode 100644 index 00000000000..33f0b0f5794 --- /dev/null +++ b/_i18n/hi/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil %} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture %} +{% elsif include.start == nil %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.until" %} {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} +{% elsif include.end == nil %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign start_day = start_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.from" %} {{ start_day }} {{ start_month }} {{ start_year }}{% endcapture %} +{% else %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + + {% if start_date == end_date %} + {% assign day = start_date | date: "%-d" %} + {% assign year = start_date | date: "%Y" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture pretty_date %}{{ day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {% t "times.from" %} {{ end_day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} {% t "times.from" %} {{ end_day }} {{ end_month }} {{ year }}{% endcapture %} + + {% else %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} {{ start_year }} {% t "times.from" %} {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} + {% endif %} +{% endif %}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/hi/footer/jesper.md b/_i18n/hi/footer/jesper.md new file mode 100644 index 00000000000..52fd8327d35 --- /dev/null +++ b/_i18n/hi/footer/jesper.md @@ -0,0 +1 @@ +जेस्पर ड्राम्सच ML.recipes, data-science-gui.de, लेट टू द पार्टी 🎉 और लेटेंट स्पेस कम्युनिटी के निर्माता हैं। diff --git a/_i18n/hi/footer/maintainer.md b/_i18n/hi/footer/maintainer.md new file mode 100644 index 00000000000..ef2bb819cf6 --- /dev/null +++ b/_i18n/hi/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

जेस्पर ड्रामश द्वारा निर्मित • ओपन सोर्स • समुदाय संचालित

+

aideadlin.es से प्रेरित • 2022 से {{confs | size}} पायथन सम्मेलनों का संग्रह

diff --git a/_i18n/hi/footer/terms.md b/_i18n/hi/footer/terms.md new file mode 100644 index 00000000000..8defd9735b5 --- /dev/null +++ b/_i18n/hi/footer/terms.md @@ -0,0 +1,3 @@ +

सही होने की कोई गारंटी नहीं है, कृपया पुल अनुरोध सबमिट करके गलतियाँ सुधारें।

+ +शर्तेंगोपनीयता नीति diff --git a/_i18n/hi/formatter/countries.html b/_i18n/hi/formatter/countries.html new file mode 100644 index 00000000000..ce4b9ebed17 --- /dev/null +++ b/_i18n/hi/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: 'अफ़ग़ानिस्तान', code: 'AFG', flag: '🇦🇫' }, +{ name: 'अल्बानिया', code: 'ALB', flag: '🇦🇱' }, +{ name: 'अल्जीरिया', code: 'DZA', flag: '🇩🇿' }, +{ name: 'अंडोरा', code: 'AND', flag: '🇦🇩' }, +{ name: 'अंगोला', code: 'AGO', flag: '🇦🇴' }, +{ name: 'एंटीगुआ और बारबुडा', code: 'ATG', flag: '🇦🇬' }, +{ name: 'अर्जेंटीना', code: 'ARG', flag: '🇦🇷' }, +{ name: 'आर्मेनिया', code: 'ARM', flag: '🇦🇲' }, +{ name: 'ऑस्ट्रेलिया', code: 'AUS', flag: '🇦🇺' }, +{ name: 'ऑस्ट्रिया', code: 'AUT', flag: '🇦🇹' }, +{ name: 'अज़रबैजान', code: 'AZE', flag: '🇦🇿' }, +{ name: 'बहामास', code: 'BHS', flag: '🇧🇸' }, +{ name: 'बहरीन', code: 'BHR', flag: '🇧🇭' }, +{ name: 'बांग्लादेश', code: 'BGD', flag: '🇧🇩' }, +{ name: 'बारबाडोस', code: 'BRB', flag: '🇧🇧' }, +{ name: 'बेलारूस', code: 'BLR', flag: '🇧🇾' }, +{ name: 'बेल्जियम', code: 'BEL', flag: '🇧🇪' }, +{ name: 'बेलीज़', code: 'BLZ', flag: '🇧🇿' }, +{ name: 'बेनिन', code: 'BEN', flag: '🇧🇯' }, +{ name: 'भूटान', code: 'BTN', flag: '🇧🇹' }, +{ name: 'बोलीविया', code: 'BOL', flag: '🇧🇴' }, +{ name: 'बोस्निया और हर्जेगोविना', code: 'BIH', flag: '🇧🇦' }, +{ name: 'बोत्सवाना', code: 'BWA', flag: '🇧🇼' }, +{ name: 'ब्राज़ील', code: 'BRA', flag: '🇧🇷' }, +{ name: 'ब्रुनेई', code: 'BRN', flag: '🇧🇳' }, +{ name: 'बुल्गारिया', code: 'BGR', flag: '🇧🇬' }, +{ name: 'बुर्किना फासो', code: 'BFA', flag: '🇧🇫' }, +{ name: 'बुरुंडी', code: 'BDI', flag: '🇧🇮' }, +{ name: 'कंबोडिया', code: 'KHM', flag: '🇰🇭' }, +{ name: 'कैमरून', code: 'CMR', flag: '🇨🇲' }, +{ name: 'कनाडा', code: 'CAN', flag: '🇨🇦' }, +{ name: 'केप वर्डे', code: 'CPV', flag: '🇨🇻' }, +{ name: 'मध्य अफ्रीकी गणराज्य', code: 'CAF', flag: '🇨🇫' }, +{ name: 'चाड', code: 'TCD', flag: '🇹🇩' }, +{ name: 'चिली', code: 'CHL', flag: '🇨🇱' }, +{ name: 'चीन', code: 'CHN', flag: '🇨🇳' }, +{ name: 'कोलंबिया', code: 'COL', flag: '🇨🇴' }, +{ name: 'कोमोरोस', code: 'COM', flag: '🇰🇲' }, +{ name: 'कांगो', code: 'COG', flag: '🇨🇬' }, +{ name: 'कोस्टा रिका', code: 'CRI', flag: '🇨🇷' }, +{ name: 'क्रोएशिया', code: 'HRV', flag: '🇭🇷' }, +{ name: 'क्यूबा', code: 'CUB', flag: '🇨🇺' }, +{ name: 'साइप्रस', code: 'CYP', flag: '🇨🇾' }, +{ name: 'चेक गणराज्य', code: 'CZE', flag: '🇨🇿' }, +{ name: 'डेनमार्क', code: 'DNK', flag: '🇩🇰' }, +{ name: 'जिबूती', code: 'DJI', flag: '🇩🇯' }, +{ name: 'डोमिनिका', code: 'DMA', flag: '🇩🇲' }, +{ name: 'डोमिनिकन गणराज्य', code: 'DOM', flag: '🇩🇴' }, +{ name: 'इक्वाडोर', code: 'ECU', flag: '🇪🇨' }, +{ name: 'मिस्र', code: 'EGY', flag: '🇪🇬' }, +{ name: 'अल सल्वाडोर', code: 'SLV', flag: '🇸🇻' }, +{ name: 'इक्वेटोरियल गिनी', code: 'GNQ', flag: '🇬🇶' }, +{ name: 'इरिट्रिया', code: 'ERI', flag: '🇪🇷' }, +{ name: 'एस्टोनिया', code: 'EST', flag: '🇪🇪' }, +{ name: 'इथियोपिया', code: 'ETH', flag: '🇪🇹' }, +{ name: 'फिजी', code: 'FJI', flag: '🇫🇯' }, +{ name: 'फिनलैंड', code: 'FIN', flag: '🇫🇮' }, +{ name: 'फ्रांस', code: 'FRA', flag: '🇫🇷' }, +{ name: 'गैबॉन', code: 'GAB', flag: '🇬🇦' }, +{ name: 'गाम्बिया', code: 'GMB', flag: '🇬🇲' }, +{ name: 'जॉर्जिया', code: 'GEO', flag: '🇬🇪' }, +{ name: 'जर्मनी', code: 'DEU', flag: '🇩🇪' }, +{ name: 'घाना', code: 'GHA', flag: '🇬🇭' }, +{ name: 'ग्रीस', code: 'GRC', flag: '🇬🇷' }, +{ name: 'ग्रेनाडा', code: 'GRD', flag: '🇬🇩' }, +{ name: 'ग्वाटेमाला', code: 'GTM', flag: '🇬🇹' }, +{ name: 'गिनी', code: 'GIN', flag: '🇬🇳' }, +{ name: 'गिनी-बिसाऊ', code: 'GNB', flag: '🇬🇼' }, +{ name: 'गुयाना', code: 'GUY', flag: '🇬🇾' }, +{ name: 'हैती', code: 'HTI', flag: '🇭🇹' }, +{ name: 'होंडुरस', code: 'HND', flag: '🇭🇳' }, +{ name: 'हंगरी', code: 'HUN', flag: '🇭🇺' }, +{ name: 'आइसलैंड', code: 'ISL', flag: '🇮🇸' }, +{ name: 'भारत', code: 'IND', flag: '🇮🇳' }, +{ name: 'इंडोनेशिया', code: 'IDN', flag: '🇮🇩' }, +{ name: 'ईरान', code: 'IRN', flag: '🇮🇷' }, +{ name: 'इराक', code: 'IRQ', flag: '🇮🇶' }, +{ name: 'आयरलैंड', code: 'IRL', flag: '🇮🇪' }, +{ name: 'इज़राइल', code: 'ISR', flag: '🇮🇱' }, +{ name: 'इटली', code: 'ITA', flag: '🇮🇹' }, +{ name: 'जमैका', code: 'JAM', flag: '🇯🇲' }, +{ name: 'जापान', code: 'JPN', flag: '🇯🇵' }, +{ name: 'जॉर्डन', code: 'JOR', flag: '🇯🇴' }, +{ name: 'कज़ाखस्तान', code: 'KAZ', flag: '🇰🇿' }, +{ name: 'केन्या', code: 'KEN', flag: '🇰🇪' }, +{ name: 'किरिबाती', code: 'KIR', flag: '🇰🇮' }, +{ name: 'उत्तर कोरिया', code: 'PRK', flag: '🇰🇵' }, +{ name: 'दक्षिण कोरिया', code: 'KOR', flag: '🇰🇷' }, +{ name: 'कुवैत', code: 'KWT', flag: '🇰🇼' }, +{ name: 'किर्गिज़स्तान', code: 'KGZ', flag: '🇰🇬' }, +{ name: 'लाओस', code: 'LAO', flag: '🇱🇦' }, +{ name: 'लातविया', code: 'LVA', flag: '🇱🇻' }, +{ name: 'लेबनान', code: 'LBN', flag: '🇱🇧' }, +{ name: 'लेसोथो', code: 'LSO', flag: '🇱🇸' }, +{ name: 'लाइबेरिया', code: 'LBR', flag: '🇱🇷' }, +{ name: 'लीबिया', code: 'LBY', flag: '🇱🇾' }, +{ name: 'लिकटेंस्टाइन', code: 'LIE', flag: '🇱🇮' }, +{ name: 'लिथुआनिया', code: 'LTU', flag: '🇱🇹' }, +{ name: 'लक्समबर्ग', code: 'LUX', flag: '🇱🇺' }, +{ name: 'मैसेडोनिया', code: 'MKD', flag: '🇲🇰' }, +{ name: 'मेडागास्कर', code: 'MDG', flag: '🇲🇬' }, +{ name: 'मलावी', code: 'MWI', flag: '🇲🇼' }, +{ name: 'मलेशिया', code: 'MYS', flag: '🇲🇾' }, +{ name: 'मालदीव', code: 'MDV', flag: '🇲🇻' }, +{ name: 'माली', code: 'MLI', flag: '🇲🇱' }, +{ name: 'माल्टा', code: 'MLT', flag: '🇲🇹' }, +{ name: 'मार्शल द्वीप', code: 'MHL', flag: '🇲🇭' }, +{ name: 'मॉरिटानिया', code: 'MRT', flag: '🇲🇷' }, +{ name: 'मॉरीशस', code: 'MUS', flag: '🇲🇺' }, +{ name: 'मेक्सिको', code: 'MEX', flag: '🇲🇽' }, +{ name: 'माइक्रोनेशिया', code: 'FSM', flag: '🇫🇲' }, +{ name: 'मोल्दोवा', code: 'MDA', flag: '🇲🇩' }, +{ name: 'मोनाको', code: 'MCO', flag: '🇲🇨' }, +{ name: 'मंगोलिया', code: 'MNG', flag: '🇲🇳' }, +{ name: 'मोंटेनेग्रो', code: 'MNE', flag: '🇲🇪' }, +{ name: 'मोरक्को', code: 'MAR', flag: '🇲🇦' }, +{ name: 'मोज़ाम्बिक', code: 'MOZ', flag: '🇲🇿' }, +{ name: 'म्यांमार', code: 'MMR', flag: '🇲🇲' }, +{ name: 'नामीबिया', code: 'NAM', flag: '🇳🇦' }, +{ name: 'नाउरू', code: 'NRU', flag: '🇳🇷' }, +{ name: 'नेपाल', code: 'NPL', flag: '🇳🇵' }, +{ name: 'नीदरलैंड', code: 'NLD', flag: '🇳🇱' }, +{ name: 'न्यूज़ीलैंड', code: 'NZL', flag: '🇳🇿' }, +{ name: 'निकारागुआ', code: 'NIC', flag: '🇳🇮' }, +{ name: 'नाइजर', code: 'NER', flag: '🇳🇪' }, +{ name: 'नाइजीरिया', code: 'NGA', flag: '🇳🇬' }, +{ name: 'नॉर्वे', code: 'NOR', flag: '🇳🇴' }, +{ name: 'ओमान', code: 'OMN', flag: '🇴🇲' }, +{ name: 'पाकिस्तान', code: 'PAK', flag: '🇵🇰' }, +{ name: 'पलाऊ', code: 'PLW', flag: '🇵🇼' }, +{ name: 'पनामा', code: 'PAN', flag: '🇵🇦' }, +{ name: 'पापुआ न्यू गिनी', code: 'PNG', flag: '🇵🇬' }, +{ name: 'पराग्वे', code: 'PRY', flag: '🇵🇾' }, +{ name: 'पेरू', code: 'PER', flag: '🇵🇪' }, +{ name: 'फिलीपींस', code: 'PHL', flag: '🇵🇭' }, +{ name: 'पोलैंड', code: 'POL', flag: '🇵🇱' }, +{ name: 'पुर्तगाल', code: 'PRT', flag: '🇵🇹' }, +{ name: 'क़तर', code: 'QAT', flag: '🇶🇦' }, +{ name: 'रोमानिया', code: 'ROU', flag: '🇷🇴' }, +{ name: 'रूस', code: 'RUS', flag: '🇷🇺' }, +{ name: 'रवांडा', code: 'RWA', flag: '🇷🇼' }, +{ name: 'सेंट किट्स और नेविस', code: 'KNA', flag: '🇰🇳' }, +{ name: 'सेंट लूसिया', code: 'LCA', flag: '🇱🇨' }, +{ name: 'सेंट विंसेंट और ग्रेनेडाइंस', code: 'VCT', flag: '🇻🇨' }, +{ name: 'समोआ', code: 'WSM', flag: '🇼🇸' }, +{ name: 'सैन मरीनो', code: 'SMR', flag: '🇸🇲' }, +{ name: 'साओ टोम और प्रिंसिपे', code: 'STP', flag: '🇸🇹' }, +{ name: 'सऊदी अरब', code: 'SAU', flag: '🇸🇦' }, +{ name: 'सेनेगल', code: 'SEN', flag: '🇸🇳' }, +{ name: 'सर्बिया', code: 'SRB', flag: '🇷🇸' }, +{ name: 'सेशेल्स', code: 'SYC', flag: '🇸🇨' }, +{ name: 'सिएरा लियोन', code: 'SLE', flag: '🇸🇱' }, +{ name: 'सिंगापुर', code: 'SGP', flag: '🇸🇬' }, +{ name: 'स्लोवाकिया', code: 'SVK', flag: '🇸🇰' }, +{ name: 'स्लोवेनिया', code: 'SVN', flag: '🇸🇮' }, +{ name: 'सोलोमन द्वीप', code: 'SLB', flag: '🇸🇧' }, +{ name: 'सोमालिया', code: 'SOM', flag: '🇸🇴' }, +{ name: 'दक्षिण अफ्रीका', code: 'ZAF', flag: '🇿🇦' }, +{ name: 'दक्षिण सूडान', code: 'SSD', flag: '🇸🇸' }, +{ name: 'स्पेन', code: 'ESP', flag: '🇪🇸' }, +{ name: 'श्रीलंका', code: 'LKA', flag: '🇱🇰' }, +{ name: 'सूडान', code: 'SDN', flag: '🇸🇩' }, +{ name: 'सूरीनाम', code: 'SUR', flag: '🇸🇷' }, +{ name: 'स्वाज़ीलैंड', code: 'SWZ', flag: '🇸🇿' }, +{ name: 'स्वीडन', code: 'SWE', flag: '🇸🇪' }, +{ name: 'स्विट्ज़रलैंड', code: 'CHE', flag: '🇨🇭' }, +{ name: 'सीरिया', code: 'SYR', flag: '🇸🇾' }, +{ name: 'ताइवान', code: 'TWN', flag: '🇹🇼' }, +{ name: 'ताजिकिस्तान', code: 'TJK', flag: '🇹🇯' }, +{ name: 'तंज़ानिया', code: 'TZA', flag: '🇹🇿' }, +{ name: 'थाईलैंड', code: 'THA', flag: '🇹🇭' }, +{ name: 'तिमोर-लेस्ते', code: 'TLS', flag: '🇹🇱' }, +{ name: 'टोगो', code: 'TGO', flag: '🇹🇬' }, +{ name: 'टोंगा', code: 'TON', flag: '🇹🇴' }, +{ name: 'त्रिनिदाद और टोबैगो', code: 'TTO', flag: '🇹🇹' }, +{ name: 'ट्यूनीशिया', code: 'TUN', flag: '🇹🇳' }, +{ name: 'तुर्की', code: 'TUR', flag: '🇹🇷' }, +{ name: 'तुर्कमेनिस्तान', code: 'TKM', flag: '🇹🇲' }, +{ name: 'तुवालु', code: 'TUV', flag: '🇹🇻' }, +{ name: 'युगांडा', code: 'UGA', flag: '🇺🇬' }, +{ name: 'यूक्रेन', code: 'UKR', flag: '🇺🇦' }, +{ name: 'संयुक्त अरब अमीरात', code: 'ARE', flag: '🇦🇪' }, +{ name: 'यूनाइटेड किंगडम', code: 'GBR', flag: '🇬🇧' }, +{ name: 'संयुक्त राज्य अमेरिका', code: 'USA', flag: '🇺🇸' }, +{ name: 'उरुग्वे', code: 'URY', flag: '🇺🇾' }, +{ name: 'उज़्बेकिस्तान', code: 'UZB', flag: '🇺🇿' }, +{ name: 'वानुअतु', code: 'VUT', flag: '🇻🇺' }, +{ name: 'वेटिकन सिटी', code: 'VAT', flag: '🇻🇦' }, +{ name: 'वेनेज़ुएला', code: 'VEN', flag: '🇻🇪' }, +{ name: 'वियतनाम', code: 'VNM', flag: '🇻🇳' }, +{ name: 'यमन', code: 'YEM', flag: '🇾🇪' }, +{ name: 'ज़ाम्बिया', code: 'ZMB', flag: '🇿🇲' }, +{ name: 'ज़िम्बाब्वे', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/hi/formatter/submission.html b/_i18n/hi/formatter/submission.html new file mode 100644 index 00000000000..42bae1a8d4b --- /dev/null +++ b/_i18n/hi/formatter/submission.html @@ -0,0 +1,56 @@ +
+
अपनी सम्मेलन की जानकारी कैसे जमा करें
+ +
+
1. Python-Organizers CSV प्रारूप
+

+ अपने सम्मेलन को + python-organizers/conferences + रिपॉजिटरी में जोड़ें: +

+
    +
  • रिपॉजिटरी का फोर्क करें
  • +
  • संबंधित वर्ष की CSV फ़ाइल संपादित करें
  • +
  • अपने सम्मेलन का डेटा पंक्ति जोड़ें
  • +
  • पुल अनुरोध (pull request) सबमिट करें
  • +
+
+ +
+
2. PythonDeadlin.es YAML प्रारूप
+

+ अपने सम्मेलन को + jesperdramsch/python-deadlines में जोड़ें: +

+
    +
  • रिपॉजिटरी का फोर्क करें
  • +
  • `_data/conferences.yml` फ़ाइल संपादित करें
  • +
  • उचित स्थान पर अपने सम्मेलन का YAML डेटा जोड़ें
  • +
  • पुल अनुरोध (pull request) सबमिट करें
  • +
+
+ +
+
3. Python.org कैलेंडर प्रारूप
+

अपने सम्मेलन को आधिकारिक Python इवेंट कैलेंडर में सबमिट करें:

+
    +
  • + कैलेंडर प्रारूप टेक्स्ट के साथ + + href="mailto:events@python.org" + >events[at]python.org + पर ईमेल करें +
  • +
  • विषय पंक्ति शामिल करें: "Python Event Submission: [आपके सम्मेलन का नाम]"
  • +
  • Python इवेंट टीम से पुष्टि की प्रतीक्षा करें
  • +
+
+ +
+ सुझाव: अपने Python सम्मेलन की दृश्यता को अधिकतम करने के लिए + सभी तीन प्लेटफॉर्म पर सबमिट करें! +
+
diff --git a/_i18n/hi/frontpage/description.md b/_i18n/hi/frontpage/description.md new file mode 100644 index 00000000000..452a1f57559 --- /dev/null +++ b/_i18n/hi/frontpage/description.md @@ -0,0 +1,5 @@ +यह सामुदायिक उपकरण पायथन सम्मेलनों में भागीदारी, प्रस्ताव, कार्यशालाओं और ट्यूटोरियल के लिए कॉल की समयसीमा के लिए एक केंद्रीय भंडार के रूप में कार्य करता है। + +तिथियाँ उलटी गिनती के रूप में, स्थानीय समय क्षेत्रों में और यहाँ तक कि नीचे दिए गए Google कैलेंडर के रूप में भी उपलब्ध कराई जाती हैं! + +समयसीमाएँ आपके स्थानीय समय में दिखाई जाती हैं। उन्हें सम्मेलन वेबसाइट के समय क्षेत्रों में देखने के लिए, सम्मेलन पर क्लिक करें। diff --git a/_i18n/hi/frontpage/hook.md b/_i18n/hi/frontpage/hook.md new file mode 100644 index 00000000000..28550f5d0fd --- /dev/null +++ b/_i18n/hi/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es आपके पसंदीदा पायथन सम्मेलनों का आयोजन करता है। diff --git a/_i18n/hi/maps/description.md b/_i18n/hi/maps/description.md new file mode 100644 index 00000000000..4661474c125 --- /dev/null +++ b/_i18n/hi/maps/description.md @@ -0,0 +1,3 @@ +मानचित्र पर समय-सीमा और सम्मेलन की तिथियों का अवलोकन। + +PythonDeadlin.es पर भविष्य में होने वाले सभी पायथन सम्मेलनों को एक अच्छे स्थानिक प्रारूप में सूचीबद्ध किया गया है। diff --git a/_i18n/hi/resources/description.md b/_i18n/hi/resources/description.md new file mode 100644 index 00000000000..4169edf5a7e --- /dev/null +++ b/_i18n/hi/resources/description.md @@ -0,0 +1,5 @@ +यह पेज आपको पायथन सम्मेलनों के लिए बेहतरीन कॉल फॉर प्रपोज़ल (CfP) तैयार करने में मदद करने के लिए समर्पित है। यहाँ, आपको आकर्षक प्रस्ताव लिखने के लिए ब्लॉग पोस्ट, गाइड और सुझावों का संग्रह मिलेगा। + +हमारे संसाधन CfP लेखन के विभिन्न पहलुओं को कवर करते हैं, जिसमें विषय चुनने से लेकर आपके सबमिशन की संरचना तक शामिल है। चाहे आप पहली बार बोलने वाले वक्ता हों या अनुभवी प्रस्तुतकर्ता, इन उपकरणों का उद्देश्य आपके प्रस्ताव-लेखन कौशल को बढ़ाना है। + +दुनिया भर में पायथन कार्यक्रमों में अपने भाषण या कार्यशाला को स्वीकार किए जाने की संभावना बढ़ाने के लिए हमारी क्यूरेटेड सामग्री का अन्वेषण करें। diff --git a/_i18n/hi/search/description.md b/_i18n/hi/search/description.md new file mode 100644 index 00000000000..2ff1d709925 --- /dev/null +++ b/_i18n/hi/search/description.md @@ -0,0 +1,5 @@ +पायथन सम्मेलन की समय-सीमा और घटनाओं के हमारे व्यापक डेटाबेस से खोज परिणाम। परिणाम आपकी क्वेरी से मेल खाने वाले प्रासंगिक पृष्ठों की सूची के रूप में प्रस्तुत किए जाते हैं। + +प्रत्येक परिणाम में सम्मेलन का नाम, समय-सीमा तिथियां और संक्षिप्त विवरण जैसे मुख्य विवरण शामिल हैं। समय-सीमाएं आपके स्थानीय समय क्षेत्र में दिखाई जाती हैं। + +आधिकारिक सम्मेलन वेबसाइट के लिए दिशानिर्देश और लिंक सहित अधिक विस्तृत जानकारी देखने के लिए किसी सम्मेलन के नाम पर क्लिक करें। diff --git a/_i18n/hi/series/description.md b/_i18n/hi/series/description.md new file mode 100644 index 00000000000..dcbe8c99087 --- /dev/null +++ b/_i18n/hi/series/description.md @@ -0,0 +1,4 @@ +हमारे समुदाय उपकरण का यह खंड आवर्ती पायथन सम्मेलन श्रृंखला की एक व्यापक निर्देशिका के रूप में कार्य करता है। यहाँ, आपको नियमित आयोजनों, उनके विशिष्ट कार्यक्रमों और ऐतिहासिक जानकारी का अवलोकन मिलेगा। + +श्रृंखला को संक्षिप्त विवरण और पिछले आयोजनों के लिंक के साथ प्रस्तुत किया जाता है, जिससे आपको अपने दीर्घकालिक सम्मेलन भागीदारी की योजना बनाने में मदद मिलती है। +अधिक विवरण देखने और इसके आगामी और पिछले आयोजनों के बारे में जानकारी प्राप्त करने के लिए एक श्रृंखला देखें। diff --git a/_i18n/hi/trademark/django.md b/_i18n/hi/trademark/django.md new file mode 100644 index 00000000000..1e93fd6f107 --- /dev/null +++ b/_i18n/hi/trademark/django.md @@ -0,0 +1,2 @@ +

Django, Django Software Foundation का पंजीकृत ट्रेडमार्क है। यह वेबसाइट, pythondeadlin.es, Django Software Foundation या किसी Django इवेंट से संबद्ध, समर्थित या प्रायोजित नहीं है। इस साइट पर उपयोग किए गए सभी ट्रेडमार्क और लोगो उनके संबंधित स्वामियों की संपत्ति बने रहेंगे। Django या अन्य ट्रेडमार्क का कोई भी संदर्भ केवल सूचनात्मक उद्देश्यों के लिए है और ट्रेडमार्क धारकों के साथ जुड़ाव का संकेत नहीं देता है।

+

Django Software Foundation और उसके ट्रेडमार्क के बारे में अधिक जानकारी के लिए, https://www.djangoproject.com/foundation/ पर जाएँ।

diff --git a/_i18n/hi/trademark/generic.md b/_i18n/hi/trademark/generic.md new file mode 100644 index 00000000000..70d7561ae62 --- /dev/null +++ b/_i18n/hi/trademark/generic.md @@ -0,0 +1 @@ +

इस साइट पर सूचीबद्ध घटनाओं द्वारा स्थापित ट्रेडमार्क या लोगो का कोई भी उपयोग केवल सूचनात्मक उद्देश्यों के लिए है और संबंधित ट्रेडमार्क धारकों के साथ संबंध नहीं दर्शाता है। यदि आप ट्रेडमार्क धारक हैं और चाहते हैं कि आपका ट्रेडमार्क इस साइट से हटा दिया जाए, तो कृपया हमसे संपर्क करें।

diff --git a/_i18n/hi/trademark/pycon.md b/_i18n/hi/trademark/pycon.md new file mode 100644 index 00000000000..7b2caaf28f6 --- /dev/null +++ b/_i18n/hi/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon और PyLadies, Python Software Foundation के पंजीकृत ट्रेडमार्क हैं। यह वेबसाइट, pythondeadlin.es, Python Software Foundation या किसी PyCon इवेंट से संबद्ध, समर्थित या प्रायोजित नहीं है। इस साइट पर उपयोग किए गए सभी ट्रेडमार्क और लोगो उनके संबंधित स्वामियों की संपत्ति बने रहेंगे। PyCon या अन्य ट्रेडमार्क का कोई भी संदर्भ केवल सूचनात्मक उद्देश्यों के लिए है और इसका मतलब ट्रेडमार्क धारकों के साथ जुड़ाव नहीं है।

diff --git a/_i18n/hi/trademark/pydata.md b/_i18n/hi/trademark/pydata.md new file mode 100644 index 00000000000..b8c327e7679 --- /dev/null +++ b/_i18n/hi/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS, PyData और वित्तीय रूप से प्रायोजित परियोजनाएँ NumFOCUS के पंजीकृत ट्रेडमार्क हैं। यह वेबसाइट, pythondeadlin.es, NumFOCUS या किसी PyData या संबद्ध ईवेंट से संबद्ध, समर्थित या प्रायोजित नहीं है। इस साइट पर उपयोग किए गए सभी ट्रेडमार्क और लोगो उनके संबंधित स्वामियों की संपत्ति बने रहेंगे। NumFOCUS, PyData या अन्य ट्रेडमार्क का कोई भी संदर्भ केवल सूचनात्मक उद्देश्यों के लिए है और इसका मतलब ट्रेडमार्क धारकों के साथ जुड़ाव नहीं है।

diff --git a/_i18n/id.yml b/_i18n/id.yml new file mode 100644 index 00000000000..b5d8d457425 --- /dev/null +++ b/_i18n/id.yml @@ -0,0 +1,248 @@ +--- +global: + current: 'id' + choose: 'Pilih Bahasa' + sub_filter: 'Filter berdasarkan Subkategori:' + en: 'English' + es: 'Español' + de: 'Deutsch' + fr: 'Français' + pt-br: 'Português' + zh-cn: '中文' + hi: 'हिन्दी' + id: 'Bahasa' + ru: 'Русский' + cfp: 'Undangan Partisipasi' + cfp_ext: 'CFP diperpanjang dari' + subscribe: 'Berlangganan' +titles: + default: 'Tenggat Waktu Konferensi Python' + archive: 'Konferensi Python Sebelumnya' + visit_archive: 'Kunjungi Arsip' + calendar: 'Kalender Tenggat Waktu dan Tanggal Konferensi Python' + map: 'Peta Lokasi Konferensi Python' + a404: 'Halaman Tidak Ditemukan' + privacy: 'Kebijakan Privasi' + resources: 'Sumber Daya untuk Menulis CFP Berkualitas' + series: 'Daftar Seri Acara Python' + impressum: 'Syarat dan Ketentuan' + past_events: 'Acara Sebelumnya' + past_cfps: 'Undangan Sebelumnya' + search: 'Cari' + about: 'Tentang Tenggat Waktu Konferensi Python' + languages: 'Bahasa yang Tersedia' + formatter: 'Formatter Konferensi Python' +buttons: + ical: Dapatkan iCal + google: Tambahkan ke Google Calendar + github: Kirim Konferensi di GitHub + all_selected: Semua Konferensi Dipilih + none_selected: Tidak Ada Konferensi Dipilih +description: + summary: 'Ringkasan konferensi dan sejarahnya selama bertahun-tahun.' +header: + countdown: 'Hitung Mundur' + calendar: 'Kalender' + maps: 'Peta' + series: 'Seri' + resources: 'Sumber Daya' + formatter: 'Format App' + course: 'Kursus Email' + articles: 'Artikel untuk Memulai' +conference: + title: 'Tenggat Waktu Konferensi' + finaid: 'Bantuan Keuangan' + sponsor: 'Kesempatan Sponsor' + all: 'Semua konferensi untuk' + download_dl: 'Unduh Tenggat Waktu Konferensi' + download_date: 'Unduh Tanggal Konferensi' + deadline_tz_theirs: 'Tenggat waktu dalam zona waktu situs konferensi' + deadline_tz_local: "Tenggat waktu dalam zona waktu lokal Anda" +summary: + title: 'Ringkasan Konferensi' +subs: + PY: 'Python Umum' + SCIPY: 'Python Ilmiah' + DATA: 'Python untuk Data' + WEB: 'Python untuk Web' + BIZ: 'Python untuk Bisnis' + GEO: 'Python untuk Bumi' + CAMP: 'Kamp Python' + DAY: 'Hari Python' +series: + always: 'Selalu diadakan di' + place: + last: 'Konferensi terakhir di' + next: 'Konferensi berikutnya di' + year: + last: 'Tahun terakhir diadakan' + next: 'Tahun berikutnya' +times: + tba: "Akan Diumumkan" + from: "Dari" + until: "Hingga" + normal: + days: 'hari' + hours: 'jam' + minutes: 'menit' + seconds: 'detik' + short: + days: 'h' + hours: 'j' + minutes: 'm' + seconds: 'd' + months: + January: 'Januari' + February: 'Februari' + March: 'Maret' + April: 'April' + May: 'Mei' + June: 'Juni' + July: 'Juli' + August: 'Agustus' + September: 'September' + October: 'Oktober' + November: 'November' + December: 'Desember' +social: + twitter: 'Tweet Konferensi' + facebook: 'Bagikan Konferensi di FB' + linkedin: 'Bagikan Konferensi di LinkedIn' + whatsapp: 'Bagikan Konferensi di WhatsApp' + email: 'Email Konferensi' +search: + no-results: 'Tidak ditemukan hasil.' + error: 'Kesalahan memuat indeks pencarian. Silakan coba lagi nanti.' +about: + toggle_fullscreen: "Alihkan mode presentasi layar penuh" + previous_slide: "Slide sebelumnya" + next_slide: "Slide berikutnya" + tagline: "Jangan pernah lewatkan tenggat waktu konferensi Python lagi!" + hero_description: "Platform berbasis komunitas yang membantu pengembang Python menemukan, melacak, dan mengirimkan proposal ke konferensi di seluruh dunia." + problem: + title: "Tantangan" + description: "Melacak tenggat waktu konferensi Python di berbagai situs web, zona waktu, dan format membutuhkan waktu dan rentan kesalahan. Banyak pengembang melewatkan kesempatan berbagi pengetahuan karena mereka menemukan CFP terlambat." + solution: + title: "Solusi Kami" + description: "Pythondeadlin.es mengkonsolidasikan semua tenggat waktu konferensi Python di satu tempat, dengan konversi zona waktu otomatis, berbagai opsi pengingat, dan detail komprehensif untuk membantu Anda merencanakan pengiriman secara efektif." + features: + title: "Fitur Utama" + tracking: + title: "Pelacakan Komprehensif" + description: "Pantau setiap tenggat waktu Call for Proposals (CfP) untuk konferensi Python di seluruh dunia dengan penghitung waktu mundur yang dipersonalisasi dalam zona waktu lokal Anda." + notifications: + title: "Notifikasi Fleksibel" + description: "Pilih bagaimana Anda ingin diingatkan—berlangganan melalui iCal, Google Calendar, atau feed RSS untuk menerima pengingat tepat waktu yang sesuai dengan alur kerja Anda." + coverage: + title: "Cakupan Global" + description: "Temukan acara Python dari PyCon hingga PyData di enam benua dengan tampilan peta interaktif dan kalender komprehensif kami." + language: + title: "Dukungan Multi-bahasa" + description: "Akses platform dalam bahasa Inggris, Spanyol, Jerman, Prancis, Portugis Brasil, Mandarin, Hindi, Indonesia, atau Rusia, menjadikan konferensi Python dapat diakses oleh pengembang dari berbagai latar belakang bahasa." + community: + title: "Didorong oleh Komunitas" + description: "Manfaatkan pendekatan open-source kami di mana komunitas Python secara kolaboratif memelihara informasi konferensi yang akurat dan terkini." + mobile: + title: "Ramah Perangkat Seluler" + description: "Periksa tenggat waktu saat bepergian dengan desain responsif kami yang beradaptasi dengan mulus ke perangkat apa pun—sempurna untuk pengembang yang sibuk." + categories: + title: "Kategori Konferensi" + intro: "Kami melacak konferensi Python di berbagai spesialisasi:" + stats: + title: "Dalam Angka" + conferences: + label: "Konferensi Terlacak" + description: "Database komprehensif acara Python di seluruh dunia" + categories: + label: "Kategori Konferensi" + description: "Dari Python umum hingga spesialisasi khusus" + guides: + label: "Panduan Sumber Daya" + description: "Panduan komprehensif untuk pembicara pemula dan berpengalaman" + countries: + label: "Negara Berbeda" + description: "Konferensi Python dari seluruh dunia" + languages: + label: "Bahasa" + description: "Membuat konferensi Python dapat diakses secara global" + testimonials: + title: "Apa Kata Pengguna" + first: + quote: "\"Berkat Pythondeadlin.es, saya dapat mengirimkan proposal presentasi konferensi pertama saya dengan cukup waktu untuk mempersiapkan. Situs ini telah menjadi alat penting dalam pengembangan profesional saya.\"" + author: "— Pengembang Python" + second: + quote: "\"Sebagai penyelenggara konferensi, saya menghargai bahwa acara kami ditampilkan secara akurat. Platform ini telah membantu kami menjangkau audiens pembicara potensial yang lebih luas.\"" + author: "— Penyelenggara PyCon" + third: + quote: "\"Kami sekarang secara rutin menampilkan PythonDeadlin.es di Meetup kami untuk melacak konferensi yang mungkin menarik bagi peserta kami.\"" + author: "— Penyelenggara Meetup" + use_cases: + title: "Bagaimana Orang Menggunakan Pythondeadlin.es" + first_time: + title: "Pembicara Pertama Kali" + description: "Temukan konferensi ramah pemula dengan waktu persiapan yang cukup untuk menyusun proposal yang menarik dan gunakan bagian sumber daya untuk inspirasi dan panduan." + frequent: + title: "Presenter Rutin" + description: "Rencanakan jadwal presentasi tahunan Anda dan prioritaskan tenggat waktu pengiriman di berbagai acara." + organizers: + title: "Penyelenggara Konferensi" + description: "Pastikan acara Anda menjangkau pembicara potensial dengan menambahkan konferensi Anda ke database kami." + cta: + title: "Mulai Melacak Tenggat Waktu Konferensi Hari Ini" + description: "Bergabunglah dengan komunitas Python untuk tetap mengikuti peluang konferensi. Pindai kode QR atau kunjungi pythondeadlin.es untuk memulai." + visit_button: "Kunjungi Situs" + github_button: "Berkontribusi di GitHub" + qr_alt: "Kode QR untuk pythondeadlin.es" +languages: + native_speaker: 'Penutur asli' + language_learner: 'Pembelajar bahasa' + ai_translated: 'Diterjemahkan oleh AI' + switch_to: 'Beralih' + translated_by: 'Diterjemahkan oleh:' + legend: 'Legenda' +formatter: + description: 'Kirim Tenggat Waktu Konferensi Python dalam Berbagai Format' + basic: + title: 'Informasi Dasar' + name: 'Nama Konferensi' + year: 'Tahun' + type: 'Jenis Konferensi' + attendees: 'Peserta yang Diharapkan' + url: 'URL Situs Web' + location_date: + title: 'Lokasi & Tanggal' + city: 'Kota' + city_help: 'Masukkan hanya nama kota' + country: 'Negara' + country_help: 'Mulai mengetik untuk melihat negara yang cocok dengan bendera' + venue: 'Tempat' + extra_places: "Tempat Tambahan" + extra_help: "Untuk acara hybrid atau online, tambahkan lokasi tambahan yang dipisahkan koma di sini." + start_date: 'Tanggal Mulai' + end_date: 'Tanggal Selesai' + timezone: 'Zona Waktu' + timezone_help: 'Mulai mengetik untuk memilih zona waktu konferensi' + cfp: + title: 'Panggilan untuk Proposal' + status: 'Status CfP' + tba: 'Akan Diumumkan' + none: 'Tidak Ada CfP' + date: 'Gunakan Tanggal' + deadline: 'Batas Waktu Pengiriman' + deadline_help: 'Batas waktu untuk mengirimkan proposal presentasi' + link: 'Tautan CfP' + additional_info: + title: 'Informasi Tambahan' + sponsor: 'URL Sponsor' + finaid: 'URL Bantuan Keuangan' + mastodon: 'URL Mastodon' + bsky: 'URL Bluesky' + notes: 'Catatan Tambahan' + notes_place: 'Catatan tambahan tentang konferensi' + submission_guidelines: 'Pedoman Pengiriman' + generate_output: 'Hasilkan Format' + generated_outputs: 'Format yang Dihasilkan' + csv_format: 'Format CSV' + yaml_format: 'Format YAML' + calendar_format: 'Format Kalender' + required: 'Silakan isi semua kolom yang diperlukan yang ditandai dengan *.' diff --git a/_i18n/id/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/id/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..f0d6ffea6f8 --- /dev/null +++ b/_i18n/id/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: Bagaimana cara berbicara di konferensi Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +Konferensi Python adalah platform yang sangat baik untuk berbagi pengetahuan, membangun jaringan dengan rekan-rekan, dan tetap up-to-date dengan perkembangan terbaru di komunitas Python. Jika Anda memiliki minat yang besar terhadap Python dan ingin berbagi wawasan Anda dengan audiens yang lebih luas, berbicara di konferensi Python bisa menjadi kesempatan yang bagus. Dalam blog post ini, kita akan mengeksplorasi bagaimana cara untuk berbicara di konferensi Python. + +### Diundang + +Salah satu cara untuk diundang berbicara di konferensi Python adalah dengan memiliki reputasi yang mapan di komunitas. Misalnya, Anda telah berkontribusi pada proyek open-source, menulis artikel atau blog post tentang Python, atau berbicara di meetup atau acara yang lebih kecil. Dalam hal ini, Anda mungkin menarik perhatian penyelenggara konferensi. + +Selain itu, jika Anda adalah ahli di bidang tertentu, seperti machine learning atau pengembangan web, Anda mungkin diundang untuk berbicara di konferensi yang berfokus pada topik-topik tersebut. Untuk meningkatkan peluang Anda diundang, hadirilah konferensi dan meetup, berpartisipasilah dalam diskusi online, dan berkontribusilah pada komunitas Python dengan cara apa pun yang Anda bisa. + +### Mengirimkan Proposal untuk Call for Proposal (CfP) + +Cara lain untuk berbicara di konferensi Python adalah dengan mengirimkan proposal untuk Call for Proposals (CfP). Kebanyakan konferensi membuka CfP beberapa bulan sebelum acara, dan siapa pun dapat mengirimkan proposal. +Saat mengirimkan proposal, penting untuk diingat bahwa penyelenggara konferensi mencari pembicaraan yang orisinal dan menarik yang menarik bagi beragam audiens. Pastikan pengajuan Anda ditulis dengan baik, jelas, dan ringkas, serta membahas topik yang relevan dan menarik bagi komunitas Python. + +Berikut beberapa tips untuk mengirimkan proposal yang sukses: + +- Pilih topik yang Anda minati dan memiliki keahlian di dalamnya. +- Pastikan proposal Anda relevan dengan tema atau fokus konferensi. +- Tulis judul dan ringkasan yang menarik yang akan menarik perhatian penyelenggara konferensi dan peserta. +- Jelaskan pembicaraan Anda secara detail, termasuk apa yang akan Anda bahas dan bagaimana Anda akan mempresentasikannya. +- Sertakan materi pendukung, seperti contoh kode atau slide, untuk memberikan penyelenggara gambaran yang lebih baik tentang gaya presentasi dan konten Anda. + +### Bangun Keterampilan Berbicara Anda + +Jika Anda baru dalam berbicara di depan umum, ide yang baik adalah memulai dari yang kecil dengan berbicara di meetup atau acara lokal. + +Ini akan membantu Anda membangun kepercayaan diri dan menyempurnakan keterampilan presentasi Anda. Seiring dengan bertambahnya pengalaman, Anda dapat memperluas dan berbicara di acara yang lebih besar, seperti konferensi regional atau nasional. + +Mintalah umpan balik dari peserta dan penyelenggara setelah setiap pembicaraan, dan gunakan umpan balik itu untuk meningkatkan keterampilan berbicara Anda. + +### Bangun Jaringan dengan Pembicara Lain dan Peserta + +Akhirnya, membangun jaringan sangat penting untuk berbicara di konferensi Python. + +Hadiri sebanyak mungkin konferensi dan meetup, dan cobalah untuk terhubung dengan pembicara lain dan peserta. + +Dengan membangun hubungan dengan anggota lain dari komunitas Python, Anda akan meningkatkan visibilitas dan kredibilitas Anda, yang dapat mengarah pada lebih banyak kesempatan berbicara di masa depan. + +### Kesimpulan + +Sebagai kesimpulan, berbicara di konferensi Python membutuhkan kombinasi keahlian, persiapan, dan membangun jaringan. + +Dengan mengikuti tips ini, Anda dapat meningkatkan peluang Anda untuk diundang berbicara atau berhasil mengirimkan proposal ke CfP dan pada akhirnya berbagi pengetahuan Anda dengan komunitas Python yang lebih luas. diff --git a/_i18n/id/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/id/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..7cebffa9448 --- /dev/null +++ b/_i18n/id/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: Bagaimana cara membuat presentasi luar biasa untuk konferensi Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Konferensi Python menawarkan platform yang sangat baik bagi para developer untuk menunjukkan keterampilan mereka, berbagi pengetahuan, dan berjejaring dengan sesama profesional. + +Berbicara di konferensi Python bisa menjadi kesempatan luar biasa untuk mendapatkan pengakuan, membangun kredibilitas, dan memberikan kontribusi berharga bagi komunitas Python. Namun, presentasi di konferensi juga bisa menjadi hal yang menakutkan, terutama jika Anda baru dalam berbicara di depan umum atau belum pernah presentasi sebelumnya. Dalam sumber daya ini, kami akan berbagi beberapa tips tentang cara berbicara di konferensi Python dan membuat presentasi Anda sukses. + +## Pilih topik yang Anda minati + +Langkah pertama untuk memberikan presentasi yang sukses adalah memilih topik yang Anda minati. Jika Anda bersemangat tentang topik Anda, antusiasme Anda akan terlihat dalam presentasi Anda. Anda akan lebih mungkin untuk melibatkan dan memikat audiens Anda. Pilih topik yang relevan dengan komunitas Python dan menawarkan wawasan berharga atau solusi untuk masalah umum. + +## Pahami audiens Anda + +Sebelum Anda mulai menyiapkan presentasi, penting untuk memahami demografi, tingkat keahlian, dan minat audiens Anda. Ini akan membantu Anda menyesuaikan konten dan cara penyampaian untuk memenuhi harapan dan kebutuhan mereka. Misalnya, jika audiens Anda terdiri dari pengembang Python pemula, Anda dapat menyederhanakan jargon teknis dan fokus pada konsep dasar. + +## Buat narasi yang menarik + +Narasi yang menarik adalah aspek penting dari presentasi yang sukses. Penting untuk menyusun presentasi Anda dengan cara yang menceritakan sebuah kisah dan membuat audiens Anda tetap terlibat. Gunakan anekdot, studi kasus, dan contoh kehidupan nyata untuk membantu mengilustrasikan poin-poin Anda dan menambahkan sentuhan pribadi pada presentasi Anda. Pastikan untuk menyoroti dan menyajikan poin-poin penting dengan jelas dan ringkas. + +## Latihan, latihan, latihan + +Latihan sangat penting untuk memberikan presentasi yang baik dan percaya diri. Latihlah presentasi Anda beberapa kali sampai Anda merasa nyaman dengan konten dan cara penyampaian Anda. Atur waktu presentasi Anda untuk memastikan bahwa itu sesuai dengan kerangka waktu yang dialokasikan. Pertimbangkan untuk merekam sesi latihan Anda dan meninjau kembali untuk mengidentifikasi area yang perlu ditingkatkan. + +## Gunakan visual untuk mendukung pesan Anda + +Alat bantu visual seperti slide dan diagram dapat membantu mendukung pesan Anda dan membuat audiens Anda tetap terlibat. Namun, berhati-hatilah untuk tidak membebani presentasi Anda dengan terlalu banyak visual, yang dapat mengalihkan perhatian dari pesan Anda. Gunakan grafik dan gambar untuk mengilustrasikan konsep dan data yang kompleks, dan jaga slide Anda tetap sederhana dan menarik secara visual. + +## Berinteraksi dengan audiens Anda + +Berinteraksi dengan audiens Anda adalah aspek penting dari presentasi yang sukses. Dorong audiens Anda untuk berpartisipasi dengan mengajukan pertanyaan, melakukan jajak pendapat, atau menggunakan alat interaktif. Ini akan membantu menjaga audiens Anda tetap terlibat dan memungkinkan mereka untuk berkontribusi pada diskusi. Bersiaplah untuk menjawab pertanyaan dan mengatasi kekhawatiran atau umpan balik yang mungkin muncul. + +## Kesimpulan + +Berbicara di konferensi Python bisa menjadi cara yang bagus untuk berbagi pengetahuan Anda dan memberikan kontribusi berharga bagi komunitas. Dengan mengikuti tips ini, Anda dapat menyiapkan presentasi yang menarik yang melibatkan dan beresonansi dengan audiens Anda. Ingatlah untuk memilih topik yang Anda minati, memahami audiens Anda, membuat narasi yang menarik, melatih penyampaian Anda, menggunakan visual untuk mendukung pesan Anda, dan berinteraksi dengan audiens Anda. Semoga sukses, dan selamat presentasi! diff --git a/_i18n/id/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/id/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..3ca19a21ee5 --- /dev/null +++ b/_i18n/id/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,38 @@ +--- +title: Apa itu CfP konferensi Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'conference'] +--- + +Call for Proposals (CfP) atau Call for Participation adalah istilah umum yang digunakan dalam komunitas akademis, penelitian, dan profesional untuk mengundang individu atau kelompok untuk mengirimkan proposal atau abstrak untuk konferensi, workshop, simposium, dan acara lainnya. + +Karena komunitas Python adalah sekumpulan orang pintar yang menyenangkan, terminologi yang sama ini masuk ke dalam kosakata Python. + +## Apa itu CfP? + +Dalam istilah sederhana, CfP adalah undangan terbuka kepada para ahli, akademisi, peneliti, dan praktisi untuk mempresentasikan ide, temuan penelitian, dan studi kasus mereka dalam bidang atau area minat tertentu. + +CfP biasanya dikeluarkan oleh penyelenggara acara, komite konferensi, atau institusi akademik untuk mengumpulkan pengajuan dari individu atau kelompok yang berminat. + +## Untuk apa CfP? + +Tujuan dari CfP adalah untuk mendorong berbagai peserta untuk terlibat dengan acara atau konferensi, memastikan keberagaman perspektif dan ide. + +CfP sering menguraikan tema acara, topik yang diminati, dan pedoman pengajuan. Mereka juga menentukan jenis pengajuan yang diterima, seperti makalah penelitian, studi kasus, poster, atau workshop. + +## Bagaimana cara berpartisipasi dalam CfP? + +Proses pengajuan untuk CfP biasanya melibatkan persiapan proposal atau abstrak yang mencakup ringkasan topik yang diusulkan, metodologi penelitian atau pendekatan, dan hasil yang diharapkan. + +Beberapa CfP akademis mungkin memerlukan pengajuan makalah lengkap, sementara yang lain mungkin meminta abstrak singkat atau ringkasan. + +CfP Python jarang memerlukan pengajuan materi lengkap, karena mereka tidak menerbitkan makalah. Namun, penting untuk menghindari jebakan umum yaitu hanya menjanjikan pekerjaan masa depan. + +## Kesimpulan + +Singkatnya, CfP mengundang para ahli, akademisi, peneliti, dan praktisi untuk mengirimkan proposal atau abstrak untuk acara atau konferensi. + +CfP memainkan peran penting dalam memfasilitasi berbagi pengetahuan dan keahlian, mempromosikan diskusi, dan menciptakan peluang untuk membangun jaringan di antara para profesional dalam bidang tertentu. + +Jika Anda tertarik untuk menghadiri atau presentasi di konferensi atau acara, perhatikan CfP! diff --git a/_i18n/id/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/id/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..3be91ef865b --- /dev/null +++ b/_i18n/id/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: Cara menulis Proposal Presentasi Konferensi Python yang bagus +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +Menulis proposal konferensi yang baik bisa menjadi tantangan. Namun, ada beberapa elemen kunci yang dapat membantu membuat proposal Anda menonjol. Berikut adalah lima komponen penting dari proposal konferensi yang sukses. + +## Topik dan mengapa itu menarik + +Komponen pertama dari proposal konferensi yang baik adalah deskripsi yang jelas dan meyakinkan tentang topik yang Anda rencanakan untuk dibahas. Penting untuk mengkomunikasikan mengapa topik Anda relevan dan menarik bagi audiens konferensi. Pastikan untuk menyoroti aspek unik atau inovatif dari topik Anda dan tantangan atau peluang yang disajikan. + +## Audiens yang akan mendapat manfaat dari menghadiri presentasi/tutorial ini + +Mengidentifikasi audiens target Anda sangat penting dalam membuat proposal konferensi yang sukses. + +Spesifiklah tentang siapa yang akan mendapat manfaat dari presentasi atau tutorial Anda dan apa yang akan mereka pelajari. + +Memahami audiens Anda akan membantu Anda menyesuaikan konten dan memastikan bahwa Anda memberikan wawasan dan poin-poin yang berharga. + +## Manfaat untuk audiens + +Apa yang dapat diharapkan peserta dari presentasi atau tutorial Anda? Jelaskan tentang poin-poin utama yang Anda harapkan untuk diberikan. + +Ini akan membantu peserta mengevaluasi apakah presentasi Anda sesuai dengan minat dan kebutuhan mereka. + +Ini juga akan membantu Anda menyusun presentasi Anda dan tetap pada jalur untuk memberikan nilai yang dijanjikan. + +## Pengetahuan latar belakang yang diperlukan untuk memahami presentasi/tutorial + +Ketika menyusun proposal Anda, penting untuk mempertimbangkan pengetahuan latar belakang apa yang akan diperlukan audiens Anda untuk memahami dan terlibat dengan konten Anda. + +Jelaskan prasyarat apa pun, dan berikan tautan atau sumber daya yang dapat digunakan peserta untuk menyegarkan pengetahuan mereka sebelum menghadiri. + +## Perkiraan pembagian waktu tentang bagaimana materi akan dibahas + +Rincian rinci tentang bagaimana Anda berencana untuk membahas materi Anda sangat penting untuk membantu peserta memahami apa yang dapat mereka harapkan dari presentasi atau tutorial Anda. + +Dengan menguraikan struktur yang jelas dan jadwal untuk presentasi Anda, Anda akan membantu peserta tetap terlibat dan fokus pada konten Anda. Ini juga akan membantu Anda tetap pada jalur dan membahas semua poin kunci yang ingin Anda sampaikan. + +## Kesimpulan + +Kesimpulannya, proposal konferensi yang baik harus memberikan deskripsi yang jelas dan meyakinkan tentang topik, mengidentifikasi audiens target dan kebutuhan mereka, secara jelas mengkomunikasikan poin-poin utama dan pengetahuan latar belakang yang diperlukan, dan memberikan rincian rinci tentang materi. Menyertakan komponen penting ini akan meningkatkan peluang proposal Anda diterima dan memberikan presentasi yang sukses di konferensi. + +_Daftar ini memperluas poin-poin luar biasa yang dibuat oleh [konferensi Pydata Global](https://pydata.org/global2022/present/)._ diff --git a/_i18n/id/_posts/2023-03-07-find-target-audience.md b/_i18n/id/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..ae213b4312b --- /dev/null +++ b/_i18n/id/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: Bagaimana cara menentukan target audiens Anda untuk presentasi konferensi Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +Ketika berbicara tentang mengirimkan proposal untuk presentasi konferensi, penting untuk menentukan target audiens Anda. Mengetahui kepada siapa Anda berbicara dapat membantu Anda menyesuaikan presentasi Anda dengan kebutuhan, minat, dan pengetahuan latar belakang audiens. Dalam posting ini, kita akan membahas cara menentukan target audiens Anda untuk proposal konferensi dan mengapa hal itu penting. + +## Pertimbangkan Peran Pekerjaan Mereka + +Pertama, Anda perlu mempertimbangkan peran pekerjaan target audiens Anda. Apakah mereka ilmuwan data, insinyur pembelajaran mesin atau perangkat lunak, peneliti, atau yang lainnya? + +Mengetahui peran pekerjaan mereka dapat membantu Anda menentukan topik dan teknik apa yang paling relevan bagi mereka. + +Misalnya, jika Anda menyajikan teknik visualisasi data baru, ilmuwan data dan peneliti mungkin lebih tertarik pada cara kerjanya. + +Sementara itu, insinyur mungkin lebih tertarik pada bagaimana teknik tersebut dapat diimplementasikan dalam sistem yang sudah ada. + +## Pikirkan tentang Pengalaman + +Selanjutnya, pertimbangkan tingkat pengalaman target audiens Anda. Apakah mereka pemula, menengah, atau mahir dalam subjek tersebut? + +Ini akan memengaruhi bagaimana Anda menyajikan ide-ide Anda dan seberapa banyak informasi latar belakang yang Anda berikan. + +Misalnya, jika presentasi Anda tentang algoritma yang kompleks, audiens tingkat lanjut mungkin tertarik pada detail teknis dan contoh kode, sementara pemula mungkin membutuhkan penjelasan konsep yang disederhanakan untuk mengikuti presentasi. + +## Pertimbangkan Niche Sekunder + +Percayalah, saya suka berbicara tentang pembelajaran mesin. Tetapi ketika orang tidak mengenal saya, mereka tidak mungkin tertarik dengan presentasi itu. + +Namun, Anda dapat berbicara tentang "pembelajaran mesin dalam kedokteran" atau "menerapkan jaringan saraf dalam prediksi cuaca dan iklim", membuat presentasi menjadi keharusan bagi orang-orang tertentu yang mungkin melewatkan proposal tersebut. + +Ini adalah cara untuk memberi tahu target audiens Anda bahwa sebuah presentasi memang untuk mereka. + +## Mengapa kita menentukan Target Audiens kita? + +Menentukan target audiens Anda sangat penting karena dua alasan utama. + +Pertama, ini membantu Anda memfokuskan presentasi Anda pada topik yang paling relevan dan menarik bagi audiens Anda. Ini dapat membuat presentasi Anda lebih menarik dan berharga bagi peserta. + +Kedua, ini membantu calon peserta memutuskan apakah presentasi Anda sesuai dengan kebutuhan dan minat mereka. + +Jika mereka dapat dengan mudah melihat bahwa presentasi Anda menargetkan peran pekerjaan dan tingkat pengalaman mereka, mereka lebih mungkin untuk hadir dan menemukan nilai dalam presentasi Anda. + +## Pertimbangkan Konferensi itu sendiri + +Ketika menulis proposal konferensi Anda, pastikan untuk menyertakan informasi tentang target audiens Anda. + +Ini bisa sesederhana menyertakan pernyataan seperti "Presentasi ini ditargetkan untuk ilmuwan data dengan tingkat pengalaman menengah." Memberikan informasi ini dapat membantu reviewer dan peserta memahami untuk siapa presentasi Anda dan apakah itu sesuai dengan tujuan konferensi. + +## Kesimpulan + +Menentukan target audiens Anda adalah langkah penting dalam mempersiapkan presentasi konferensi. Dengan mempertimbangkan peran pekerjaan dan tingkat pengalaman audiens Anda, Anda dapat menyesuaikan presentasi Anda dengan kebutuhan dan minat mereka, membuatnya lebih menarik dan berguna bagi peserta. Pastikan untuk menyertakan informasi tentang target audiens Anda dalam proposal konferensi Anda untuk membantu reviewer dan peserta memahami untuk siapa presentasi Anda dan apakah itu cocok untuk mereka. diff --git a/_i18n/id/_posts/2023-03-08-common-pitfalls.md b/_i18n/id/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..68a060823b3 --- /dev/null +++ b/_i18n/id/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 9 Kesalahan Umum yang Membuat Proposal Presentasi Konferensi Python Anda Ditolak +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +Jika Anda berencana untuk mengirimkan proposal untuk presentasi konferensi, penting untuk mengetahui apa yang harus dihindari untuk meningkatkan peluang penerimaan Anda. Berikut adalah sembilan kesalahan umum yang perlu diwaspadai: + +## Presentasi penjualan + +Ingatlah bahwa konferensi adalah komunitas pembuat dan pengguna alat komputasi ilmiah open-source. Meskipun Anda dapat mereferensikan produk atau platform closed-source Anda, audiens akan menemukan presentasi lebih menarik jika mereka dapat mencoba teknik Anda dengan stack PyData open-source. Hindari melakukan hard sell, dan fokus pada definisi masalah, strategi yang diusulkan, dan domain bisnis sebagai gantinya. + +## Presentasi berulang + +Konferensi lebih menyukai presentasi baru dan pembicara baru. Jika presentasi Anda sudah tersedia online, kemungkinan tidak akan diterima untuk konferensi. Cobalah untuk membawa wawasan, teknik, atau perspektif baru tentang topik yang belum dibahas sebelumnya. + +## Kurangnya kejelasan + +Proposal Anda harus dengan jelas mengkomunikasikan tentang apa presentasi Anda dan apa yang dapat diharapkan peserta untuk dipelajari. Jika proposal Anda tidak jelas, bertele-tele, atau sulit diikuti, peninjau mungkin tidak dapat menentukan apakah presentasi Anda selaras dengan tujuan konferensi atau cocok untuk audiens yang dituju. + +## Kurangnya orisinalitas + +Peninjau mencari presentasi yang unik, berwawasan, dan inovatif yang menawarkan perspektif segar atau solusi baru untuk masalah umum. Jika proposal Anda membahas topik yang sudah dibahas beberapa kali atau tidak memberikan wawasan atau teknik baru, peninjau mungkin akan menolaknya. Ini tidak berarti studi kasus atau sudut pandang baru terhadap suatu masalah tidak akan diterima, tetapi perlu mempertimbangkan perspektif tambahan itu. + +## Proposal yang terlalu panjang + +Pertahankan proposal Anda sederhana dan jelas. Proposal yang baik biasanya memberikan semua informasi penting dalam 250 kata. Ini bukan batas yang ketat dan bervariasi per konferensi. Ini adalah saran untuk membantu Anda tetap fokus dan menghindari kehilangan perhatian peninjau. + +## Kurangnya relevansi + +Pastikan presentasi Anda selaras dengan tema atau fokus konferensi. Jika proposal Anda hanya berhubungan secara tangensial dengan tujuan konferensi, peninjau mungkin tidak melihat bagaimana hal itu cocok dalam gambaran yang lebih besar atau bagaimana hal itu akan bermanfaat bagi peserta. + +## Pekerjaan masa depan + +Meskipun membahas pekerjaan masa depan itu menarik dan bisa disebutkan dalam presentasi Anda, konten inti presentasi seharusnya sudah terbentuk, dan Anda harus bisa mendeskripsikannya dalam proposal Anda. Jangan terlalu mengandalkan pengumpulan data masa depan atau pembuatan prototipe masa depan karena seringkali hal-hal tidak berjalan sesuai harapan. Pastikan untuk memberikan contoh konkret dan kasus penggunaan. + +## Konten yang tidak pantas atau menyinggung + +Pertahankan bahasa dan nada Anda profesional dan penuh hormat, dan hindari topik kontroversial atau sensitif yang dapat menyinggung atau mengasingkan peserta. Proposal yang berisi konten yang tidak pantas, menyinggung, atau diskriminatif kemungkinan akan ditolak. + +## Ketidaksesuaian dengan format konferensi + +Konferensi memiliki format yang berbeda, dari lightning talk hingga workshop hingga pidato keynote. Pastikan proposal Anda selaras dengan format dan durasi konferensi dan dapat disampaikan secara efektif dalam format tersebut. Pertimbangkan peralatan, bahan, atau sumber daya apa pun yang diperlukan untuk presentasi Anda. + +Dengan menghindari kesalahan umum ini, Anda dapat meningkatkan peluang mengirimkan proposal presentasi konferensi yang sukses yang selaras dengan tujuan konferensi, relevan bagi peserta, dan memberikan wawasan atau teknik baru. diff --git a/_i18n/id/_posts/2023-03-09-what-about.md b/_i18n/id/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..2b5aa14a270 --- /dev/null +++ b/_i18n/id/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: Tentang apa sebaiknya presentasi konferensi Python saya? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Kita sering menghadapi paradoks ketika akhirnya memutuskan untuk memberikan presentasi di konferensi Python. Kita telah belajar tentang begitu banyak hal menarik. Begitu banyak yang menarik. Tapi tentang apa sebaiknya presentasi Python saya?! + +Jadi, selamat atas keputusan Anda untuk presentasi tentang Python! Anda bersemangat untuk berbagi pengetahuan dan pengalaman Anda dengan orang lain. Mari kita mulai! + +Pertama-tama, pikirkan tentang audiens Anda. Siapa yang Anda inginkan untuk menghadiri presentasi Anda? Apakah mereka pengguna Python pemula, menengah, atau tingkat lanjut? Apakah mereka memiliki minat atau masalah spesifik yang ingin mereka selesaikan menggunakan Python? Memahami keahlian dan minat audiens Anda akan membantu Anda memutuskan topik yang akan menarik bagi mereka dan membuat mereka tetap terlibat. + +Selanjutnya, pertimbangkan jenis presentasi yang ingin Anda berikan. Apakah Anda ingin mendalami topik yang kompleks atau tetap sederhana dengan tutorial praktis? Apakah Anda ingin fokus pada kemampuan matematis Python atau aplikasi praktisnya? Penting untuk memilih topik yang selaras dengan keahlian dan passion Anda serta mempertimbangkan audiens Anda. + +Setelah Anda memutuskan topik dan jenis presentasi, pikirkan tentang nada yang ingin Anda tetapkan. Apakah Anda ingin santai dan lucu atau lebih serius dan hati-hati? Tidak ada jawaban benar atau salah di sini, tetapi pastikan nada Anda sesuai untuk topik dan audiens Anda. + +Ingat, presentasi Anda bertujuan untuk mendidik dan menginspirasi orang lain tentang Python, jadi pastikan poin-poin utama Anda jelas dan berharga. Apa yang seharusnya audiens Anda pelajari atau ambil dari presentasi Anda? Bagaimana mereka dapat menerapkan apa yang telah mereka pelajari dalam proyek Python atau karir mereka? + +Singkatnya, ketika memutuskan topik presentasi Python Anda, pertimbangkan audiens Anda, jenis presentasi, dan nada yang ingin Anda tetapkan. Pastikan poin-poin utama Anda jelas dan berharga bagi audiens Anda. Dan yang terpenting, bersenang-senanglah dan bagikan passion Anda untuk Python dengan orang lain! diff --git a/_i18n/id/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/id/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..eb633ebbdfc --- /dev/null +++ b/_i18n/id/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,51 @@ +--- +title: Menjelajahi Sumber Daya Tambahan untuk Tenggat Waktu Konferensi +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +Pythondeadlin.es telah menjadi tujuan populer bagi komunitas Python untuk menemukan tenggat waktu konferensi di satu lokasi yang nyaman selama setahun terakhir. + +Namun, penting untuk mengetahui sumber daya berharga lainnya yang dapat meningkatkan pengalaman perencanaan konferensi Anda dan mendorong kolaborasi dalam komunitas Python. + +Dalam posting blog ini, kita akan mempelajari dua sumber daya yang berperan penting dalam mengumpulkan informasi konferensi dan menyatukan komunitas Python. Mari kita mulai! + +## GitHub Python-Organizers: Sumber Informasi Berharga + +[Repositori GitHub Python-Organizers](https://github.com/python-organizers/conferences) adalah sumber daya berharga bagi penyelenggara konferensi, peserta, dan pembicara. + +Ini berfungsi sebagai pusat data konferensi terpusat, menyediakan koleksi konferensi, tenggat waktu pengajuan, tanggal acara, informasi sponsor, dan detail lokasi yang terorganisir. Platform kolaboratif ini mendorong penyelenggara acara untuk berbagi informasi konferensi mereka dan berkontribusi pada akurasi dan kelengkapan data. + +Dengan memanfaatkan GitHub Python-Organizers, Anda dapat mengakses banyak pengetahuan dan berkolaborasi dengan penyelenggara lainnya. + +Baik Anda berencana untuk menghadiri atau mempresentasikan di konferensi Python, sumber daya ini memungkinkan Anda membuat keputusan yang tepat dan tetap up to date dengan tenggat waktu konferensi terbaru. + +Repositori GitHub memudahkan interaksi dan mendorong keterlibatan komunitas, mendorong individu untuk berpartisipasi aktif dalam promosi, pertumbuhan, dan keberhasilan konferensi Python di seluruh dunia. + +## Daftar Acara Python Resmi: Menyatukan Komunitas + +[Daftar acara Python resmi](https://www.python.org/events/) yang dikelola melalui mailing list Python berfungsi sebagai platform pemersatu bagi komunitas Python. + +Sumber daya komprehensif ini memberikan gambaran tentang acara Python yang akan datang, termasuk konferensi, meetup, workshop, dan lainnya. Sementara menawarkan informasi tentang tenggat waktu, situs ini juga mempromosikan kolaborasi, jaringan, dan berbagi ide dalam komunitas. + +Anda dapat berlangganan mailing list, tetapi halaman web menawarkan peta dan kalender Google yang dapat Anda langganan dengan mudah untuk mendapatkan pembaruan. Ini memungkinkan Anda memvisualisasikan dan merencanakan jadwal konferensi Anda secara lebih efektif. + +Platform inklusif ini mempertemukan penggemar Python dari berbagai latar belakang dan mendorong mereka untuk terhubung, belajar, dan berkontribusi pada ekosistem Python yang dinamis. + +## Merangkul Kolaborasi untuk Perencanaan Konferensi yang Lebih Baik + +Sementara Pythondeadlin.es tetap menjadi sumber daya berharga, penting untuk menjelajahi lanskap yang lebih luas dari agregasi informasi konferensi. + +Repositori GitHub Python-Organizers dan daftar acara Python resmi sangat penting dalam menyatukan komunitas Python dan mendorong kolaborasi. + +Dengan memanfaatkan sumber daya ini, Anda dapat tetap up to date dengan acara Python yang akan datang, terhubung dengan individu yang berpikiran sama, dan secara aktif berkontribusi pada pertumbuhan dan keberhasilan konferensi Python. Merangkul kolaborasi memungkinkan kita menciptakan konferensi yang lebih kuat dan lebih dinamis yang melayani kebutuhan dan minat beragam dari komunitas Python. + +Pastikan untuk memeriksa sumber daya berikut untuk informasi lebih lanjut: + +- [GitHub Python-Organizers](https://github.com/python-organizers/conferences) +- [Daftar Acara Python Resmi](https://www.python.org/events/) + +Dengan memanfaatkan platform ini, kita dapat tetap mendapatkan informasi tentang acara Python yang akan datang, terhubung dengan individu yang berpikiran sama, dan secara aktif berkontribusi pada keberhasilan konferensi kita. Mari berkolaborasi, berbagi pengetahuan kita, dan membangun komunitas Python yang lebih kuat. + +Bersama-sama, kita dapat membentuk masa depan acara Python dan menumbuhkan lingkungan di mana semua orang dapat belajar, berkembang, dan berhasil. diff --git a/_i18n/id/calendar/description.md b/_i18n/id/calendar/description.md new file mode 100644 index 00000000000..1b939fe010c --- /dev/null +++ b/_i18n/id/calendar/description.md @@ -0,0 +1,6 @@ +Ikhtisar PythonDeadlin.es tentang tenggat waktu dan tanggal konferensi Python dalam kalender. + +Anda dapat mengekspor **semua tenggat waktu** secara opsional ke Google Calendar atau +iCal. Kalender ini sangat bagus untuk melacak tenggat waktu yang sebenarnya! + +Atau, berlangganan **acara Python mendatang** di Google Calendar atau iCal Anda. Ini adalah "kalender acara" klasik. diff --git a/_i18n/id/dates/pretty_dates.html b/_i18n/id/dates/pretty_dates.html new file mode 100644 index 00000000000..5200552ca4f --- /dev/null +++ b/_i18n/id/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil %} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture %} +{% elsif include.start == nil %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.until" %} {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} +{% elsif include.end == nil %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign start_day = start_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.from" %} {{ start_day }} {{ start_month }} {{ start_year }}{% endcapture %} +{% else %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + + {% if start_date == end_date %} + {% assign day = start_date | date: "%-d" %} + {% assign year = start_date | date: "%Y" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture pretty_date %}{{ day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} - {{ end_day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} - {{ end_day }} {{ end_month }} {{ year }}{% endcapture %} + + {% else %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} {{ start_year }} - {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} + {% endif %} +{% endif %}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/id/footer/jesper.md b/_i18n/id/footer/jesper.md new file mode 100644 index 00000000000..c98cece628d --- /dev/null +++ b/_i18n/id/footer/jesper.md @@ -0,0 +1 @@ +Jesper Dramsch adalah pencipta ML.recipes, data-science-gui.de, Late to the Party 🎉 dan Komunitas Latent Space. diff --git a/_i18n/id/footer/maintainer.md b/_i18n/id/footer/maintainer.md new file mode 100644 index 00000000000..61e6a2568d0 --- /dev/null +++ b/_i18n/id/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

Dibuat oleh Jesper Dramsch • Open Source • Berbasis Komunitas

+

Terinspirasi oleh aideadlin.es • Mengarsipkan {{confs | size}} konferensi Python sejak 2022

diff --git a/_i18n/id/footer/terms.md b/_i18n/id/footer/terms.md new file mode 100644 index 00000000000..1099c56d7b1 --- /dev/null +++ b/_i18n/id/footer/terms.md @@ -0,0 +1,3 @@ +

Tidak ada jaminan kebenaran, mohon perbaiki kesalahan dengan mengajukan permintaan penarikan.

+ +PersyaratanKebijakan Privasi diff --git a/_i18n/id/formatter/countries.html b/_i18n/id/formatter/countries.html new file mode 100644 index 00000000000..35f417d4d45 --- /dev/null +++ b/_i18n/id/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: 'Afghanistan', code: 'AFG', flag: '🇦🇫' }, +{ name: 'Albania', code: 'ALB', flag: '🇦🇱' }, +{ name: 'Aljazair', code: 'DZA', flag: '🇩🇿' }, +{ name: 'Andorra', code: 'AND', flag: '🇦🇩' }, +{ name: 'Angola', code: 'AGO', flag: '🇦🇴' }, +{ name: 'Antigua dan Barbuda', code: 'ATG', flag: '🇦🇬' }, +{ name: 'Argentina', code: 'ARG', flag: '🇦🇷' }, +{ name: 'Armenia', code: 'ARM', flag: '🇦🇲' }, +{ name: 'Australia', code: 'AUS', flag: '🇦🇺' }, +{ name: 'Austria', code: 'AUT', flag: '🇦🇹' }, +{ name: 'Azerbaijan', code: 'AZE', flag: '🇦🇿' }, +{ name: 'Bahama', code: 'BHS', flag: '🇧🇸' }, +{ name: 'Bahrain', code: 'BHR', flag: '🇧🇭' }, +{ name: 'Bangladesh', code: 'BGD', flag: '🇧🇩' }, +{ name: 'Barbados', code: 'BRB', flag: '🇧🇧' }, +{ name: 'Belarus', code: 'BLR', flag: '🇧🇾' }, +{ name: 'Belgia', code: 'BEL', flag: '🇧🇪' }, +{ name: 'Belize', code: 'BLZ', flag: '🇧🇿' }, +{ name: 'Benin', code: 'BEN', flag: '🇧🇯' }, +{ name: 'Bhutan', code: 'BTN', flag: '🇧🇹' }, +{ name: 'Bolivia', code: 'BOL', flag: '🇧🇴' }, +{ name: 'Bosnia dan Herzegovina', code: 'BIH', flag: '🇧🇦' }, +{ name: 'Botswana', code: 'BWA', flag: '🇧🇼' }, +{ name: 'Brasil', code: 'BRA', flag: '🇧🇷' }, +{ name: 'Brunei', code: 'BRN', flag: '🇧🇳' }, +{ name: 'Bulgaria', code: 'BGR', flag: '🇧🇬' }, +{ name: 'Burkina Faso', code: 'BFA', flag: '🇧🇫' }, +{ name: 'Burundi', code: 'BDI', flag: '🇧🇮' }, +{ name: 'Kamboja', code: 'KHM', flag: '🇰🇭' }, +{ name: 'Kamerun', code: 'CMR', flag: '🇨🇲' }, +{ name: 'Kanada', code: 'CAN', flag: '🇨🇦' }, +{ name: 'Tanjung Verde', code: 'CPV', flag: '🇨🇻' }, +{ name: 'Republik Afrika Tengah', code: 'CAF', flag: '🇨🇫' }, +{ name: 'Chad', code: 'TCD', flag: '🇹🇩' }, +{ name: 'Chili', code: 'CHL', flag: '🇨🇱' }, +{ name: 'Tiongkok', code: 'CHN', flag: '🇨🇳' }, +{ name: 'Kolombia', code: 'COL', flag: '🇨🇴' }, +{ name: 'Komoro', code: 'COM', flag: '🇰🇲' }, +{ name: 'Kongo', code: 'COG', flag: '🇨🇬' }, +{ name: 'Kosta Rika', code: 'CRI', flag: '🇨🇷' }, +{ name: 'Kroasia', code: 'HRV', flag: '🇭🇷' }, +{ name: 'Kuba', code: 'CUB', flag: '🇨🇺' }, +{ name: 'Siprus', code: 'CYP', flag: '🇨🇾' }, +{ name: 'Republik Ceko', code: 'CZE', flag: '🇨🇿' }, +{ name: 'Denmark', code: 'DNK', flag: '🇩🇰' }, +{ name: 'Djibouti', code: 'DJI', flag: '🇩🇯' }, +{ name: 'Dominika', code: 'DMA', flag: '🇩🇲' }, +{ name: 'Republik Dominika', code: 'DOM', flag: '🇩🇴' }, +{ name: 'Ekuador', code: 'ECU', flag: '🇪🇨' }, +{ name: 'Mesir', code: 'EGY', flag: '🇪🇬' }, +{ name: 'El Salvador', code: 'SLV', flag: '🇸🇻' }, +{ name: 'Guinea Khatulistiwa', code: 'GNQ', flag: '🇬🇶' }, +{ name: 'Eritrea', code: 'ERI', flag: '🇪🇷' }, +{ name: 'Estonia', code: 'EST', flag: '🇪🇪' }, +{ name: 'Etiopia', code: 'ETH', flag: '🇪🇹' }, +{ name: 'Fiji', code: 'FJI', flag: '🇫🇯' }, +{ name: 'Finlandia', code: 'FIN', flag: '🇫🇮' }, +{ name: 'Prancis', code: 'FRA', flag: '🇫🇷' }, +{ name: 'Gabon', code: 'GAB', flag: '🇬🇦' }, +{ name: 'Gambia', code: 'GMB', flag: '🇬🇲' }, +{ name: 'Georgia', code: 'GEO', flag: '🇬🇪' }, +{ name: 'Jerman', code: 'DEU', flag: '🇩🇪' }, +{ name: 'Ghana', code: 'GHA', flag: '🇬🇭' }, +{ name: 'Yunani', code: 'GRC', flag: '🇬🇷' }, +{ name: 'Grenada', code: 'GRD', flag: '🇬🇩' }, +{ name: 'Guatemala', code: 'GTM', flag: '🇬🇹' }, +{ name: 'Guinea', code: 'GIN', flag: '🇬🇳' }, +{ name: 'Guinea-Bissau', code: 'GNB', flag: '🇬🇼' }, +{ name: 'Guyana', code: 'GUY', flag: '🇬🇾' }, +{ name: 'Haiti', code: 'HTI', flag: '🇭🇹' }, +{ name: 'Honduras', code: 'HND', flag: '🇭🇳' }, +{ name: 'Hungaria', code: 'HUN', flag: '🇭🇺' }, +{ name: 'Islandia', code: 'ISL', flag: '🇮🇸' }, +{ name: 'India', code: 'IND', flag: '🇮🇳' }, +{ name: 'Indonesia', code: 'IDN', flag: '🇮🇩' }, +{ name: 'Iran', code: 'IRN', flag: '🇮🇷' }, +{ name: 'Irak', code: 'IRQ', flag: '🇮🇶' }, +{ name: 'Irlandia', code: 'IRL', flag: '🇮🇪' }, +{ name: 'Israel', code: 'ISR', flag: '🇮🇱' }, +{ name: 'Italia', code: 'ITA', flag: '🇮🇹' }, +{ name: 'Jamaika', code: 'JAM', flag: '🇯🇲' }, +{ name: 'Jepang', code: 'JPN', flag: '🇯🇵' }, +{ name: 'Yordania', code: 'JOR', flag: '🇯🇴' }, +{ name: 'Kazakhstan', code: 'KAZ', flag: '🇰🇿' }, +{ name: 'Kenya', code: 'KEN', flag: '🇰🇪' }, +{ name: 'Kiribati', code: 'KIR', flag: '🇰🇮' }, +{ name: 'Korea Utara', code: 'PRK', flag: '🇰🇵' }, +{ name: 'Korea Selatan', code: 'KOR', flag: '🇰🇷' }, +{ name: 'Kuwait', code: 'KWT', flag: '🇰🇼' }, +{ name: 'Kirgizstan', code: 'KGZ', flag: '🇰🇬' }, +{ name: 'Laos', code: 'LAO', flag: '🇱🇦' }, +{ name: 'Latvia', code: 'LVA', flag: '🇱🇻' }, +{ name: 'Lebanon', code: 'LBN', flag: '🇱🇧' }, +{ name: 'Lesotho', code: 'LSO', flag: '🇱🇸' }, +{ name: 'Liberia', code: 'LBR', flag: '🇱🇷' }, +{ name: 'Libya', code: 'LBY', flag: '🇱🇾' }, +{ name: 'Liechtenstein', code: 'LIE', flag: '🇱🇮' }, +{ name: 'Lituania', code: 'LTU', flag: '🇱🇹' }, +{ name: 'Luksemburg', code: 'LUX', flag: '🇱🇺' }, +{ name: 'Makedonia', code: 'MKD', flag: '🇲🇰' }, +{ name: 'Madagaskar', code: 'MDG', flag: '🇲🇬' }, +{ name: 'Malawi', code: 'MWI', flag: '🇲🇼' }, +{ name: 'Malaysia', code: 'MYS', flag: '🇲🇾' }, +{ name: 'Maladewa', code: 'MDV', flag: '🇲🇻' }, +{ name: 'Mali', code: 'MLI', flag: '🇲🇱' }, +{ name: 'Malta', code: 'MLT', flag: '🇲🇹' }, +{ name: 'Kepulauan Marshall', code: 'MHL', flag: '🇲🇭' }, +{ name: 'Mauritania', code: 'MRT', flag: '🇲🇷' }, +{ name: 'Mauritius', code: 'MUS', flag: '🇲🇺' }, +{ name: 'Meksiko', code: 'MEX', flag: '🇲🇽' }, +{ name: 'Mikronesia', code: 'FSM', flag: '🇫🇲' }, +{ name: 'Moldova', code: 'MDA', flag: '🇲🇩' }, +{ name: 'Monako', code: 'MCO', flag: '🇲🇨' }, +{ name: 'Mongolia', code: 'MNG', flag: '🇲🇳' }, +{ name: 'Montenegro', code: 'MNE', flag: '🇲🇪' }, +{ name: 'Maroko', code: 'MAR', flag: '🇲🇦' }, +{ name: 'Mozambik', code: 'MOZ', flag: '🇲🇿' }, +{ name: 'Myanmar', code: 'MMR', flag: '🇲🇲' }, +{ name: 'Namibia', code: 'NAM', flag: '🇳🇦' }, +{ name: 'Nauru', code: 'NRU', flag: '🇳🇷' }, +{ name: 'Nepal', code: 'NPL', flag: '🇳🇵' }, +{ name: 'Belanda', code: 'NLD', flag: '🇳🇱' }, +{ name: 'Selandia Baru', code: 'NZL', flag: '🇳🇿' }, +{ name: 'Nikaragua', code: 'NIC', flag: '🇳🇮' }, +{ name: 'Niger', code: 'NER', flag: '🇳🇪' }, +{ name: 'Nigeria', code: 'NGA', flag: '🇳🇬' }, +{ name: 'Norwegia', code: 'NOR', flag: '🇳🇴' }, +{ name: 'Oman', code: 'OMN', flag: '🇴🇲' }, +{ name: 'Pakistan', code: 'PAK', flag: '🇵🇰' }, +{ name: 'Palau', code: 'PLW', flag: '🇵🇼' }, +{ name: 'Panama', code: 'PAN', flag: '🇵🇦' }, +{ name: 'Papua Nugini', code: 'PNG', flag: '🇵🇬' }, +{ name: 'Paraguay', code: 'PRY', flag: '🇵🇾' }, +{ name: 'Peru', code: 'PER', flag: '🇵🇪' }, +{ name: 'Filipina', code: 'PHL', flag: '🇵🇭' }, +{ name: 'Polandia', code: 'POL', flag: '🇵🇱' }, +{ name: 'Portugal', code: 'PRT', flag: '🇵🇹' }, +{ name: 'Qatar', code: 'QAT', flag: '🇶🇦' }, +{ name: 'Rumania', code: 'ROU', flag: '🇷🇴' }, +{ name: 'Rusia', code: 'RUS', flag: '🇷🇺' }, +{ name: 'Rwanda', code: 'RWA', flag: '🇷🇼' }, +{ name: 'Saint Kitts dan Nevis', code: 'KNA', flag: '🇰🇳' }, +{ name: 'Saint Lucia', code: 'LCA', flag: '🇱🇨' }, +{ name: 'Saint Vincent dan Grenadines', code: 'VCT', flag: '🇻🇨' }, +{ name: 'Samoa', code: 'WSM', flag: '🇼🇸' }, +{ name: 'San Marino', code: 'SMR', flag: '🇸🇲' }, +{ name: 'Sao Tome dan Principe', code: 'STP', flag: '🇸🇹' }, +{ name: 'Arab Saudi', code: 'SAU', flag: '🇸🇦' }, +{ name: 'Senegal', code: 'SEN', flag: '🇸🇳' }, +{ name: 'Serbia', code: 'SRB', flag: '🇷🇸' }, +{ name: 'Seychelles', code: 'SYC', flag: '🇸🇨' }, +{ name: 'Sierra Leone', code: 'SLE', flag: '🇸🇱' }, +{ name: 'Singapura', code: 'SGP', flag: '🇸🇬' }, +{ name: 'Slovakia', code: 'SVK', flag: '🇸🇰' }, +{ name: 'Slovenia', code: 'SVN', flag: '🇸🇮' }, +{ name: 'Kepulauan Solomon', code: 'SLB', flag: '🇸🇧' }, +{ name: 'Somalia', code: 'SOM', flag: '🇸🇴' }, +{ name: 'Afrika Selatan', code: 'ZAF', flag: '🇿🇦' }, +{ name: 'Sudan Selatan', code: 'SSD', flag: '🇸🇸' }, +{ name: 'Spanyol', code: 'ESP', flag: '🇪🇸' }, +{ name: 'Sri Lanka', code: 'LKA', flag: '🇱🇰' }, +{ name: 'Sudan', code: 'SDN', flag: '🇸🇩' }, +{ name: 'Suriname', code: 'SUR', flag: '🇸🇷' }, +{ name: 'Swaziland', code: 'SWZ', flag: '🇸🇿' }, +{ name: 'Swedia', code: 'SWE', flag: '🇸🇪' }, +{ name: 'Swiss', code: 'CHE', flag: '🇨🇭' }, +{ name: 'Suriah', code: 'SYR', flag: '🇸🇾' }, +{ name: 'Taiwan', code: 'TWN', flag: '🇹🇼' }, +{ name: 'Tajikistan', code: 'TJK', flag: '🇹🇯' }, +{ name: 'Tanzania', code: 'TZA', flag: '🇹🇿' }, +{ name: 'Thailand', code: 'THA', flag: '🇹🇭' }, +{ name: 'Timor-Leste', code: 'TLS', flag: '🇹🇱' }, +{ name: 'Togo', code: 'TGO', flag: '🇹🇬' }, +{ name: 'Tonga', code: 'TON', flag: '🇹🇴' }, +{ name: 'Trinidad dan Tobago', code: 'TTO', flag: '🇹🇹' }, +{ name: 'Tunisia', code: 'TUN', flag: '🇹🇳' }, +{ name: 'Turki', code: 'TUR', flag: '🇹🇷' }, +{ name: 'Turkmenistan', code: 'TKM', flag: '🇹🇲' }, +{ name: 'Tuvalu', code: 'TUV', flag: '🇹🇻' }, +{ name: 'Uganda', code: 'UGA', flag: '🇺🇬' }, +{ name: 'Ukraina', code: 'UKR', flag: '🇺🇦' }, +{ name: 'Uni Emirat Arab', code: 'ARE', flag: '🇦🇪' }, +{ name: 'Inggris', code: 'GBR', flag: '🇬🇧' }, +{ name: 'Amerika Serikat', code: 'USA', flag: '🇺🇸' }, +{ name: 'Uruguay', code: 'URY', flag: '🇺🇾' }, +{ name: 'Uzbekistan', code: 'UZB', flag: '🇺🇿' }, +{ name: 'Vanuatu', code: 'VUT', flag: '🇻🇺' }, +{ name: 'Kota Vatikan', code: 'VAT', flag: '🇻🇦' }, +{ name: 'Venezuela', code: 'VEN', flag: '🇻🇪' }, +{ name: 'Vietnam', code: 'VNM', flag: '🇻🇳' }, +{ name: 'Yaman', code: 'YEM', flag: '🇾🇪' }, +{ name: 'Zambia', code: 'ZMB', flag: '🇿🇲' }, +{ name: 'Zimbabwe', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/id/formatter/submission.html b/_i18n/id/formatter/submission.html new file mode 100644 index 00000000000..2a03e9aabb4 --- /dev/null +++ b/_i18n/id/formatter/submission.html @@ -0,0 +1,55 @@ +
+
Cara Mengirimkan Informasi Konferensi Anda
+ +
+
1. Format CSV Python-Organizers
+

+ Tambahkan konferensi Anda ke repositori + python-organizers/conferences: +

+
    +
  • Fork repositori tersebut
  • +
  • Edit file CSV tahun yang sesuai
  • +
  • Tambahkan baris data konferensi Anda
  • +
  • Kirim pull request
  • +
+
+ +
+
2. Format YAML PythonDeadlin.es
+

+ Tambahkan konferensi Anda ke + jesperdramsch/python-deadlines: +

+
    +
  • Fork repositori tersebut
  • +
  • Edit file `_data/conferences.yml`
  • +
  • Tambahkan data YAML konferensi Anda di tempat yang sesuai
  • +
  • Kirim pull request
  • +
+
+ +
+
3. Format Kalender Python.org
+

Kirim konferensi Anda ke kalender acara Python resmi:

+
    +
  • + Email ke + + href="mailto:events@python.org" + >events[at]python.org + dengan teks format kalender +
  • +
  • Sertakan subjek email: "Python Event Submission: [Nama Konferensi Anda]"
  • +
  • Tunggu konfirmasi dari tim acara Python
  • +
+
+ +
+ Tip: Kirim ke ketiga platform untuk memaksimalkan visibilitas + konferensi Python Anda! +
+
diff --git a/_i18n/id/frontpage/description.md b/_i18n/id/frontpage/description.md new file mode 100644 index 00000000000..f4e0bfbc282 --- /dev/null +++ b/_i18n/id/frontpage/description.md @@ -0,0 +1,5 @@ +Alat komunitas ini berfungsi sebagai repositori pusat untuk tenggat waktu panggilan partisipasi, proposal, lokakarya, dan tutorial di konferensi Python. + +Tanggal-tanggal tersebut tersedia sebagai hitungan mundur, dalam zona waktu lokal, dan bahkan sebagai kalender Google di bawah ini! + +Tenggat waktu ditampilkan dalam waktu lokal Anda. Untuk melihatnya dalam zona waktu situs web konferensi, klik konferensi. diff --git a/_i18n/id/frontpage/hook.md b/_i18n/id/frontpage/hook.md new file mode 100644 index 00000000000..af16b0da48e --- /dev/null +++ b/_i18n/id/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es mengkurasi konferensi Python favorit Anda. diff --git a/_i18n/id/maps/description.md b/_i18n/id/maps/description.md new file mode 100644 index 00000000000..216e1235f88 --- /dev/null +++ b/_i18n/id/maps/description.md @@ -0,0 +1,3 @@ +Ikhtisar tenggat waktu dan tanggal konferensi pada peta. + +Berikut ini adalah semua konferensi Python mendatang yang tercantum di PythonDeadlin.es dalam format spasial yang bagus. diff --git a/_i18n/id/resources/description.md b/_i18n/id/resources/description.md new file mode 100644 index 00000000000..64131f48f39 --- /dev/null +++ b/_i18n/id/resources/description.md @@ -0,0 +1,5 @@ +Halaman ini didedikasikan untuk membantu Anda menyusun Call for Proposals (CfP) yang luar biasa untuk konferensi Python. Di sini, Anda akan menemukan kumpulan posting blog, panduan, dan kiat tentang penulisan proposal yang menarik. + +Sumber daya kami mencakup berbagai aspek penulisan CfP, mulai dari memilih topik hingga menyusun pengajuan Anda. Baik Anda pembicara baru atau presenter berpengalaman, alat-alat ini bertujuan untuk meningkatkan keterampilan menulis proposal Anda. + +Jelajahi konten pilihan kami untuk meningkatkan peluang Anda agar ceramah atau lokakarya Anda diterima di acara-acara Python di seluruh dunia. diff --git a/_i18n/id/search/description.md b/_i18n/id/search/description.md new file mode 100644 index 00000000000..2e037850384 --- /dev/null +++ b/_i18n/id/search/description.md @@ -0,0 +1,5 @@ +Hasil pencarian dari basis data lengkap kami tentang tenggat waktu dan acara konferensi Python. Hasilnya disajikan sebagai daftar halaman relevan yang sesuai dengan kueri Anda. + +Setiap hasil mencakup detail utama seperti nama konferensi, tanggal tenggat waktu, dan deskripsi singkat. Tenggat waktu ditampilkan dalam zona waktu lokal Anda. + +Klik nama konferensi untuk melihat informasi lebih rinci, termasuk panduan dan tautan ke situs web konferensi resmi. diff --git a/_i18n/id/series/description.md b/_i18n/id/series/description.md new file mode 100644 index 00000000000..06be4a4d232 --- /dev/null +++ b/_i18n/id/series/description.md @@ -0,0 +1,4 @@ +Bagian alat komunitas ini berfungsi sebagai direktori lengkap rangkaian konferensi Python yang berulang. Di sini, Anda akan menemukan ikhtisar acara rutin, jadwal tipikal, dan informasi historis. + +Rangkaian ini disajikan dengan deskripsi singkat dan tautan ke acara sebelumnya, yang membantu Anda merencanakan partisipasi konferensi jangka panjang. +Lihat rangkaian untuk melihat detail selengkapnya dan mengakses informasi tentang acara mendatang dan sebelumnya. diff --git a/_i18n/id/trademark/django.md b/_i18n/id/trademark/django.md new file mode 100644 index 00000000000..5a75d0d45a9 --- /dev/null +++ b/_i18n/id/trademark/django.md @@ -0,0 +1,2 @@ +

Django adalah merek dagang terdaftar dari Django Software Foundation. Situs web ini, pythondeadlin.es, tidak berafiliasi dengan, didukung oleh, atau disponsori oleh Django Software Foundation atau acara Django mana pun. Semua merek dagang dan logo yang digunakan di situs ini tetap menjadi milik pemiliknya masing-masing. Setiap referensi ke Django atau merek dagang lainnya hanya untuk tujuan informasi dan tidak menyiratkan hubungan dengan pemegang merek dagang.

+

Untuk informasi lebih lanjut tentang Django Software Foundation dan merek dagangnya, kunjungi https://www.djangoproject.com/foundation/.

diff --git a/_i18n/id/trademark/generic.md b/_i18n/id/trademark/generic.md new file mode 100644 index 00000000000..3166a72e2d4 --- /dev/null +++ b/_i18n/id/trademark/generic.md @@ -0,0 +1 @@ +

Setiap penggunaan merek dagang atau logo yang ditetapkan oleh acara yang tercantum di situs ini hanya untuk tujuan informasi dan tidak menyiratkan hubungan dengan pemegang merek dagang masing-masing. Jika Anda adalah pemegang merek dagang dan ingin merek dagang Anda dihapus dari situs ini, silakan hubungi kami.

diff --git a/_i18n/id/trademark/pycon.md b/_i18n/id/trademark/pycon.md new file mode 100644 index 00000000000..fcfffa1a2a3 --- /dev/null +++ b/_i18n/id/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon, dan PyLadies adalah merek dagang terdaftar dari Python Software Foundation. Situs web ini, pythondeadlin.es, tidak berafiliasi dengan, didukung oleh, atau disponsori oleh Python Software Foundation atau acara PyCon mana pun. Semua merek dagang dan logo yang digunakan di situs ini tetap menjadi milik pemiliknya masing-masing. Setiap referensi ke PyCon atau merek dagang lainnya hanya untuk tujuan informasi dan tidak menyiratkan hubungan dengan pemegang merek dagang.

diff --git a/_i18n/id/trademark/pydata.md b/_i18n/id/trademark/pydata.md new file mode 100644 index 00000000000..d3bdc688493 --- /dev/null +++ b/_i18n/id/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS, PyData, and Fiscally Sponsored Projects are registered trademarks of NumFOCUS. This website, pythondeadlin.es, is not affiliated with, endorsed by, or sponsored by the NumFOCUS or any PyData or affiliated event. All trademarks and logos used on this site remain the property of their respective owners. Any reference to NumFOCUS, PyData, or other trademarks is for informational purposes only and does not imply association with the trademark holders.

diff --git a/_i18n/pt-br.yml b/_i18n/pt-br.yml new file mode 100644 index 00000000000..b4d75673e8a --- /dev/null +++ b/_i18n/pt-br.yml @@ -0,0 +1,246 @@ +--- +global: + current: 'pt-br' + choose: 'Escolher idioma' + sub_filter: 'Filtrar por subcategoria:' + en: 'English' + es: 'Español' + de: 'Deutsch' + fr: 'Français' + pt-br: 'Português' + zh-cn: '中文' + cfp: 'Chamada para participação' + cfp_ext: 'CfP estendido de' + subscribe: 'Inscrever-se' +titles: + default: 'Prazos de Conferências Python' + archive: 'Conferências Python anteriores' + visit_archive: 'Visitar o arquivo' + calendar: 'Calendário de prazos e datas de conferências Python' + map: 'Mapa de conferências Python' + a404: 'Página não encontrada' + privacy: 'Política de privacidade' + resources: 'Recursos para escrever CfPs excelentes' + series: 'Lista de séries de eventos Python' + impressum: 'Termos e condições' + past_events: 'Eventos passados' + past_cfps: 'Chamadas para participação passadas' + search: 'Pesquisar' + about: 'Sobre os prazos de conferências Python' + languages: 'Idiomas disponíveis' + formatter: 'Formatador de prazos de conferências' +buttons: + ical: Obter o iCal + google: Adicionar ao Google Calendar + github: Enviar uma conferência no GitHub + all_selected: Todas as conferências selecionadas + none_selected: Nenhuma conferência selecionada +description: + summary: 'Resumo da conferência e suas instâncias ao longo dos anos.' +header: + countdown: 'Contagens regressivas' + calendar: 'Calendário' + maps: 'Mapa' + series: 'Séries' + resources: 'Recursos' + formatter: 'Formatação App' + course: 'Curso por Email' + articles: 'Começando' +conference: + title: 'Prazos de conferências' + finaid: 'Auxílio financeiro' + sponsor: 'Oportunidade de patrocínio' + all: 'Todas as conferências para' + download_dl: 'Baixar prazo da conferência' + download_date: 'Baixar datas da conferência' + deadline_tz_theirs: 'Prazo no fuso horário do site da conferência' + deadline_tz_local: "Prazo no seu fuso horário local " +summary: + title: 'Resumo da conferência' +subs: + PY: 'Python geral' + SCIPY: 'Python científico' + DATA: 'Python para dados' + WEB: 'Python para web' + BIZ: 'Python para negócios' + GEO: 'Python para a Terra' + CAMP: 'Acampamentos Python' + DAY: 'Dia Python' +series: + always: 'Sempre realizada em' + place: + last: 'Última conferência em' + next: 'Próxima conferência em' + year: + last: 'Último ano realizado em' + next: 'Próximo ano em' +times: + tba: "A definir" + from: "De" + until: "Até" + normal: + days: 'dias' + hours: 'horas' + minutes: 'minutos' + seconds: 'segundos' + short: + days: 'd' + hours: 'h' + minutes: 'm' + seconds: 's' + months: + January: 'janeiro' + February: 'fevereiro' + March: 'março' + April: 'abril' + May: 'maio' + June: 'junho' + July: 'julho' + August: 'agosto' + September: 'setembro' + October: 'outubro' + November: 'novembro' + December: 'dezembro' +social: + twitter: 'Tweetar conferência' + facebook: 'Compartilhar conferência no FB' + linkedin: 'Compartilhar conferência no LinkedIn' + whatsapp: 'Enviar conferência no WhatsApp' + email: 'Enviar conferência por email' +search: + no-results: 'Nenhum resultado encontrado.' + error: 'Erro ao carregar o índice de pesquisa. Por favor, tente novamente mais tarde.' +about: + toggle_fullscreen: "Alternar modo de apresentação em tela cheia" + previous_slide: "Slide anterior" + next_slide: "Próximo slide" + tagline: "Nunca mais perca um prazo de conferência Python!" + hero_description: "A plataforma impulsionada pela comunidade que ajuda desenvolvedores Python a descobrir, acompanhar e enviar propostas para conferências em todo o mundo." + problem: + title: "O desafio" + description: "Acompanhar prazos de conferências Python em diferentes sites, fusos horários e formatos é demorado e propenso a erros. Muitos desenvolvedores perdem oportunidades de compartilhar seus conhecimentos porque descobrem as CFPs tarde demais." + solution: + title: "Nossa solução" + description: "O Pythondeadlin.es consolida todos os prazos de conferências Python em um só lugar, com conversão automática de fuso horário, múltiplas opções de lembrete e detalhes abrangentes para ajudar você a planejar suas submissões de forma eficaz." + features: + title: "Recursos principais" + tracking: + title: "Acompanhamento abrangente" + description: "Mantenha-se atualizado sobre cada prazo de Chamada para Propostas (CfP) para conferências Python em todo o mundo com temporizadores de contagem regressiva personalizados em seu fuso horário local." + notifications: + title: "Notificações flexíveis" + description: "Escolha como deseja ser lembrado — inscreva-se via iCal, Google Calendar ou feed RSS para receber alertas oportunos que se adaptem ao seu fluxo de trabalho." + coverage: + title: "Cobertura global" + description: "Descubra eventos Python, desde PyCon até PyData, em seis continentes com nossa visualização interativa de mapa e visão geral abrangente do calendário." + language: + title: "Suporte multilíngue" + description: "Acesse a plataforma em inglês, espanhol, alemão, francês, português brasileiro ou chinês simplificado, tornando as conferências Python acessíveis a desenvolvedores de diversas origens linguísticas." + community: + title: "Impulsionado pela comunidade" + description: "Beneficie-se de nossa abordagem de código aberto onde a comunidade Python mantém colaborativamente informações precisas e atualizadas sobre conferências." + mobile: + title: "Amigável para dispositivos móveis" + description: "Verifique prazos em qualquer lugar com nosso design responsivo que se adapta perfeitamente a qualquer dispositivo — perfeito para desenvolvedores ocupados." + categories: + title: "Categorias de conferências" + intro: "Acompanhamos conferências Python em várias especializações:" + stats: + title: "Em números" + conferences: + label: "Conferências rastreadas" + description: "Banco de dados abrangente de eventos Python em todo o mundo" + categories: + label: "Categorias de conferências" + description: "De Python geral a nichos especializados" + guides: + label: "Guias de recursos" + description: "Guias abrangentes para palestrantes iniciantes e experientes" + countries: + label: "Países distintos" + description: "Conferências Python de todo o mundo" + languages: + label: "Idiomas" + description: "Tornando as conferências Python acessíveis globalmente" + testimonials: + title: "O que os usuários dizem" + first: + quote: "\"Graças ao Pythondeadlin.es, consegui enviar minha primeira proposta de palestra com bastante tempo para me preparar. O site se tornou uma ferramenta essencial no meu desenvolvimento profissional.\"" + author: "— Desenvolvedor Python" + second: + quote: "\"Como organizador de conferência, aprecio que nosso evento seja representado com precisão. A plataforma nos ajudou a alcançar um público mais amplo de potenciais palestrantes.\"" + author: "— Organizador de PyCon" + third: + quote: "\"Agora mostramos regularmente o PythonDeadlin.es em nosso Meetup para acompanhar as conferências que possam interessar aos nossos participantes.\"" + author: "— Organizador de Meetup" + use_cases: + title: "Como as pessoas usam o Pythondeadlin.es" + first_time: + title: "Palestrantes de primeira viagem" + description: "Descubra conferências amigáveis para iniciantes com tempo suficiente para preparar uma proposta convincente e use a seção de recursos para inspiração e orientação." + frequent: + title: "Apresentadores frequentes" + description: "Planeje sua agenda anual de palestras e priorize os prazos de submissão em vários eventos." + organizers: + title: "Organizadores de conferências" + description: "Garanta que seu evento alcance palestrantes em potencial adicionando sua conferência ao nosso banco de dados." + cta: + title: "Comece a acompanhar os prazos de conferências hoje" + description: "Junte-se à comunidade Python para ficar por dentro das oportunidades de conferências. Escaneie o código QR ou visite pythondeadlin.es para começar." + visit_button: "Visitar site" + github_button: "Contribuir no GitHub" + qr_alt: "Código QR para pythondeadlin.es" +languages: + native_speaker: 'Falante nativo' + language_learner: 'Aprendiz de idiomas' + ai_translated: 'Traduzido por IA' + switch_to: 'Mudar' + translated_by: 'Traduzido por:' + legend: 'Legenda' +formatter: + description: 'Enviar prazos de conferências Python em vários formatos' + basic: + title: 'Informações básicas' + name: 'Nome da conferência' + year: 'Ano' + type: 'Tipo de conferência' + attendees: 'Participantes esperados' + url: 'URL do site' + location_date: + title: 'Local e data' + city: 'Cidade' + city_help: 'Digite apenas o nome da cidade' + country: 'País' + country_help: 'Comece a digitar para ver países correspondentes com bandeiras' + venue: 'Local' + extra_places: "Locais extras" + extra_help: "Para eventos híbridos ou online, adicione locais extras separados por vírgula aqui." + start_date: 'Data de início' + end_date: 'Data de término' + timezone: 'Fuso horário' + timezone_help: 'Comece a digitar para selecionar o fuso horário da conferência' + cfp: + title: 'Chamada de trabalhos' + status: 'Status da CfP' + tba: 'A ser anunciado' + none: 'Sem CfP' + date: 'Usar data' + deadline: 'Prazo de submissão' + deadline_help: 'O prazo para enviar propostas de palestras' + link: 'Link da CfP' + additional_info: + title: 'Informações adicionais' + sponsor: 'URL de patrocínio' + finaid: 'URL de auxílio financeiro' + mastodon: 'URL do Mastodon' + bsky: 'URL do Bluesky' + notes: 'Notas adicionais' + notes_place: 'Notas adicionais sobre a conferência' + submission_guidelines: 'Diretrizes de submissão' + generate_output: 'Gerar formato' + generated_outputs: 'Formatos gerados' + csv_format: 'Formato CSV' + yaml_format: 'Formato YAML' + calendar_format: 'Formato de calendário' + copy: 'Copiar para a área de transferência' + required: 'Por favor, preencha todos os campos obrigatórios marcados com *.' diff --git a/_i18n/pt-br/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/pt-br/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..9625826ec18 --- /dev/null +++ b/_i18n/pt-br/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: Como conseguir palestrar em conferências Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +Conferências Python são uma excelente plataforma para compartilhar conhecimento, fazer networking com colegas e se manter atualizado com os últimos desenvolvimentos na comunidade Python. Se você é apaixonado por Python e quer compartilhar seus insights com um público mais amplo, falar em uma conferência Python pode ser uma ótima oportunidade. Neste post do blog, vamos explorar como conseguir palestrar em conferências Python. + +### Ser convidado + +Uma maneira de ser convidado para falar em conferências Python é ter uma reputação estabelecida na comunidade. Suponha que você tenha contribuído para projetos de código aberto, escrito artigos ou posts de blog sobre Python, ou falado em encontros ou eventos menores. Nesse caso, você pode chamar a atenção dos organizadores de conferências. + +Além disso, se você é especialista em um campo específico, como aprendizado de máquina ou desenvolvimento web, pode ser convidado para falar em conferências focadas nesses tópicos. Para aumentar suas chances de ser convidado, participe de conferências e encontros, participe de discussões online e contribua para a comunidade Python de qualquer maneira possível. + +### Enviar uma proposta para uma Chamada de Propostas (CfP) + +Outra maneira de conseguir falar em conferências Python é enviar uma proposta para uma Chamada de Propostas (CfP). A maioria das conferências abre CfPs vários meses antes do evento, e qualquer pessoa pode enviar uma proposta. +Ao enviar uma proposta, é essencial lembrar que os organizadores de conferências buscam palestras originais e envolventes que atraiam um público diversificado. Certifique-se de que seu envio seja bem escrito, claro e conciso, e aborde um tópico relevante e interessante para a comunidade Python. + +Aqui estão algumas dicas para enviar uma proposta bem-sucedida: + +- Escolha um tópico sobre o qual você seja apaixonado e tenha experiência. +- Certifique-se de que sua proposta seja relevante para o tema ou foco da conferência. +- Escreva um título e resumo convincentes que chamarão a atenção dos organizadores da conferência e dos participantes. +- Descreva sua palestra em detalhes, incluindo o que você cobrirá e como a apresentará. +- Inclua quaisquer materiais de apoio, como amostras de código ou slides, para dar aos organizadores uma melhor ideia do seu estilo de apresentação e conteúdo. + +### Desenvolver suas habilidades de oratória + +Se você é novo em falar em público, é uma boa ideia começar pequeno falando em encontros ou eventos locais. + +Isso ajudará você a construir sua confiança e refinar suas habilidades de apresentação. À medida que você ganha mais experiência, pode se expandir e falar em eventos maiores, como conferências regionais ou nacionais. + +Peça feedback dos participantes e organizadores após cada palestra, e use esse feedback para melhorar suas habilidades de oratória. + +### Fazer networking com outros palestrantes e participantes + +Finalmente, networking é vital para conseguir falar em conferências Python. + +Participe de tantas conferências e encontros quanto possível, e tente se conectar com outros palestrantes e participantes. + +Ao construir relacionamentos com outros membros da comunidade Python, você aumentará sua visibilidade e credibilidade, o que pode levar a mais oportunidades de palestrar no futuro. + +### Conclusão + +Concluindo, conseguir falar em conferências Python requer uma combinação de expertise, preparação e networking. + +Seguindo essas dicas, você pode aumentar suas chances de ser convidado para falar ou enviar com sucesso uma proposta para um CfP e, em última análise, compartilhar seu conhecimento com a comunidade Python mais ampla. diff --git a/_i18n/pt-br/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/pt-br/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..21a49ba7918 --- /dev/null +++ b/_i18n/pt-br/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: Como criar uma apresentação fantástica para conferências Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Conferências Python oferecem uma excelente plataforma para desenvolvedores mostrarem suas habilidades, compartilharem conhecimento e se conectarem com outros profissionais. + +Falar em uma conferência Python pode ser uma oportunidade fantástica para ganhar reconhecimento, construir credibilidade e fazer uma contribuição valiosa para a comunidade Python. No entanto, apresentar em uma conferência também pode ser intimidador, especialmente se você é novo em falar em público ou nunca apresentou antes. Neste recurso, compartilharemos algumas dicas sobre como falar em conferências Python e fazer sua apresentação ser um sucesso. + +## Escolha um tópico pelo qual você é apaixonado + +O primeiro passo para fazer uma apresentação bem-sucedida é escolher um tópico pelo qual você é apaixonado. Se você está entusiasmado com seu tópico, seu entusiasmo será visível em sua apresentação. Você terá mais chances de engajar e cativar sua audiência. Escolha um tópico relevante para a comunidade Python e que ofereça insights valiosos ou soluções para problemas comuns. + +## Entenda seu público + +Antes de começar a preparar sua apresentação, é essencial entender a demografia, nível de expertise e interesses do seu público. Isso ajudará você a adaptar seu conteúdo e forma de entrega para atender às expectativas e necessidades deles. Por exemplo, se seu público consiste de desenvolvedores Python iniciantes, você pode simplificar o jargão técnico e focar em conceitos fundamentais. + +## Crie uma narrativa convincente + +Uma narrativa convincente é um aspecto crítico de qualquer apresentação bem-sucedida. É essencial estruturar sua apresentação de uma forma que conte uma história e mantenha seu público engajado. Use anedotas, estudos de caso e exemplos da vida real para ajudar a ilustrar seus pontos e adicionar um toque pessoal à sua apresentação. Certifique-se de destacar e apresentar as principais conclusões de forma clara e concisa. + +## Pratique, pratique, pratique + +A prática é vital para fazer uma apresentação polida e confiante. Ensaie sua apresentação várias vezes até se sentir confortável com seu conteúdo e forma de entrega. Cronometre sua apresentação para garantir que ela se encaixe no tempo alocado. Considere gravar suas sessões de prática e revisá-las para identificar áreas de melhoria. + +## Use elementos visuais para apoiar sua mensagem + +Recursos visuais como slides e diagramas podem ajudar a apoiar sua mensagem e manter seu público engajado. No entanto, tenha cuidado para não sobrecarregar sua apresentação com muitos elementos visuais, o que pode distraí-lo de sua mensagem. Use gráficos e imagens para ilustrar conceitos complexos e dados, e mantenha seus slides simples e visualmente atraentes. + +## Interaja com seu público + +Interagir com seu público é um aspecto crucial de uma apresentação bem-sucedida. Incentive seu público a participar fazendo perguntas, realizando enquetes ou usando ferramentas interativas. Isso ajudará a manter seu público engajado e permitirá que eles contribuam para a discussão. Esteja preparado para responder perguntas e abordar quaisquer preocupações ou feedback que possam surgir. + +## Conclusão + +Falar em uma conferência Python pode ser uma ótima maneira de compartilhar seu conhecimento e fazer uma contribuição valiosa para a comunidade. Seguindo estas dicas, você pode preparar uma apresentação convincente que engaje e ressoe com seu público. Lembre-se de escolher um tópico pelo qual você é apaixonado, entender seu público, criar uma narrativa convincente, praticar sua apresentação, usar elementos visuais para apoiar sua mensagem e interagir com seu público. Boa sorte e boas apresentações! diff --git a/_i18n/pt-br/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/pt-br/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..1bcc6c05f8c --- /dev/null +++ b/_i18n/pt-br/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,35 @@ +--- +title: O que é um CfP de conferência Python? +author: Jesper Dramsch +layout: post +tags: ["Python", "CfP", "conference"] +--- + +Chamada de Propostas (CfP) ou Chamada para Participação é um termo comum usado em comunidades acadêmicas, de pesquisa e profissionais para convidar indivíduos ou grupos a submeterem propostas ou resumos para conferências, workshops, simpósios e outros eventos. + +Como a comunidade Python é um grupo de adoráveis nerds, essa mesma terminologia foi incorporada ao vocabulário Python. + +## O que é um CfP? +Em termos simples, um CfP é um convite aberto a especialistas, acadêmicos, pesquisadores e profissionais para apresentarem suas ideias, resultados de pesquisas e estudos de caso em um campo ou área de interesse específica. + +Um CfP é tipicamente emitido por organizadores de eventos, comitês de conferências ou instituições acadêmicas para solicitar submissões de indivíduos ou grupos interessados. + +## Para que servem os CfPs? +O objetivo de um CfP é incentivar uma ampla gama de participantes a se envolverem com um evento ou conferência, garantindo diversidade de perspectivas e ideias. + +CfPs geralmente descrevem o tema do evento, os tópicos de interesse e as diretrizes para submissão. Eles também especificam os tipos de submissões aceitas, como artigos de pesquisa, estudos de caso, pôsteres ou workshops. + +## Como participar de um CfP? +O processo de submissão para um CfP geralmente envolve a preparação de uma proposta ou resumo que inclui um sumário do tópico proposto, a metodologia de pesquisa ou abordagem, e os resultados esperados. + +Alguns CfPs acadêmicos podem exigir a submissão de um artigo completo, enquanto outros podem pedir apenas um breve resumo. + +CfPs Python raramente exigem a submissão de materiais completos, pois não publicam artigos. No entanto, é vital evitar a armadilha comum de prometer apenas trabalho futuro. + +## Conclusão + +Em resumo, um CfP convida especialistas, acadêmicos, pesquisadores e profissionais a submeterem propostas ou resumos para um evento ou conferência. + +Ele desempenha um papel vital na facilitação do compartilhamento de conhecimento e expertise, promovendo discussões e criando oportunidades para networking entre profissionais em um campo específico. + +Se você está interessado em participar ou apresentar em uma conferência ou evento, fique atento aos CfPs! diff --git a/_i18n/pt-br/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/pt-br/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..12bfab14c83 --- /dev/null +++ b/_i18n/pt-br/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: Como escrever uma ótima proposta de palestra para conferências Python +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +Escrever uma boa proposta de conferência pode ser desafiador. No entanto, existem alguns elementos-chave que podem ajudar a fazer sua proposta se destacar. Aqui estão cinco componentes essenciais de uma proposta de conferência bem-sucedida. + +## O tópico e por que é interessante + +O primeiro componente de uma boa proposta de conferência é uma descrição clara e convincente do tópico que você planeja discutir. É essencial comunicar por que seu tópico é relevante e empolgante para o público da conferência. Certifique-se de destacar quaisquer aspectos únicos ou inovadores do seu tópico e quaisquer desafios ou oportunidades que ele apresenta. + +## O público que se beneficiará ao assistir a esta palestra/tutorial + +Identificar seu público-alvo é crucial para criar uma proposta de conferência bem-sucedida. + +Seja específico sobre quem se beneficiará da sua palestra ou tutorial e o que eles aprenderão. + +Entender seu público ajudará você a adaptar seu conteúdo e garantir que está fornecendo insights valiosos e conclusões importantes. + +## O benefício para o público + +O que os participantes podem esperar ganhar com sua palestra ou tutorial? Seja claro sobre as principais conclusões que você espera fornecer. + +Isso ajudará os participantes a avaliar se sua apresentação está alinhada com seus interesses e necessidades. + +Também ajudará você a estruturar sua palestra e manter-se no caminho certo para entregar o valor prometido. + +## Qualquer conhecimento prévio necessário para entender a palestra/tutorial + +Ao elaborar sua proposta, é importante considerar que conhecimento prévio seu público precisará para entender e se envolver com seu conteúdo. + +Seja claro sobre quaisquer pré-requisitos e forneça links ou recursos que os participantes possam usar para revisar seus conhecimentos antes de participar. + +## Divisão aproximada do tempo de como o material será abordado + +Uma divisão detalhada de como você planeja cobrir seu material é vital para ajudar os participantes a entender o que podem esperar da sua palestra ou tutorial. + +Ao delinear uma estrutura clara e um cronograma para sua apresentação, você ajudará os participantes a permanecerem engajados e focados em seu conteúdo. Também ajudará você a manter-se no caminho certo e cobrir todos os pontos-chave que deseja fazer. + +## Conclusão + +Em conclusão, uma boa proposta de conferência deve fornecer uma descrição clara e convincente do tópico, identificar o público-alvo e suas necessidades, comunicar claramente as conclusões e qualquer conhecimento prévio necessário, e fornecer uma divisão detalhada do material. Incluir esses componentes essenciais aumentará as chances de sua proposta ser aceita e de você realizar uma apresentação bem-sucedida na conferência. + +_Esta lista expande os excelentes pontos feitos pela [conferência Pydata Global](https://pydata.org/global2022/present/)._ diff --git a/_i18n/pt-br/_posts/2023-03-07-find-target-audience.md b/_i18n/pt-br/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..287f1b4955e --- /dev/null +++ b/_i18n/pt-br/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: Como definir seu público-alvo para uma palestra de conferência Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +Quando se trata de enviar uma proposta para uma apresentação em conferência, é essencial definir seu público-alvo. Saber com quem você está falando pode ajudá-lo a adaptar sua apresentação às necessidades, interesses e conhecimentos prévios da audiência. Neste post, discutiremos como definir seu público-alvo para uma proposta de conferência e por que isso é importante. + +## Considere o cargo profissional deles + +Primeiro, você precisa considerar o cargo profissional do seu público-alvo. São cientistas de dados, engenheiros de machine learning ou software, pesquisadores ou algo else? + +Conhecer o cargo profissional deles pode ajudá-lo a determinar quais tópicos e técnicas são mais relevantes para eles. + +Por exemplo, se você estiver apresentando uma nova técnica de visualização de dados, cientistas de dados e pesquisadores podem estar mais interessados em como ela funciona. + +Enquanto isso, engenheiros podem estar mais interessados em como ela pode ser implementada em seus sistemas existentes. + +## Pense sobre a experiência + +A seguir, considere o nível de experiência do seu público-alvo. São iniciantes, intermediários ou avançados no assunto? + +Isso afetará como você apresenta suas ideias e quanta informação de fundo você fornece. + +Por exemplo, se sua apresentação for sobre um algoritmo complexo, um público avançado pode estar interessado nos detalhes técnicos e exemplos de código, enquanto iniciantes podem precisar de uma explicação simplificada dos conceitos para acompanhar a apresentação. + +## Considere um nicho secundário + +Acredite em mim, adoro falar sobre machine learning. Mas quando as pessoas não me conhecem, é improvável que se interessem por essa palestra. + +No entanto, você poderia falar sobre "machine learning na medicina" ou "aplicando redes neurais na previsão de clima e tempo", tornando a palestra imperdível para certas pessoas que poderiam ter perdido a proposta de outra forma. + +Esta é uma maneira de dizer ao seu público-alvo exatamente que uma apresentação é para eles. + +## Por que definimos nosso público-alvo? + +Definir seu público-alvo é crucial por duas razões principais. + +Primeiro, ajuda você a focar sua apresentação nos tópicos mais relevantes e interessantes para sua audiência. Isso pode tornar sua apresentação mais envolvente e valiosa para os participantes. + +Segundo, ajuda potenciais participantes a decidir se sua apresentação corresponde às necessidades e interesses deles. + +Se eles puderem ver facilmente que sua apresentação visa seu cargo profissional e nível de experiência, é mais provável que participem e encontrem valor em sua palestra. + +## Considere a própria conferência + +Ao escrever sua proposta de conferência, certifique-se de incluir informações sobre seu público-alvo. + +Isso pode ser tão simples quanto incluir uma declaração como "Esta apresentação é direcionada para cientistas de dados com nível de experiência intermediário." Fornecer esta informação pode ajudar revisores e participantes a entender para quem é sua palestra e se ela se alinha com os objetivos da conferência. + +## Conclusão + +Definir seu público-alvo é um passo essencial na preparação de uma apresentação de conferência. Ao considerar o cargo profissional e nível de experiência de sua audiência, você pode adaptar sua apresentação às necessidades e interesses deles, tornando-a mais envolvente e útil para os participantes. Certifique-se de incluir informações sobre seu público-alvo em sua proposta de conferência para ajudar revisores e participantes a entender para quem é sua palestra e se é adequada para eles. diff --git a/_i18n/pt-br/_posts/2023-03-08-common-pitfalls.md b/_i18n/pt-br/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..eb1852d3ab3 --- /dev/null +++ b/_i18n/pt-br/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 9 armadilhas comuns que fazem sua proposta de palestra para conferências Python ser rejeitada +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +Se você está pensando em enviar uma proposta para uma palestra de conferência, é essencial saber o que evitar para aumentar suas chances de aceitação. Aqui estão nove armadilhas comuns para ficar atento: + +## Apresentações de vendas + +Lembre-se que a conferência é uma comunidade de criadores e usuários de ferramentas de computação científica de código aberto. Embora você possa fazer referência ao seu produto ou plataforma de código fechado, o público achará a palestra mais interessante se puderem experimentar suas técnicas com o stack PyData de código aberto. Evite fazer uma venda agressiva e concentre-se na definição do problema, estratégias propostas e domínio de negócios. + +## Palestras repetidas + +Conferências preferem novas palestras e novos palestrantes. Se sua palestra já está disponível online, é improvável que seja aceita para a conferência. Tente trazer novos insights, técnicas ou perspectivas sobre um tópico que não tenha sido coberto antes. + +## Falta de clareza + +Sua proposta deve comunicar claramente sobre o que é sua palestra e o que os participantes podem esperar aprender. Se sua proposta for pouco clara, divagante ou difícil de seguir, os revisores podem não conseguir determinar se sua palestra se alinha com os objetivos da conferência ou é adequada para o público pretendido. + +## Falta de originalidade + +Os revisores buscam palestras únicas, perspicazes e inovadoras que ofereçam perspectivas frescas ou novas soluções para problemas comuns. Se sua proposta cobre um tópico que já foi abordado várias vezes ou não oferece novos insights ou técnicas, os revisores podem rejeitá-la. Isso não significa que um estudo de caso ou uma nova abordagem sobre um problema não será aceito, mas vale a pena considerar essa perspectiva adicional. + +## Propostas excessivamente longas + +Mantenha sua proposta simples e clara. Boas propostas geralmente fornecem todas as informações vitais em 250 palavras. Este não é um limite rigoroso e varia por conferência. Esta é uma sugestão para ajudá-lo a se manter focado e evitar perder a atenção dos revisores. + +## Falta de relevância + +Certifique-se de que sua palestra se alinhe com o tema ou foco da conferência. Se sua proposta estiver apenas tangencialmente relacionada aos objetivos da conferência, os revisores podem não ver como ela se encaixa no quadro geral ou como beneficiaria os participantes. + +## Trabalho futuro + +Embora discutir trabalho futuro seja empolgante e possa ser mencionado em sua palestra, o conteúdo principal da palestra já deve estar moldado, e você deve ser capaz de descrevê-lo em sua proposta. Não confie demais na coleta futura de dados ou prototipagem futura, porque as coisas frequentemente não ocorrem como esperado. Certifique-se de fornecer exemplos concretos e casos de uso. + +## Conteúdo inapropriado ou ofensivo + +Mantenha sua linguagem e tom profissionais e respeitosos, e evite tópicos controversos ou sensíveis que possam ofender ou alienar os participantes. Propostas contendo conteúdo inapropriado, ofensivo ou discriminatório provavelmente serão rejeitadas. + +## Incompatibilidade com o formato da conferência + +Conferências têm diferentes formatos, desde lightning talks até workshops e palestras principais. Certifique-se de que sua proposta se alinhe com o formato e duração da conferência e possa ser entregue efetivamente nesse formato. Considere qualquer equipamento, materiais ou recursos necessários para sua palestra. + +Ao evitar estas armadilhas comuns, você pode aumentar suas chances de enviar uma proposta bem-sucedida para uma palestra de conferência que se alinhe com os objetivos da conferência, seja relevante para os participantes e forneça novos insights ou técnicas. diff --git a/_i18n/pt-br/_posts/2023-03-09-what-about.md b/_i18n/pt-br/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..99c5ccc36ea --- /dev/null +++ b/_i18n/pt-br/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: Sobre o que deve ser minha palestra na conferência Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Frequentemente enfrentamos um paradoxo quando finalmente decidimos dar uma palestra em uma conferência Python. Aprendemos tantas coisas empolgantes. Há tanto que é interessante. Mas sobre o que deve ser minha palestra de Python?! + +Então, parabéns por decidir apresentar sobre Python! Você está ansioso para compartilhar seu conhecimento e experiência com outros. Vamos mergulhar! + +Antes de tudo, pense sobre sua audiência. Quem você quer que assista à sua palestra? São iniciantes, intermediários ou usuários avançados de Python? Eles têm um interesse específico ou problema que querem resolver usando Python? Entender a expertise e interesse da sua audiência ajudará você a decidir sobre um tópico que irá atraí-los e mantê-los engajados. + +Em seguida, considere o tipo de palestra que você quer dar. Você quer mergulhar fundo em um tópico complexo ou manter simples com um tutorial prático? Você quer focar nas capacidades matemáticas do Python ou aplicações práticas? É crucial escolher um tópico que se alinhe com sua expertise e paixão e mantenha sua audiência em mente. + +Uma vez que você tenha decidido seu tópico e tipo de palestra, pense sobre o tom que você quer estabelecer. Você quer ser descontraído e engraçado ou mais sério e cauteloso? Não há resposta certa ou errada aqui, mas certifique-se de que seu tom seja apropriado para seu tópico e audiência. + +Lembre-se, sua palestra visa educar e inspirar outros sobre Python, então certifique-se de que seus pontos principais sejam claros e valiosos. O que sua audiência deve aprender ou levar da sua palestra? Como eles podem aplicar o que aprenderam em seus projetos Python ou carreiras? + +Em resumo, ao decidir sobre o tópico da sua palestra Python, considere sua audiência, o tipo de palestra e o tom que você quer estabelecer. Certifique-se de que seus pontos principais sejam claros e valiosos para sua audiência. E o mais importante, divirta-se e compartilhe sua paixão por Python com os outros! diff --git a/_i18n/pt-br/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/pt-br/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..3ac5339eb40 --- /dev/null +++ b/_i18n/pt-br/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,51 @@ +--- +title: Explorando Recursos Adicionais para Prazos de Conferências +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +Pythondeadlin.es tem sido um destino popular para a comunidade Python encontrar prazos de conferências em um local conveniente durante o último ano. + +No entanto, é importante estar ciente de outros recursos valiosos que podem aprimorar sua experiência de planejamento de conferências e promover a colaboração dentro da comunidade Python. + +Neste post do blog, vamos explorar dois desses recursos que desempenham um papel vital na agregação de informações de conferências e na união da comunidade Python. Vamos mergulhar! + +## GitHub Python-Organizers: Um Tesouro de Informações + +O [repositório GitHub Python-Organizers](https://github.com/python-organizers/conferences) é um recurso valioso para organizadores de conferências, participantes e palestrantes. + +Ele serve como um hub centralizado de dados de conferências, fornecendo uma coleção organizada de conferências, prazos de submissão, datas de eventos, informações de patrocinadores e detalhes de localização. Esta plataforma colaborativa encoraja os organizadores de eventos a compartilharem suas informações de conferência e contribuírem para a precisão e abrangência dos dados. + +Ao aproveitar o GitHub Python-Organizers, você pode acessar uma riqueza de conhecimento e colaborar com outros organizadores. + +Seja você planejando participar ou apresentar em uma conferência Python, este recurso permite que você tome decisões informadas e se mantenha atualizado com os prazos mais recentes de conferências. + +O repositório GitHub facilita a interação e promove o engajamento da comunidade, incentivando indivíduos a participarem ativamente na promoção, crescimento e sucesso das conferências Python em todo o mundo. + +## A Lista Oficial de Eventos Python: Unindo a Comunidade + +A [lista oficial de eventos Python](https://www.python.org/events/) gerenciada através da lista de discussão Python serve como uma plataforma unificadora para a comunidade Python. + +Este recurso abrangente fornece uma visão geral dos próximos eventos Python, incluindo conferências, meetups, workshops e mais. Enquanto oferece informações sobre prazos, vai além disso para promover colaboração, networking e compartilhamento de ideias dentro da comunidade. + +Você pode se inscrever na lista de discussão, mas a página web oferece um mapa e um calendário Google que você pode facilmente assinar para receber atualizações. Isso permite que você visualize e planeje sua agenda de conferências de forma mais eficaz. + +Esta plataforma inclusiva reúne entusiastas Python de diversas origens e os encoraja a se conectarem, aprenderem e contribuírem para o vibrante ecossistema Python. + +## Abraçando a Colaboração para um Planejamento Aprimorado de Conferências + +Enquanto Pythondeadlin.es continua sendo um recurso valioso, é importante explorar o panorama mais amplo de agregação de informações de conferências. + +O repositório GitHub Python-Organizers e a lista oficial de eventos Python são instrumentais na união da comunidade Python e no fomento à colaboração. + +Ao utilizar esses recursos, você pode se manter atualizado com os próximos eventos Python, conectar-se com pessoas de ideias semelhantes e contribuir ativamente para o crescimento e sucesso das conferências Python. Abraçar a colaboração nos permite criar conferências mais fortes e vibrantes que atendam às diversas necessidades e interesses da comunidade Python. + +Certifique-se de verificar os seguintes recursos para mais informações: + +- [GitHub Python-Organizers](https://github.com/python-organizers/conferences) +- [Lista Oficial de Eventos Python](https://www.python.org/events/) + +Ao utilizar essas plataformas, podemos nos manter informados sobre os próximos eventos Python, conectar com pessoas de ideias semelhantes e contribuir ativamente para o sucesso de nossas conferências. Vamos colaborar, compartilhar nosso conhecimento e forjar uma comunidade Python mais forte. + +Juntos, podemos moldar o futuro dos eventos Python e fomentar um ambiente onde todos possam aprender, crescer e prosperar. diff --git a/_i18n/pt-br/calendar/description.md b/_i18n/pt-br/calendar/description.md new file mode 100644 index 00000000000..f7704dbb800 --- /dev/null +++ b/_i18n/pt-br/calendar/description.md @@ -0,0 +1,6 @@ +A visão geral do PythonDeadlin.es sobre prazos e datas de conferências Python em um calendário. + +Você pode opcionalmente exportar **todos os prazos** para o Google Calendar ou +iCal. Este calendário é ótimo para acompanhar os prazos reais! + +Alternativamente, inscreva-se nos **próximos eventos Python** no seu Google Calendar ou iCal. Este é o calendário de eventos clássico. diff --git a/_i18n/pt-br/dates/pretty_dates.html b/_i18n/pt-br/dates/pretty_dates.html new file mode 100644 index 00000000000..cdaf56a8bd1 --- /dev/null +++ b/_i18n/pt-br/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil %} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture %} +{% elsif include.start == nil %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.until" %} {{ end_day }} de {{ end_month }} de {{ end_year }}{% endcapture %} +{% elsif include.end == nil %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign start_day = start_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.from" %} {{ start_day }} de {{ start_month }} de {{ start_year }}{% endcapture %} +{% else %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + + {% if start_date == end_date %} + {% assign day = start_date | date: "%-d" %} + {% assign year = start_date | date: "%Y" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture pretty_date %}{{ day }} de {{ month }} de {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} a {{ end_day }} de {{ month }} de {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} de {{ start_month }} a {{ end_day }} de {{ end_month }} de {{ year }}{% endcapture %} + + {% else %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} de {{ start_month }} de {{ start_year }} a {{ end_day }} de {{ end_month }} de {{ end_year }}{% endcapture %} + {% endif %} +{% endif %}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/pt-br/footer/jesper.md b/_i18n/pt-br/footer/jesper.md new file mode 100644 index 00000000000..89c87ed9a24 --- /dev/null +++ b/_i18n/pt-br/footer/jesper.md @@ -0,0 +1 @@ +Jesper Dramsch é o criador de ML.recipes, data-science-gui.de, Late to the Party 🎉 e a Comunidade Latent Space. diff --git a/_i18n/pt-br/footer/maintainer.md b/_i18n/pt-br/footer/maintainer.md new file mode 100644 index 00000000000..710c75e0bb1 --- /dev/null +++ b/_i18n/pt-br/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

Criado por Jesper Dramsch • Código aberto • Impulsionado pela comunidade

+

Inspirado por aideadlin.es • Arquivando {{confs | size}} conferências Python desde 2022

diff --git a/_i18n/pt-br/footer/terms.md b/_i18n/pt-br/footer/terms.md new file mode 100644 index 00000000000..0193eb8c4b5 --- /dev/null +++ b/_i18n/pt-br/footer/terms.md @@ -0,0 +1,3 @@ +

Não há garantia de precisão, por favor corrija os erros enviando um pull request.

+ +TermosPolítica de Privacidade diff --git a/_i18n/pt-br/formatter/countries.html b/_i18n/pt-br/formatter/countries.html new file mode 100644 index 00000000000..d452ecab49b --- /dev/null +++ b/_i18n/pt-br/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: 'Afeganistão', code: 'AFG', flag: '🇦🇫' }, +{ name: 'Albânia', code: 'ALB', flag: '🇦🇱' }, +{ name: 'Argélia', code: 'DZA', flag: '🇩🇿' }, +{ name: 'Andorra', code: 'AND', flag: '🇦🇩' }, +{ name: 'Angola', code: 'AGO', flag: '🇦🇴' }, +{ name: 'Antígua e Barbuda', code: 'ATG', flag: '🇦🇬' }, +{ name: 'Argentina', code: 'ARG', flag: '🇦🇷' }, +{ name: 'Armênia', code: 'ARM', flag: '🇦🇲' }, +{ name: 'Austrália', code: 'AUS', flag: '🇦🇺' }, +{ name: 'Áustria', code: 'AUT', flag: '🇦🇹' }, +{ name: 'Azerbaijão', code: 'AZE', flag: '🇦🇿' }, +{ name: 'Bahamas', code: 'BHS', flag: '🇧🇸' }, +{ name: 'Bahrein', code: 'BHR', flag: '🇧🇭' }, +{ name: 'Bangladesh', code: 'BGD', flag: '🇧🇩' }, +{ name: 'Barbados', code: 'BRB', flag: '🇧🇧' }, +{ name: 'Bielorrússia', code: 'BLR', flag: '🇧🇾' }, +{ name: 'Bélgica', code: 'BEL', flag: '🇧🇪' }, +{ name: 'Belize', code: 'BLZ', flag: '🇧🇿' }, +{ name: 'Benin', code: 'BEN', flag: '🇧🇯' }, +{ name: 'Butão', code: 'BTN', flag: '🇧🇹' }, +{ name: 'Bolívia', code: 'BOL', flag: '🇧🇴' }, +{ name: 'Bósnia e Herzegovina', code: 'BIH', flag: '🇧🇦' }, +{ name: 'Botsuana', code: 'BWA', flag: '🇧🇼' }, +{ name: 'Brasil', code: 'BRA', flag: '🇧🇷' }, +{ name: 'Brunei', code: 'BRN', flag: '🇧🇳' }, +{ name: 'Bulgária', code: 'BGR', flag: '🇧🇬' }, +{ name: 'Burkina Faso', code: 'BFA', flag: '🇧🇫' }, +{ name: 'Burundi', code: 'BDI', flag: '🇧🇮' }, +{ name: 'Camboja', code: 'KHM', flag: '🇰🇭' }, +{ name: 'Camarões', code: 'CMR', flag: '🇨🇲' }, +{ name: 'Canadá', code: 'CAN', flag: '🇨🇦' }, +{ name: 'Cabo Verde', code: 'CPV', flag: '🇨🇻' }, +{ name: 'República Centro-Africana', code: 'CAF', flag: '🇨🇫' }, +{ name: 'Chade', code: 'TCD', flag: '🇹🇩' }, +{ name: 'Chile', code: 'CHL', flag: '🇨🇱' }, +{ name: 'China', code: 'CHN', flag: '🇨🇳' }, +{ name: 'Colômbia', code: 'COL', flag: '🇨🇴' }, +{ name: 'Comores', code: 'COM', flag: '🇰🇲' }, +{ name: 'Congo', code: 'COG', flag: '🇨🇬' }, +{ name: 'Costa Rica', code: 'CRI', flag: '🇨🇷' }, +{ name: 'Croácia', code: 'HRV', flag: '🇭🇷' }, +{ name: 'Cuba', code: 'CUB', flag: '🇨🇺' }, +{ name: 'Chipre', code: 'CYP', flag: '🇨🇾' }, +{ name: 'República Tcheca', code: 'CZE', flag: '🇨🇿' }, +{ name: 'Dinamarca', code: 'DNK', flag: '🇩🇰' }, +{ name: 'Djibuti', code: 'DJI', flag: '🇩🇯' }, +{ name: 'Dominica', code: 'DMA', flag: '🇩🇲' }, +{ name: 'República Dominicana', code: 'DOM', flag: '🇩🇴' }, +{ name: 'Equador', code: 'ECU', flag: '🇪🇨' }, +{ name: 'Egito', code: 'EGY', flag: '🇪🇬' }, +{ name: 'El Salvador', code: 'SLV', flag: '🇸🇻' }, +{ name: 'Guiné Equatorial', code: 'GNQ', flag: '🇬🇶' }, +{ name: 'Eritreia', code: 'ERI', flag: '🇪🇷' }, +{ name: 'Estônia', code: 'EST', flag: '🇪🇪' }, +{ name: 'Etiópia', code: 'ETH', flag: '🇪🇹' }, +{ name: 'Fiji', code: 'FJI', flag: '🇫🇯' }, +{ name: 'Finlândia', code: 'FIN', flag: '🇫🇮' }, +{ name: 'França', code: 'FRA', flag: '🇫🇷' }, +{ name: 'Gabão', code: 'GAB', flag: '🇬🇦' }, +{ name: 'Gâmbia', code: 'GMB', flag: '🇬🇲' }, +{ name: 'Geórgia', code: 'GEO', flag: '🇬🇪' }, +{ name: 'Alemanha', code: 'DEU', flag: '🇩🇪' }, +{ name: 'Gana', code: 'GHA', flag: '🇬🇭' }, +{ name: 'Grécia', code: 'GRC', flag: '🇬🇷' }, +{ name: 'Granada', code: 'GRD', flag: '🇬🇩' }, +{ name: 'Guatemala', code: 'GTM', flag: '🇬🇹' }, +{ name: 'Guiné', code: 'GIN', flag: '🇬🇳' }, +{ name: 'Guiné-Bissau', code: 'GNB', flag: '🇬🇼' }, +{ name: 'Guiana', code: 'GUY', flag: '🇬🇾' }, +{ name: 'Haiti', code: 'HTI', flag: '🇭🇹' }, +{ name: 'Honduras', code: 'HND', flag: '🇭🇳' }, +{ name: 'Hungria', code: 'HUN', flag: '🇭🇺' }, +{ name: 'Islândia', code: 'ISL', flag: '🇮🇸' }, +{ name: 'Índia', code: 'IND', flag: '🇮🇳' }, +{ name: 'Indonésia', code: 'IDN', flag: '🇮🇩' }, +{ name: 'Irã', code: 'IRN', flag: '🇮🇷' }, +{ name: 'Iraque', code: 'IRQ', flag: '🇮🇶' }, +{ name: 'Irlanda', code: 'IRL', flag: '🇮🇪' }, +{ name: 'Israel', code: 'ISR', flag: '🇮🇱' }, +{ name: 'Itália', code: 'ITA', flag: '🇮🇹' }, +{ name: 'Jamaica', code: 'JAM', flag: '🇯🇲' }, +{ name: 'Japão', code: 'JPN', flag: '🇯🇵' }, +{ name: 'Jordânia', code: 'JOR', flag: '🇯🇴' }, +{ name: 'Cazaquistão', code: 'KAZ', flag: '🇰🇿' }, +{ name: 'Quênia', code: 'KEN', flag: '🇰🇪' }, +{ name: 'Kiribati', code: 'KIR', flag: '🇰🇮' }, +{ name: 'Coreia do Norte', code: 'PRK', flag: '🇰🇵' }, +{ name: 'Coreia do Sul', code: 'KOR', flag: '🇰🇷' }, +{ name: 'Kuwait', code: 'KWT', flag: '🇰🇼' }, +{ name: 'Quirguistão', code: 'KGZ', flag: '🇰🇬' }, +{ name: 'Laos', code: 'LAO', flag: '🇱🇦' }, +{ name: 'Letônia', code: 'LVA', flag: '🇱🇻' }, +{ name: 'Líbano', code: 'LBN', flag: '🇱🇧' }, +{ name: 'Lesoto', code: 'LSO', flag: '🇱🇸' }, +{ name: 'Libéria', code: 'LBR', flag: '🇱🇷' }, +{ name: 'Líbia', code: 'LBY', flag: '🇱🇾' }, +{ name: 'Liechtenstein', code: 'LIE', flag: '🇱🇮' }, +{ name: 'Lituânia', code: 'LTU', flag: '🇱🇹' }, +{ name: 'Luxemburgo', code: 'LUX', flag: '🇱🇺' }, +{ name: 'Macedônia', code: 'MKD', flag: '🇲🇰' }, +{ name: 'Madagascar', code: 'MDG', flag: '🇲🇬' }, +{ name: 'Malawi', code: 'MWI', flag: '🇲🇼' }, +{ name: 'Malásia', code: 'MYS', flag: '🇲🇾' }, +{ name: 'Maldivas', code: 'MDV', flag: '🇲🇻' }, +{ name: 'Mali', code: 'MLI', flag: '🇲🇱' }, +{ name: 'Malta', code: 'MLT', flag: '🇲🇹' }, +{ name: 'Ilhas Marshall', code: 'MHL', flag: '🇲🇭' }, +{ name: 'Mauritânia', code: 'MRT', flag: '🇲🇷' }, +{ name: 'Maurício', code: 'MUS', flag: '🇲🇺' }, +{ name: 'México', code: 'MEX', flag: '🇲🇽' }, +{ name: 'Micronésia', code: 'FSM', flag: '🇫🇲' }, +{ name: 'Moldávia', code: 'MDA', flag: '🇲🇩' }, +{ name: 'Mônaco', code: 'MCO', flag: '🇲🇨' }, +{ name: 'Mongólia', code: 'MNG', flag: '🇲🇳' }, +{ name: 'Montenegro', code: 'MNE', flag: '🇲🇪' }, +{ name: 'Marrocos', code: 'MAR', flag: '🇲🇦' }, +{ name: 'Moçambique', code: 'MOZ', flag: '🇲🇿' }, +{ name: 'Myanmar', code: 'MMR', flag: '🇲🇲' }, +{ name: 'Namíbia', code: 'NAM', flag: '🇳🇦' }, +{ name: 'Nauru', code: 'NRU', flag: '🇳🇷' }, +{ name: 'Nepal', code: 'NPL', flag: '🇳🇵' }, +{ name: 'Países Baixos', code: 'NLD', flag: '🇳🇱' }, +{ name: 'Nova Zelândia', code: 'NZL', flag: '🇳🇿' }, +{ name: 'Nicarágua', code: 'NIC', flag: '🇳🇮' }, +{ name: 'Níger', code: 'NER', flag: '🇳🇪' }, +{ name: 'Nigéria', code: 'NGA', flag: '🇳🇬' }, +{ name: 'Noruega', code: 'NOR', flag: '🇳🇴' }, +{ name: 'Omã', code: 'OMN', flag: '🇴🇲' }, +{ name: 'Paquistão', code: 'PAK', flag: '🇵🇰' }, +{ name: 'Palau', code: 'PLW', flag: '🇵🇼' }, +{ name: 'Panamá', code: 'PAN', flag: '🇵🇦' }, +{ name: 'Papua-Nova Guiné', code: 'PNG', flag: '🇵🇬' }, +{ name: 'Paraguai', code: 'PRY', flag: '🇵🇾' }, +{ name: 'Peru', code: 'PER', flag: '🇵🇪' }, +{ name: 'Filipinas', code: 'PHL', flag: '🇵🇭' }, +{ name: 'Polônia', code: 'POL', flag: '🇵🇱' }, +{ name: 'Portugal', code: 'PRT', flag: '🇵🇹' }, +{ name: 'Catar', code: 'QAT', flag: '🇶🇦' }, +{ name: 'Romênia', code: 'ROU', flag: '🇷🇴' }, +{ name: 'Rússia', code: 'RUS', flag: '🇷🇺' }, +{ name: 'Ruanda', code: 'RWA', flag: '🇷🇼' }, +{ name: 'São Cristóvão e Nevis', code: 'KNA', flag: '🇰🇳' }, +{ name: 'Santa Lúcia', code: 'LCA', flag: '🇱🇨' }, +{ name: 'São Vicente e Granadinas', code: 'VCT', flag: '🇻🇨' }, +{ name: 'Samoa', code: 'WSM', flag: '🇼🇸' }, +{ name: 'San Marino', code: 'SMR', flag: '🇸🇲' }, +{ name: 'São Tomé e Príncipe', code: 'STP', flag: '🇸🇹' }, +{ name: 'Arábia Saudita', code: 'SAU', flag: '🇸🇦' }, +{ name: 'Senegal', code: 'SEN', flag: '🇸🇳' }, +{ name: 'Sérvia', code: 'SRB', flag: '🇷🇸' }, +{ name: 'Seychelles', code: 'SYC', flag: '🇸🇨' }, +{ name: 'Serra Leoa', code: 'SLE', flag: '🇸🇱' }, +{ name: 'Singapura', code: 'SGP', flag: '🇸🇬' }, +{ name: 'Eslováquia', code: 'SVK', flag: '🇸🇰' }, +{ name: 'Eslovênia', code: 'SVN', flag: '🇸🇮' }, +{ name: 'Ilhas Salomão', code: 'SLB', flag: '🇸🇧' }, +{ name: 'Somália', code: 'SOM', flag: '🇸🇴' }, +{ name: 'África do Sul', code: 'ZAF', flag: '🇿🇦' }, +{ name: 'Sudão do Sul', code: 'SSD', flag: '🇸🇸' }, +{ name: 'Espanha', code: 'ESP', flag: '🇪🇸' }, +{ name: 'Sri Lanka', code: 'LKA', flag: '🇱🇰' }, +{ name: 'Sudão', code: 'SDN', flag: '🇸🇩' }, +{ name: 'Suriname', code: 'SUR', flag: '🇸🇷' }, +{ name: 'Suazilândia', code: 'SWZ', flag: '🇸🇿' }, +{ name: 'Suécia', code: 'SWE', flag: '🇸🇪' }, +{ name: 'Suíça', code: 'CHE', flag: '🇨🇭' }, +{ name: 'Síria', code: 'SYR', flag: '🇸🇾' }, +{ name: 'Taiwan', code: 'TWN', flag: '🇹🇼' }, +{ name: 'Tajiquistão', code: 'TJK', flag: '🇹🇯' }, +{ name: 'Tanzânia', code: 'TZA', flag: '🇹🇿' }, +{ name: 'Tailândia', code: 'THA', flag: '🇹🇭' }, +{ name: 'Timor-Leste', code: 'TLS', flag: '🇹🇱' }, +{ name: 'Togo', code: 'TGO', flag: '🇹🇬' }, +{ name: 'Tonga', code: 'TON', flag: '🇹🇴' }, +{ name: 'Trinidad e Tobago', code: 'TTO', flag: '🇹🇹' }, +{ name: 'Tunísia', code: 'TUN', flag: '🇹🇳' }, +{ name: 'Turquia', code: 'TUR', flag: '🇹🇷' }, +{ name: 'Turcomenistão', code: 'TKM', flag: '🇹🇲' }, +{ name: 'Tuvalu', code: 'TUV', flag: '🇹🇻' }, +{ name: 'Uganda', code: 'UGA', flag: '🇺🇬' }, +{ name: 'Ucrânia', code: 'UKR', flag: '🇺🇦' }, +{ name: 'Emirados Árabes Unidos', code: 'ARE', flag: '🇦🇪' }, +{ name: 'Reino Unido', code: 'GBR', flag: '🇬🇧' }, +{ name: 'Estados Unidos', code: 'USA', flag: '🇺🇸' }, +{ name: 'Uruguai', code: 'URY', flag: '🇺🇾' }, +{ name: 'Uzbequistão', code: 'UZB', flag: '🇺🇿' }, +{ name: 'Vanuatu', code: 'VUT', flag: '🇻🇺' }, +{ name: 'Cidade do Vaticano', code: 'VAT', flag: '🇻🇦' }, +{ name: 'Venezuela', code: 'VEN', flag: '🇻🇪' }, +{ name: 'Vietnã', code: 'VNM', flag: '🇻🇳' }, +{ name: 'Iêmen', code: 'YEM', flag: '🇾🇪' }, +{ name: 'Zâmbia', code: 'ZMB', flag: '🇿🇲' }, +{ name: 'Zimbábue', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/pt-br/formatter/submission.html b/_i18n/pt-br/formatter/submission.html new file mode 100644 index 00000000000..0515de6186f --- /dev/null +++ b/_i18n/pt-br/formatter/submission.html @@ -0,0 +1,55 @@ +
+
Como enviar as informações da sua conferência
+ +
+
1. Formato CSV do Python-Organizers
+

+ Adicione sua conferência ao repositório + python-organizers/conferences: +

+
    +
  • Faça um fork do repositório
  • +
  • Edite o arquivo CSV do ano correspondente
  • +
  • Adicione a linha de dados da sua conferência
  • +
  • Envie um pull request
  • +
+
+ +
+
2. Formato YAML do PythonDeadlin.es
+

+ Adicione sua conferência ao + jesperdramsch/python-deadlines: +

+
    +
  • Faça um fork do repositório
  • +
  • Edite o arquivo `_data/conferences.yml`
  • +
  • Adicione os dados YAML da sua conferência no local apropriado
  • +
  • Envie um pull request
  • +
+
+ +
+
3. Formato de Calendário do Python.org
+

Envie sua conferência para o calendário oficial de eventos Python:

+
    +
  • + Envie um email para + + href="mailto:events@python.org" + >events[at]python.org + com o texto no formato de calendário +
  • +
  • Inclua a linha de assunto: "Python Event Submission: [Nome da sua conferência]"
  • +
  • Aguarde a confirmação da equipe de eventos Python
  • +
+
+ +
+ Dica: Envie para as três plataformas para maximizar a visibilidade + da sua conferência Python! +
+
diff --git a/_i18n/pt-br/frontpage/description.md b/_i18n/pt-br/frontpage/description.md new file mode 100644 index 00000000000..b8d56d878de --- /dev/null +++ b/_i18n/pt-br/frontpage/description.md @@ -0,0 +1,5 @@ +Esta ferramenta comunitária serve como repositório central para prazos de chamadas para participação, propostas, workshops e tutoriais em conferências Python. + +As datas estão disponíveis como contagens regressivas, em fusos horários locais e até como um calendário Google abaixo! + +Os prazos são mostrados em seu fuso horário local. Para visualizá-los nos fusos horários do site da conferência, clique na conferência. diff --git a/_i18n/pt-br/frontpage/hook.md b/_i18n/pt-br/frontpage/hook.md new file mode 100644 index 00000000000..54d05e20ce1 --- /dev/null +++ b/_i18n/pt-br/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es reúne suas conferências Python favoritas. diff --git a/_i18n/pt-br/maps/description.md b/_i18n/pt-br/maps/description.md new file mode 100644 index 00000000000..f91da98ec4f --- /dev/null +++ b/_i18n/pt-br/maps/description.md @@ -0,0 +1,3 @@ +Visão geral dos prazos e datas de conferências em um mapa. + +Abaixo estão todas as futuras conferências Python listadas no PythonDeadlin.es em um formato espacial conveniente. diff --git a/_i18n/pt-br/resources/description.md b/_i18n/pt-br/resources/description.md new file mode 100644 index 00000000000..fb8199c72fc --- /dev/null +++ b/_i18n/pt-br/resources/description.md @@ -0,0 +1,5 @@ +Esta página é dedicada a ajudá-lo a elaborar excelentes Chamadas para Propostas (CfPs) para conferências Python. Aqui, você encontrará uma coleção de posts de blog, guias e dicas sobre como escrever propostas convincentes. + +Nossos recursos cobrem vários aspectos da redação de CfP, desde a escolha de um tópico até a estruturação da sua submissão. Seja você um palestrante de primeira viagem ou um apresentador experiente, essas ferramentas visam melhorar suas habilidades de redação de propostas. + +Explore nosso conteúdo curado para aumentar suas chances de ter sua palestra ou workshop aceito em eventos Python em todo o mundo. diff --git a/_i18n/pt-br/search/description.md b/_i18n/pt-br/search/description.md new file mode 100644 index 00000000000..aa394d41de4 --- /dev/null +++ b/_i18n/pt-br/search/description.md @@ -0,0 +1,5 @@ +Os resultados da pesquisa de nosso banco de dados abrangente de prazos e eventos de conferências Python. Os resultados são apresentados como uma lista de páginas relevantes que correspondem à sua consulta. + +Cada resultado inclui detalhes importantes como o nome da conferência, datas de prazo e breves descrições. Os prazos são mostrados em seu fuso horário local. + +Clique no nome de uma conferência para ver informações mais detalhadas, incluindo diretrizes e links para o site oficial da conferência. diff --git a/_i18n/pt-br/series/description.md b/_i18n/pt-br/series/description.md new file mode 100644 index 00000000000..2b195a73009 --- /dev/null +++ b/_i18n/pt-br/series/description.md @@ -0,0 +1,4 @@ +Esta seção da nossa ferramenta comunitária serve como um diretório abrangente de séries recorrentes de conferências Python. Aqui, você encontrará uma visão geral de eventos regulares, seus cronogramas típicos e informações históricas. + +As séries são apresentadas com breves descrições e links para eventos passados, ajudando você a planejar sua participação em conferências a longo prazo. +Confira uma série para ver mais detalhes e acessar informações sobre seus eventos próximos e passados. diff --git a/_i18n/pt-br/trademark/django.md b/_i18n/pt-br/trademark/django.md new file mode 100644 index 00000000000..ef99d088730 --- /dev/null +++ b/_i18n/pt-br/trademark/django.md @@ -0,0 +1,2 @@ +

Django é uma marca registrada da Django Software Foundation. Este site, pythondeadlin.es, não é afiliado, endossado ou patrocinado pela Django Software Foundation ou por qualquer evento Django. Todas as marcas comerciais e logotipos usados neste site permanecem propriedade de seus respectivos proprietários. Qualquer referência a Django ou outras marcas é apenas para fins informativos e não implica associação com os detentores das marcas.

+

Para mais informações sobre a Django Software Foundation e sua marca, visite https://www.djangoproject.com/foundation/.

diff --git a/_i18n/pt-br/trademark/generic.md b/_i18n/pt-br/trademark/generic.md new file mode 100644 index 00000000000..f3463877f68 --- /dev/null +++ b/_i18n/pt-br/trademark/generic.md @@ -0,0 +1 @@ +

Qualquer uso de marcas registradas ou logotipos estabelecidos por eventos listados neste site é apenas para fins informativos e não implica associação com os respectivos detentores das marcas. Se você é proprietário de uma marca registrada e deseja que sua marca seja removida deste site, entre em contato conosco.

diff --git a/_i18n/pt-br/trademark/pycon.md b/_i18n/pt-br/trademark/pycon.md new file mode 100644 index 00000000000..8f635f2b052 --- /dev/null +++ b/_i18n/pt-br/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon e PyLadies são marcas registradas da Python Software Foundation. Este site, pythondeadlin.es, não é afiliado, endossado ou patrocinado pela Python Software Foundation ou por qualquer evento PyCon. Todas as marcas comerciais e logotipos usados neste site permanecem propriedade de seus respectivos proprietários. Qualquer referência a PyCon ou outras marcas é apenas para fins informativos e não implica associação com os detentores das marcas.

diff --git a/_i18n/pt-br/trademark/pydata.md b/_i18n/pt-br/trademark/pydata.md new file mode 100644 index 00000000000..b8af2dcac08 --- /dev/null +++ b/_i18n/pt-br/trademark/pydata.md @@ -0,0 +1,2 @@ + +

NumFOCUS, PyData e Fiscally Sponsored Projects são marcas registradas da NumFOCUS. Este site, pythondeadlin.es, não é afiliado, endossado ou patrocinado pela NumFOCUS ou por qualquer evento PyData ou afiliado. Todas as marcas comerciais e logotipos usados neste site permanecem propriedade de seus respectivos proprietários. Qualquer referência a NumFOCUS, PyData ou outras marcas é apenas para fins informativos e não implica associação com os detentores das marcas.

diff --git a/_i18n/ru.yml b/_i18n/ru.yml new file mode 100644 index 00000000000..c5e13713ea4 --- /dev/null +++ b/_i18n/ru.yml @@ -0,0 +1,248 @@ +--- +global: + current: 'ru' + choose: 'Выберите язык' + sub_filter: 'Фильтр по подкатегориям:' + en: 'English' + es: 'Español' + de: 'Deutsch' + fr: 'Français' + pt-br: 'Português' + zh-cn: '中文' + hi: 'हिन्दी' + id: 'Bahasa' + ru: 'Русский' + cfp: 'Приглашение к участию' + cfp_ext: 'CFP продлен с' + subscribe: 'Подписаться' +titles: + default: 'Дедлайны конференций Python' + archive: 'Прошедшие конференции Python' + visit_archive: 'Посетить архив' + calendar: 'Календарь дедлайнов и дат конференций Python' + map: 'Карта конференций Python' + a404: 'Страница не найдена' + privacy: 'Политика конфиденциальности' + resources: 'Ресурсы для написания отличных CFP' + series: 'Список серий мероприятий Python' + impressum: 'Условия использования' + past_events: 'Прошедшие события' + past_cfps: 'Прошедшие приглашения' + search: 'Поиск' + about: 'О дедлайнах конференций Python' + languages: 'Доступные языки' + formatter: 'Форматировщик конференций Python' +buttons: + ical: Получить iCal + google: Добавить в Google Календарь + github: Отправить конференцию на GitHub + all_selected: Выбраны все конференции + none_selected: Конференции не выбраны +description: + summary: 'Краткое описание конференции и её проведений за годы.' +header: + countdown: 'Обратный отсчет' + calendar: 'Календарь' + maps: 'Карта' + series: 'Серии' + resources: 'Ресурсы' + formatter: 'Форматировщик приложения' + course: 'Email-курс' + articles: 'Статьи для начала' +conference: + title: 'Дедлайны конференций' + finaid: 'Финансовая помощь' + sponsor: 'Возможности спонсорства' + all: 'Все конференции для' + download_dl: 'Скачать дедлайн конференции' + download_date: 'Скачать даты конференции' + deadline_tz_theirs: 'Дедлайн в часовом поясе сайта конференции' + deadline_tz_local: "Дедлайн в вашем местном часовом поясе " +summary: + title: 'Краткая информация о конференции' +subs: + PY: 'Общий Python' + SCIPY: 'Научный Python' + DATA: 'Python для данных' + WEB: 'Python для веба' + BIZ: 'Python для бизнеса' + GEO: 'Python для Земли' + CAMP: 'Лагеря Python' + DAY: 'День Python' +series: + always: 'Всегда проводится в' + place: + last: 'Последняя конференция в' + next: 'Следующая конференция в' + year: + last: 'Последний год проведения' + next: 'Следующий год' +times: + tba: "Будет объявлено" + from: "С" + until: "До" + normal: + days: 'дней' + hours: 'часов' + minutes: 'минут' + seconds: 'секунд' + short: + days: 'д' + hours: 'ч' + minutes: 'м' + seconds: 'с' + months: + January: 'января' + February: 'февраля' + March: 'марта' + April: 'апреля' + May: 'мая' + June: 'июня' + July: 'июля' + August: 'августа' + September: 'сентября' + October: 'октября' + November: 'ноября' + December: 'декабря' +social: + twitter: 'Твитнуть о конференции' + facebook: 'Поделиться конференцией в FB' + linkedin: 'Поделиться конференцией в LinkedIn' + whatsapp: 'Поделиться конференцией в WhatsApp' + email: 'Отправить конференцию по электронной почте' +search: + no-results: 'Результатов не найдено.' + error: 'Ошибка загрузки индекса поиска. Пожалуйста, попробуйте позже.' +about: + toggle_fullscreen: "Переключить полноэкранный режим презентации" + previous_slide: "Предыдущий слайд" + next_slide: "Следующий слайд" + tagline: "Никогда не пропускайте дедлайны конференций Python!" + hero_description: "Платформа, управляемая сообществом, которая помогает разработчикам Python находить, отслеживать и подавать заявки на конференции по всему миру." + problem: + title: "Проблема" + description: "Отслеживание дедлайнов конференций Python на разных сайтах, в разных часовых поясах и форматах требует много времени и подвержено ошибкам. Многие разработчики упускают возможности поделиться своими знаниями, потому что узнают о CFP слишком поздно." + solution: + title: "Наше решение" + description: "Pythondeadlin.es объединяет все дедлайны конференций Python в одном месте, с автоматическим преобразованием часовых поясов, различными вариантами напоминаний и подробной информацией, чтобы помочь вам эффективно планировать подачу заявок." + features: + title: "Ключевые особенности" + tracking: + title: "Комплексное отслеживание" + description: "Следите за каждым дедлайном заявок (CfP) для конференций Python по всему миру с персонализированными таймерами обратного отсчета в вашем местном часовом поясе." + notifications: + title: "Гибкие уведомления" + description: "Выберите, как вы хотите получать напоминания — подпишитесь через iCal, Google Calendar или RSS-ленту, чтобы получать своевременные оповещения, соответствующие вашему рабочему процессу." + coverage: + title: "Глобальный охват" + description: "Откройте для себя мероприятия Python от PyCon до PyData на шести континентах с помощью нашей интерактивной карты и подробного календаря." + language: + title: "Поддержка разных языков" + description: "Доступ к платформе на английском, испанском, немецком, французском, бразильском португальском, китайском, хинди, индонезийском или русском языках, делая конференции Python доступными для разработчиков из разных языковых сред." + community: + title: "Управляемая сообществом" + description: "Воспользуйтесь нашим подходом с открытым исходным кодом, где сообщество Python совместно поддерживает точную и актуальную информацию о конференциях." + mobile: + title: "Адаптировано для мобильных устройств" + description: "Проверяйте дедлайны на ходу с нашим адаптивным дизайном, который идеально подстраивается под любое устройство — идеально для занятых разработчиков." + categories: + title: "Категории конференций" + intro: "Мы отслеживаем конференции Python по различным специализациям:" + stats: + title: "В цифрах" + conferences: + label: "Отслеживаемых конференций" + description: "Обширная база данных мероприятий Python по всему миру" + categories: + label: "Категории конференций" + description: "От общего Python до специализированных ниш" + guides: + label: "Ресурсные руководства" + description: "Подробные руководства для начинающих и опытных докладчиков" + countries: + label: "Различные страны" + description: "Конференции Python со всего мира" + languages: + label: "Языки" + description: "Обеспечение глобальной доступности конференций Python" + testimonials: + title: "Что говорят пользователи" + first: + quote: "\"Благодаря Pythondeadlin.es я смог подать свое первое предложение доклада на конференцию с достаточным временем для подготовки. Сайт стал незаменимым инструментом в моем профессиональном развитии.\"" + author: "— Разработчик Python" + second: + quote: "\"Как организатор конференции, я ценю, что наше мероприятие точно представлено. Платформа помогла нам охватить более широкую аудиторию потенциальных докладчиков.\"" + author: "— Организатор PyCon" + third: + quote: "\"Теперь мы регулярно показываем PythonDeadlin.es на наших митапах, чтобы отслеживать конференции, которые могут заинтересовать наших участников.\"" + author: "— Организатор митапа" + use_cases: + title: "Как люди используют Pythondeadlin.es" + first_time: + title: "Начинающие докладчики" + description: "Откройте для себя конференции, дружественные к начинающим, с достаточным временем для подготовки убедительного предложения, и используйте раздел ресурсов для вдохновения и руководства." + frequent: + title: "Постоянные докладчики" + description: "Планируйте свое годовое расписание выступлений и определяйте приоритеты дедлайнов подачи заявок на различные мероприятия." + organizers: + title: "Организаторы конференций" + description: "Обеспечьте охват вашего мероприятия потенциальными докладчиками, добавив вашу конференцию в нашу базу данных." + cta: + title: "Начните отслеживать дедлайны конференций уже сегодня" + description: "Присоединяйтесь к сообществу Python, чтобы быть в курсе возможностей конференций. Отсканируйте QR-код или посетите pythondeadlin.es, чтобы начать." + visit_button: "Посетить сайт" + github_button: "Внести вклад на GitHub" + qr_alt: "QR-код для pythondeadlin.es" +languages: + native_speaker: 'Носитель языка' + language_learner: 'Изучающий язык' + ai_translated: 'Переведено ИИ' + switch_to: 'Переключиться' + translated_by: 'Переведено:' + legend: 'Легенда' +formatter: + description: 'Отправка сроков проведения конференций Python в различных форматах' + basic: + title: 'Основная информация' + name: 'Название конференции' + year: 'Год' + type: 'Тип конференции' + attendees: 'Ожидаемое количество участников' + url: 'URL веб-сайта' + location_date: + title: 'Место и дата' + city: 'Город' + city_help: 'Введите только название города' + country: 'Страна' + country_help: 'Начните вводить, чтобы увидеть соответствующие страны с флагами' + venue: 'Место проведения' + extra_places: "Дополнительные места" + extra_help: "Для гибридных или онлайн-мероприятий добавьте дополнительные места через запятую." + start_date: 'Дата начала' + end_date: 'Дата окончания' + timezone: 'Часовой пояс' + timezone_help: 'Начните вводить, чтобы выбрать часовой пояс конференции' + cfp: + title: 'Приём заявок' + status: 'Статус CfP' + tba: 'Будет объявлено' + none: 'Нет CfP' + date: 'Использовать дату' + deadline: 'Срок подачи' + deadline_help: 'Крайний срок подачи предложений докладов' + link: 'Ссылка на CfP' + additional_info: + title: 'Дополнительная информация' + sponsor: 'URL для спонсоров' + finaid: 'URL финансовой помощи' + mastodon: 'URL в Mastodon' + bsky: 'URL в Bluesky' + notes: 'Дополнительные примечания' + notes_place: 'Дополнительные примечания о конференции' + submission_guidelines: 'Руководство по подаче заявок' + generate_output: 'Сгенерировать вывод' + generated_outputs: 'Сгенерированные выводы' + csv_format: 'Формат CSV' + yaml_format: 'Формат YAML' + copy: 'Скопировать в буфер обмена' + calendar_format: 'Формат календаря' diff --git a/_i18n/ru/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/ru/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..b318805fdc5 --- /dev/null +++ b/_i18n/ru/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: Как попасть на выступление на Python-конференциях? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +Python-конференции - отличная платформа для обмена знаниями, налаживания связей с коллегами и ознакомления с последними разработками в сообществе Python. Если вы увлечены Python и хотите поделиться своими идеями с более широкой аудиторией, выступление на Python-конференции может стать отличной возможностью. В этом блоге мы рассмотрим, как попасть на выступление на Python-конференциях. + +### Получить приглашение + +Один из способов получить приглашение выступить на Python-конференциях - иметь установленную репутацию в сообществе. Предположим, вы внесли свой вклад в проекты с открытым исходным кодом, написали статьи или сообщения в блогах о Python или выступали на небольших встречах или мероприятиях. В этом случае вы можете привлечь внимание организаторов конференции. + +Кроме того, если вы являетесь экспертом в определенной области, такой как машинное обучение или веб-разработка, вас могут пригласить выступить на конференциях, посвященных этим темам. Чтобы увеличить свои шансы на приглашение, посещайте конференции и встречи, участвуйте в онлайн-дискуссиях и вносите свой вклад в сообщество Python любым возможным способом. + +### Отправить предложение на Call for Proposal (CfP) + +Еще один способ попасть на выступление на Python-конференциях - отправить предложение на Call for Proposals (CfP). Большинство конференций открывает CfP за несколько месяцев до мероприятия, и любой желающий может отправить предложение. +При отправке предложения важно помнить, что организаторы конференции ищут оригинальные и увлекательные доклады, которые будут интересны разнообразной аудитории. Убедитесь, что ваше предложение хорошо написано, ясно и лаконично, и затрагивает тему, которая актуальна и интересна для сообщества Python. + +Вот несколько советов для отправки успешного предложения: + +- Выберите тему, которая вам интересна и в которой у вас есть опыт. +- Убедитесь, что ваше предложение соответствует теме или фокусу конференции. +- Напишите привлекательный заголовок и резюме, которые привлекут внимание организаторов конференции и участников. +- Подробно опишите свой доклад, включая то, что вы будете освещать и как вы будете его представлять. +- Включите любые вспомогательные материалы, такие как примеры кода или слайды, чтобы дать организаторам лучшее представление о вашем стиле презентации и содержании. + +### Развивайте навыки публичных выступлений + +Если вы новичок в публичных выступлениях, хорошей идеей будет начать с малого, выступая на местных встречах или мероприятиях. + +Это поможет вам построить уверенность и отточить навыки презентации. По мере приобретения опыта вы можете расширяться и выступать на более крупных мероприятиях, таких как региональные или национальные конференции. + +Просите обратную связь от участников и организаторов после каждого выступления и используйте эту обратную связь для улучшения своих навыков выступления. + +### Налаживайте связи с другими спикерами и участниками + +Наконец, налаживание связей имеет решающее значение для получения возможности выступать на Python-конференциях. + +Посещайте как можно больше конференций и встреч и старайтесь устанавливать связи с другими спикерами и участниками. + +Устанавливая отношения с другими членами сообщества Python, вы повысите свою видимость и авторитет, что может привести к большему количеству возможностей для выступлений в будущем. + +### Заключение + +В заключение, получение возможности выступить на Python-конференциях требует сочетания экспертизы, подготовки и налаживания связей. + +Следуя этим советам, вы можете увеличить свои шансы быть приглашенным выступить или успешно отправить предложение на CfP и в конечном итоге поделиться своими знаниями с более широким сообществом Python. diff --git a/_i18n/ru/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/ru/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..18f837eb53e --- /dev/null +++ b/_i18n/ru/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: Как создать отличную презентацию для конференций по Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Конференции по Python предоставляют отличную платформу для разработчиков, чтобы продемонстрировать свои навыки, поделиться знаниями и наладить связи с коллегами по профессии. + +Выступление на конференции по Python может стать отличной возможностью получить признание, укрепить авторитет и внести ценный вклад в сообщество Python. Однако выступление на конференции также может быть пугающим, особенно если вы новичок в публичных выступлениях или никогда раньше не выступали. В этом ресурсе мы поделимся некоторыми советами о том, как выступать на конференциях по Python и сделать вашу презентацию успешной. + +## Выберите тему, которая вас увлекает + +Первый шаг к успешной презентации — выбрать тему, которая вас увлекает. Если вы воодушевлены своей темой, ваш энтузиазм будет заметен в вашей презентации. Вы с большей вероятностью вовлечёте и захватите внимание вашей аудитории. Выберите тему, актуальную для сообщества Python и предлагающую ценные идеи или решения распространённых проблем. + +## Поймите свою аудиторию + +Прежде чем начать подготовку презентации, важно понять демографию, уровень экспертизы и интересы вашей аудитории. Это поможет вам адаптировать содержание и способ подачи в соответствии с их ожиданиями и потребностями. Например, если ваша аудитория состоит из начинающих разработчиков Python, вы можете упростить технический жаргон и сосредоточиться на фундаментальных концепциях. + +## Создайте убедительное повествование + +Убедительное повествование — ключевой аспект любой успешной презентации. Важно структурировать вашу презентацию таким образом, чтобы она рассказывала историю и удерживала внимание аудитории. Используйте анекдоты, примеры из практики и реальные примеры, чтобы проиллюстрировать ваши тезисы и добавить личный оттенок к вашей презентации. Обязательно выделите и представьте наиболее важные выводы чётко и лаконично. + +## Практикуйтесь, практикуйтесь, практикуйтесь + +Практика необходима для уверенного и отточенного выступления. Репетируйте вашу презентацию несколько раз, пока не почувствуете себя комфортно с вашим материалом и подачей. Рассчитайте время для вашей презентации, чтобы убедиться, что она укладывается в отведённые временные рамки. Рассмотрите возможность записи ваших репетиций и их просмотра, чтобы определить области для улучшения. + +## Используйте визуальные средства для поддержки вашего сообщения + +Визуальные вспомогательные средства, такие как слайды и диаграммы, могут помочь поддержать ваше сообщение и удержать внимание аудитории. Однако, будьте осторожны, чтобы не перегрузить вашу презентацию слишком большим количеством визуальных элементов, что может отвлечь от вашего сообщения. Используйте графики и изображения для иллюстрации сложных концепций и данных, и делайте ваши слайды простыми и визуально привлекательными. + +## Взаимодействуйте с вашей аудиторией + +Взаимодействие с аудиторией — ключевой аспект успешной презентации. Поощряйте вашу аудиторию к участию, задавая вопросы, проводя опросы или используя интерактивные инструменты. Это поможет удержать внимание вашей аудитории и позволит им внести вклад в обсуждение. Будьте готовы ответить на вопросы и обсудить любые проблемы или отзывы, которые могут возникнуть. + +## Заключение + +Выступление на конференции по Python может быть отличным способом поделиться вашими знаниями и внести ценный вклад в сообщество. Следуя этим советам, вы можете подготовить убедительную презентацию, которая заинтересует вашу аудиторию и найдет у неё отклик. Помните, выбирайте тему, которая вас увлекает, понимайте вашу аудиторию, создавайте убедительное повествование, практикуйте вашу подачу, используйте визуальные средства для поддержки вашего сообщения и взаимодействуйте с вашей аудиторией. Удачи и успешных презентаций! diff --git a/_i18n/ru/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/ru/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..157d1c67ec3 --- /dev/null +++ b/_i18n/ru/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,38 @@ +--- +title: Что такое CfP конференции Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'conference'] +--- + +Call for Proposals (CfP) или Призыв к участию - это распространенный термин, используемый в академических, исследовательских и профессиональных сообществах для приглашения отдельных лиц или групп к подаче предложений или тезисов для конференций, семинаров, симпозиумов и других мероприятий. + +Поскольку сообщество Python - это группа замечательных гиков, эта же терминология вошла в обиход Python. + +## Что такое CfP? + +Простыми словами, CfP - это открытое приглашение экспертам, ученым, исследователям и практикам представить свои идеи, результаты исследований и тематические исследования в определенной области или сфере интересов. + +CfP обычно выпускается организаторами мероприятий, программными комитетами конференций или академическими учреждениями для привлечения материалов от заинтересованных лиц или групп. + +## Для чего нужны CfP? + +Цель CfP - поощрить широкий круг участников к участию в мероприятии или конференции, обеспечивая разнообразие взглядов и идей. + +CfP часто описывают тему мероприятия, интересующие темы и правила подачи материалов. Они также указывают типы принимаемых материалов, такие как исследовательские статьи, тематические исследования, постеры или семинары. + +## Как принять участие в CfP? + +Процесс подачи для CfP обычно включает подготовку предложения или аннотации, содержащей резюме предлагаемой темы, методологию исследования или подход, и ожидаемые результаты. + +Некоторые академические CfP могут требовать подачи полной статьи, в то время как другие могут запрашивать короткую аннотацию или резюме. + +CfP Python редко требуют подачи полных материалов, так как они не публикуют статьи. Однако важно избегать распространенной ошибки - обещать исключительно будущую работу. + +## Заключение + +В итоге, CfP приглашает экспертов, ученых, исследователей и практиков подавать предложения или аннотации для мероприятия или конференции. + +Он играет важную роль в облегчении обмена знаниями и опытом, содействии обсуждениям и создании возможностей для налаживания контактов среди профессионалов в определенной области. + +Если вы заинтересованы в посещении или выступлении на конференции или мероприятии, следите за объявлениями CfP! diff --git a/_i18n/ru/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/ru/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..af6def7dd5a --- /dev/null +++ b/_i18n/ru/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: Как написать отличное предложение доклада для конференций по Python +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +Написание хорошего предложения для конференции может быть сложной задачей. Тем не менее, есть некоторые ключевые элементы, которые могут помочь выделить ваше предложение. Вот пять основных компонентов успешного предложения для конференции. + +## Тема и почему она интересна + +Первый компонент хорошего предложения для конференции — это четкое и убедительное описание темы, которую вы планируете обсудить. Важно объяснить, почему ваша тема актуальна и интересна для аудитории конференции. Обязательно выделите любые уникальные или инновационные аспекты вашей темы, а также любые вызовы или возможности, которые она представляет. + +## Аудитория, которая получит пользу от посещения этого доклада/мастер-класса + +Определение целевой аудитории имеет решающее значение для создания успешного предложения на конференцию. + +Будьте конкретны в отношении того, кто получит пользу от вашего доклада или мастер-класса и что они узнают. + +Понимание вашей аудитории поможет вам адаптировать содержание и обеспечить предоставление ценных идей и выводов. + +## Польза для аудитории + +Что участники могут ожидать получить от вашего доклада или мастер-класса? Будьте ясны относительно ключевых выводов, которые вы надеетесь предоставить. + +Это поможет участникам оценить, соответствует ли ваша презентация их интересам и потребностям. + +Это также поможет вам структурировать ваш доклад и оставаться на правильном пути, чтобы обеспечить обещанную ценность. + +## Любые предварительные знания, необходимые для понимания доклада/мастер-класса + +При разработке вашего предложения важно учитывать, какие предварительные знания понадобятся вашей аудитории, чтобы понять и взаимодействовать с вашим контентом. + +Будьте ясны относительно любых предварительных требований и предоставьте ссылки или ресурсы, которые участники могут использовать для обновления своих знаний перед посещением. + +## Примерное разделение времени по тому, как будет охвачен материал + +Подробное разбиение того, как вы планируете охватить ваш материал, жизненно важно, чтобы помочь участникам понять, чего они могут ожидать от вашего доклада или мастер-класса. + +Очертив четкую структуру и расписание для вашей презентации, вы поможете участникам оставаться вовлеченными и сосредоточенными на вашем контенте. Это также поможет вам не отклоняться от темы и охватить все ключевые моменты, которые вы хотите сделать. + +## Заключение + +В заключение, хорошее предложение для конференции должно предоставить четкое и убедительное описание темы, определить целевую аудиторию и ее потребности, четко сообщить о выводах и любых необходимых предварительных знаниях, и предоставить подробное разбиение материала. Включение этих необходимых компонентов повысит шансы на принятие вашего предложения и проведение успешной презентации на конференции. + +_Этот список развивает отличные моменты, сделанные [конференцией Pydata Global](https://pydata.org/global2022/present/)._ diff --git a/_i18n/ru/_posts/2023-03-07-find-target-audience.md b/_i18n/ru/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..b7b0d69d23b --- /dev/null +++ b/_i18n/ru/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: Как определить целевую аудиторию для доклада на конференции Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +Когда дело доходит до подачи заявки на выступление на конференции, важно определить вашу целевую аудиторию. Знание того, с кем вы говорите, может помочь вам адаптировать вашу презентацию к потребностям, интересам и фоновым знаниям аудитории. В этом посте мы обсудим, как определить вашу целевую аудиторию для заявки на конференцию и почему это важно. + +## Учитывайте их профессиональную роль + +Сначала вам нужно учесть профессиональную роль вашей целевой аудитории. Это data scientists, инженеры машинного обучения или программного обеспечения, исследователи или кто-то другой? + +Знание их профессиональной роли может помочь вам определить, какие темы и техники наиболее релевантны для них. + +Например, если вы представляете новую технику визуализации данных, data scientists и исследователи могут больше интересоваться тем, как она работает. + +В то же время инженеры могут больше интересоваться тем, как ее можно внедрить в их существующие системы. + +## Подумайте об опыте + +Далее, учитывайте уровень опыта вашей целевой аудитории. Они начинающие, среднего уровня или продвинутые в данной теме? + +Это повлияет на то, как вы будете представлять свои идеи и сколько фоновой информации вы предоставите. + +Например, если ваша презентация посвящена сложному алгоритму, продвинутая аудитория может быть заинтересована в технических деталях и примерах кода, в то время как начинающие могут нуждаться в упрощенном объяснении концепций, чтобы следить за презентацией. + +## Рассмотрите вторичную нишу + +Поверьте мне, я люблю говорить о машинном обучении. Но когда люди меня не знают, они вряд ли заинтересуются этим докладом. + +Однако вы могли бы говорить о "машинном обучении в медицине" или "применении нейронных сетей в прогнозировании погоды и климата", делая доклад необходимым для определенных людей, которые иначе могли бы пропустить вашу заявку. + +Это способ точно сказать вашей целевой аудитории, что презентация предназначена для них. + +## Почему мы определяем нашу целевую аудиторию? + +Определение вашей целевой аудитории важно по двум основным причинам. + +Во-первых, это помогает вам сфокусировать вашу презентацию на наиболее релевантных и интересных темах для вашей аудитории. Это может сделать вашу презентацию более увлекательной и ценной для участников. + +Во-вторых, это помогает потенциальным участникам решить, соответствует ли ваша презентация их потребностям и интересам. + +Если они могут легко увидеть, что ваша презентация нацелена на их профессиональную роль и уровень опыта, они с большей вероятностью посетят ее и найдут ценность в вашем докладе. + +## Учитывайте саму конференцию + +При написании вашей заявки на конференцию, обязательно включите информацию о вашей целевой аудитории. + +Это может быть так просто, как включение утверждения типа "Эта презентация нацелена на data scientists со средним уровнем опыта." Предоставление этой информации может помочь рецензентам и участникам понять, для кого предназначен ваш доклад и соответствует ли он целям конференции. + +## Заключение + +Определение вашей целевой аудитории - важный шаг в подготовке презентации для конференции. Учитывая профессиональную роль и уровень опыта вашей аудитории, вы можете адаптировать вашу презентацию к их потребностям и интересам, делая ее более увлекательной и полезной для участников. Обязательно включите информацию о вашей целевой аудитории в вашу заявку на конференцию, чтобы помочь рецензентам и участникам понять, для кого предназначен ваш доклад и подходит ли он для них. diff --git a/_i18n/ru/_posts/2023-03-08-common-pitfalls.md b/_i18n/ru/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..5503615752d --- /dev/null +++ b/_i18n/ru/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 9 распространенных ошибок, из-за которых отклоняют ваше предложение доклада на конференции Python +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +Если вы собираетесь подать предложение для доклада на конференции, важно знать, чего следует избегать, чтобы повысить шансы на принятие. Вот девять распространенных ошибок, на которые следует обратить внимание: + +## Коммерческие презентации + +Помните, что конференция - это сообщество создателей и пользователей инструментов научных вычислений с открытым исходным кодом. Хотя вы можете упомянуть свой закрытый продукт или платформу, аудитория найдет доклад более интересным, если они смогут попробовать ваши методы с открытым стеком PyData. Избегайте жесткой продажи и сосредоточьтесь на определении проблемы, предлагаемых стратегиях и бизнес-домене. + +## Повторяющиеся доклады + +Конференции предпочитают новые доклады и новых докладчиков. Если ваш доклад уже доступен онлайн, вряд ли он будет принят на конференцию. Постарайтесь привнести новые идеи, техники или перспективы по теме, которая ранее не освещалась. + +## Отсутствие ясности + +Ваше предложение должно ясно сообщать, о чем ваш доклад и что участники могут ожидать узнать. Если ваше предложение неясно, расплывчато или трудно для понимания, рецензенты могут не определить, соответствует ли ваш доклад целям конференции или подходит для целевой аудитории. + +## Отсутствие оригинальности + +Рецензенты ищут уникальные, содержательные и инновационные доклады, которые предлагают свежие перспективы или новые решения распространенных проблем. Если ваше предложение охватывает тему, которая уже была освещена несколько раз или не предлагает новых идей или техник, рецензенты могут его отклонить. Это не означает, что кейс или новый взгляд на проблему не будет принят, но стоит учитывать эту дополнительную перспективу. + +## Слишком длинные предложения + +Держите ваше предложение простым и ясным. Хорошие предложения обычно предоставляют всю важную информацию в пределах 250 слов. Это не строгое ограничение и варьируется в зависимости от конференции. Это предложение, чтобы помочь вам оставаться сосредоточенным и избежать потери внимания рецензентов. + +## Отсутствие релевантности + +Убедитесь, что ваш доклад соответствует теме или фокусу конференции. Если ваше предложение лишь касательно связано с целями конференции, рецензенты могут не увидеть, как оно вписывается в общую картину или как оно будет полезно участникам. + +## Будущая работа + +Хотя обсуждение будущей работы увлекательно и может быть упомянуто в вашем докладе, основное содержание доклада должно быть уже сформировано, и вы должны быть способны описать его в вашем предложении. Не полагайтесь слишком сильно на будущий сбор данных или будущее прототипирование, потому что вещи часто не идут по плану. Убедитесь, что вы предоставляете конкретные примеры и случаи использования. + +## Неприемлемый или оскорбительный контент + +Сохраняйте ваш язык и тон профессиональными и уважительными, и избегайте спорных или чувствительных тем, которые могут оскорбить или отчуждать участников. Предложения, содержащие неприемлемый, оскорбительный или дискриминационный контент, вероятно, будут отклонены. + +## Плохое соответствие формату конференции + +Конференции имеют разные форматы, от молниеносных докладов до мастер-классов и ключевых выступлений. Убедитесь, что ваше предложение соответствует формату и продолжительности конференции и может быть эффективно представлено в этом формате. Учтите любое оборудование, материалы или ресурсы, необходимые для вашего доклада. + +Избегая этих распространенных ошибок, вы можете увеличить шансы на подачу успешного предложения для доклада на конференции, которое соответствует целям конференции, является релевантным для участников и предлагает новые идеи или техники. diff --git a/_i18n/ru/_posts/2023-03-09-what-about.md b/_i18n/ru/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..4a6ac250480 --- /dev/null +++ b/_i18n/ru/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: О чем должен быть мой доклад на конференции Python? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Мы часто сталкиваемся с парадоксальной загадкой, когда наконец решаем выступить с докладом на конференции Python. Мы узнали о стольких захватывающих вещах. Так много интересного. Но о чем должен быть мой доклад о Python?! + +Итак, поздравляем с решением выступить о Python! Вы стремитесь поделиться своими знаниями и опытом с другими. Давайте разберемся! + +В первую очередь, подумайте о своей аудитории. Кого вы хотите видеть на своем докладе? Это начинающие, средние или продвинутые пользователи Python? Есть ли у них конкретный интерес или проблема, которую они хотят решить с помощью Python? Понимание экспертизы и интересов вашей аудитории поможет вам выбрать тему, которая привлечет их и удержит их внимание. + +Далее, рассмотрите тип доклада, который вы хотите представить. Хотите ли вы глубоко погрузиться в сложную тему или сделать все проще с практическим руководством? Хотите ли вы сосредоточиться на математических возможностях Python или на практических приложениях? Очень важно выбрать тему, которая соответствует вашей экспертизе и страсти, и при этом учитывает вашу аудиторию. + +После того, как вы определились с темой и типом доклада, подумайте о тоне, который вы хотите задать. Хотите ли вы быть легкомысленным и смешным или более серьезным и предостерегающим? Здесь нет правильного или неправильного ответа, но убедитесь, что ваш тон подходит для вашей темы и аудитории. + +Помните, что цель вашего доклада — образовывать и вдохновлять других о Python, поэтому убедитесь, что ваши основные мысли ясны и ценны. Что должна узнать или вынести ваша аудитория из вашего доклада? Как они могут применить то, что узнали, в своих проектах на Python или карьере? + +Подводя итог, при выборе темы для вашего доклада о Python учитывайте вашу аудиторию, тип доклада и тон, который вы хотите задать. Убедитесь, что ваши основные мысли ясны и ценны для вашей аудитории. И самое главное, получайте удовольствие и делитесь своей страстью к Python с другими! diff --git a/_i18n/ru/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/ru/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..ae1618e3b95 --- /dev/null +++ b/_i18n/ru/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,51 @@ +--- +title: Исследование дополнительных ресурсов для сроков конференций +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +Pythondeadlin.es был популярным местом для сообщества Python, где можно найти сроки проведения конференций в одном удобном месте в течение последнего года. + +Однако важно знать о других ценных ресурсах, которые могут улучшить ваш опыт планирования конференций и способствовать сотрудничеству внутри сообщества Python. + +В этом блоге мы рассмотрим два таких ресурса, которые играют важную роль в агрегации информации о конференциях и объединении сообщества Python. Давайте углубимся! + +## GitHub Python-Organizers: сокровищница информации + +[Репозиторий GitHub Python-Organizers](https://github.com/python-organizers/conferences) является ценным ресурсом для организаторов конференций, участников и докладчиков. + +Он служит централизованным хабом данных о конференциях, предоставляя организованную коллекцию конференций, сроков подачи заявок, дат мероприятий, информации о спонсорах и деталей о местоположении. Эта платформа для сотрудничества поощряет организаторов мероприятий делиться информацией о своих конференциях и вносить вклад в точность и полноту данных. + +Используя GitHub Python-Organizers, вы можете получить доступ к богатству знаний и сотрудничать с другими организаторами. + +Планируете ли вы посетить или выступить на конференции Python, этот ресурс позволяет вам принимать обоснованные решения и быть в курсе последних сроков проведения конференций. + +Репозиторий GitHub облегчает взаимодействие и способствует вовлечению сообщества, поощряя отдельных лиц активно участвовать в продвижении, росте и успехе конференций Python по всему миру. + +## Официальный список событий Python: объединение сообщества + +[Официальный список событий Python](https://www.python.org/events/), управляемый через список рассылки Python, служит объединяющей платформой для сообщества Python. + +Этот всеобъемлющий ресурс предоставляет обзор предстоящих событий Python, включая конференции, встречи, семинары и многое другое. Он не только предоставляет информацию о сроках, но и способствует сотрудничеству, налаживанию связей и обмену идеями в сообществе. + +Вы можете подписаться на список рассылки, но веб-страница предлагает вам карту и календарь Google, на которые вы можете легко подписаться, чтобы получать обновления. Это позволяет вам более эффективно визуализировать и планировать свое расписание конференций. + +Эта инклюзивная платформа объединяет энтузиастов Python из разных слоев общества и поощряет их связываться, учиться и вносить вклад в яркую экосистему Python. + +## Принятие сотрудничества для улучшения планирования конференций + +В то время как Pythondeadlin.es остается ценным ресурсом, важно исследовать более широкий ландшафт агрегации информации о конференциях. + +Репозиторий GitHub Python-Organizers и официальный список событий Python играют ключевую роль в объединении сообщества Python и содействии сотрудничеству. + +Используя эти ресурсы, вы можете быть в курсе предстоящих событий Python, связываться с единомышленниками и активно способствовать росту и успеху конференций Python. Принятие сотрудничества позволяет нам создавать более сильные, яркие конференции, которые отвечают разнообразным потребностям и интересам сообщества Python. + +Обязательно ознакомьтесь со следующими ресурсами для получения дополнительной информации: + +- [GitHub Python-Organizers](https://github.com/python-organizers/conferences) +- [Официальный список событий Python](https://www.python.org/events/) + +Используя эти платформы, мы можем быть в курсе предстоящих событий Python, связываться с единомышленниками и активно способствовать успеху наших конференций. Давайте сотрудничать, делиться нашими знаниями и создавать более сильное сообщество Python. + +Вместе мы можем формировать будущее событий Python и создавать среду, в которой каждый может учиться, расти и процветать. diff --git a/_i18n/ru/calendar/description.md b/_i18n/ru/calendar/description.md new file mode 100644 index 00000000000..2a4874baa7e --- /dev/null +++ b/_i18n/ru/calendar/description.md @@ -0,0 +1,5 @@ +Обзор дедлайнов и дат конференций PythonDeadlin.es в календаре. + +Вы можете экспортировать **все дедлайны** в Google Календарь или iCal. Этот календарь отлично подходит для отслеживания реальных дедлайнов! + +Или подпишитесь на **предстоящие мероприятия Python** в вашем Google Календаре или iCal. Это классический "календарь мероприятий". diff --git a/_i18n/ru/dates/pretty_dates.html b/_i18n/ru/dates/pretty_dates.html new file mode 100644 index 00000000000..67d206df295 --- /dev/null +++ b/_i18n/ru/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil %} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture %} +{% elsif include.start == nil %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.until" %} {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} +{% elsif include.end == nil %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign start_day = start_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.from" %} {{ start_day }} {{ start_month }} {{ start_year }}{% endcapture %} +{% else %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + + {% if start_date == end_date %} + {% assign day = start_date | date: "%-d" %} + {% assign year = start_date | date: "%Y" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture pretty_date %}{{ day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }}–{{ end_day }} {{ month }} {{ year }}{% endcapture %} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} – {{ end_day }} {{ end_month }} {{ year }}{% endcapture %} + + {% else %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{{ start_day }} {{ start_month }} {{ start_year }} – {{ end_day }} {{ end_month }} {{ end_year }}{% endcapture %} + {% endif %} +{% endif %}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/ru/footer/jesper.md b/_i18n/ru/footer/jesper.md new file mode 100644 index 00000000000..77bd09e3cb4 --- /dev/null +++ b/_i18n/ru/footer/jesper.md @@ -0,0 +1 @@ +Йеспер Драмш — создатель ML.recipes, data-science-gui.de, Late to the Party 🎉 и Latent Space Community. diff --git a/_i18n/ru/footer/maintainer.md b/_i18n/ru/footer/maintainer.md new file mode 100644 index 00000000000..fa366d11a73 --- /dev/null +++ b/_i18n/ru/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

Создано Йеспером Драмшем • Открытый исходный код • Управляется сообществом

+

Вдохновлено aideadlin.es • Архивировано {{confs | size}} конференций Python с 2022 года

diff --git a/_i18n/ru/footer/terms.md b/_i18n/ru/footer/terms.md new file mode 100644 index 00000000000..a435eab6d0c --- /dev/null +++ b/_i18n/ru/footer/terms.md @@ -0,0 +1,3 @@ +

Нет гарантии точности, пожалуйста, исправляйте ошибки, отправив pull request.

+ +УсловияПолитика конфиденциальности diff --git a/_i18n/ru/formatter/countries.html b/_i18n/ru/formatter/countries.html new file mode 100644 index 00000000000..d18694cae77 --- /dev/null +++ b/_i18n/ru/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: 'Афганистан', code: 'AFG', flag: '🇦🇫' }, +{ name: 'Албания', code: 'ALB', flag: '🇦🇱' }, +{ name: 'Алжир', code: 'DZA', flag: '🇩🇿' }, +{ name: 'Андорра', code: 'AND', flag: '🇦🇩' }, +{ name: 'Ангола', code: 'AGO', flag: '🇦🇴' }, +{ name: 'Антигуа и Барбуда', code: 'ATG', flag: '🇦🇬' }, +{ name: 'Аргентина', code: 'ARG', flag: '🇦🇷' }, +{ name: 'Армения', code: 'ARM', flag: '🇦🇲' }, +{ name: 'Австралия', code: 'AUS', flag: '🇦🇺' }, +{ name: 'Австрия', code: 'AUT', flag: '🇦🇹' }, +{ name: 'Азербайджан', code: 'AZE', flag: '🇦🇿' }, +{ name: 'Багамские Острова', code: 'BHS', flag: '🇧🇸' }, +{ name: 'Бахрейн', code: 'BHR', flag: '🇧🇭' }, +{ name: 'Бангладеш', code: 'BGD', flag: '🇧🇩' }, +{ name: 'Барбадос', code: 'BRB', flag: '🇧🇧' }, +{ name: 'Беларусь', code: 'BLR', flag: '🇧🇾' }, +{ name: 'Бельгия', code: 'BEL', flag: '🇧🇪' }, +{ name: 'Белиз', code: 'BLZ', flag: '🇧🇿' }, +{ name: 'Бенин', code: 'BEN', flag: '🇧🇯' }, +{ name: 'Бутан', code: 'BTN', flag: '🇧🇹' }, +{ name: 'Боливия', code: 'BOL', flag: '🇧🇴' }, +{ name: 'Босния и Герцеговина', code: 'BIH', flag: '🇧🇦' }, +{ name: 'Ботсвана', code: 'BWA', flag: '🇧🇼' }, +{ name: 'Бразилия', code: 'BRA', flag: '🇧🇷' }, +{ name: 'Бруней', code: 'BRN', flag: '🇧🇳' }, +{ name: 'Болгария', code: 'BGR', flag: '🇧🇬' }, +{ name: 'Буркина-Фасо', code: 'BFA', flag: '🇧🇫' }, +{ name: 'Бурунди', code: 'BDI', flag: '🇧🇮' }, +{ name: 'Камбоджа', code: 'KHM', flag: '🇰🇭' }, +{ name: 'Камерун', code: 'CMR', flag: '🇨🇲' }, +{ name: 'Канада', code: 'CAN', flag: '🇨🇦' }, +{ name: 'Кабо-Верде', code: 'CPV', flag: '🇨🇻' }, +{ name: 'Центральноафриканская Республика', code: 'CAF', flag: '🇨🇫' }, +{ name: 'Чад', code: 'TCD', flag: '🇹🇩' }, +{ name: 'Чили', code: 'CHL', flag: '🇨🇱' }, +{ name: 'Китай', code: 'CHN', flag: '🇨🇳' }, +{ name: 'Колумбия', code: 'COL', flag: '🇨🇴' }, +{ name: 'Коморские Острова', code: 'COM', flag: '🇰🇲' }, +{ name: 'Конго', code: 'COG', flag: '🇨🇬' }, +{ name: 'Коста-Рика', code: 'CRI', flag: '🇨🇷' }, +{ name: 'Хорватия', code: 'HRV', flag: '🇭🇷' }, +{ name: 'Куба', code: 'CUB', flag: '🇨🇺' }, +{ name: 'Кипр', code: 'CYP', flag: '🇨🇾' }, +{ name: 'Чехия', code: 'CZE', flag: '🇨🇿' }, +{ name: 'Дания', code: 'DNK', flag: '🇩🇰' }, +{ name: 'Джибути', code: 'DJI', flag: '🇩🇯' }, +{ name: 'Доминика', code: 'DMA', flag: '🇩🇲' }, +{ name: 'Доминиканская Республика', code: 'DOM', flag: '🇩🇴' }, +{ name: 'Эквадор', code: 'ECU', flag: '🇪🇨' }, +{ name: 'Египет', code: 'EGY', flag: '🇪🇬' }, +{ name: 'Сальвадор', code: 'SLV', flag: '🇸🇻' }, +{ name: 'Экваториальная Гвинея', code: 'GNQ', flag: '🇬🇶' }, +{ name: 'Эритрея', code: 'ERI', flag: '🇪🇷' }, +{ name: 'Эстония', code: 'EST', flag: '🇪🇪' }, +{ name: 'Эфиопия', code: 'ETH', flag: '🇪🇹' }, +{ name: 'Фиджи', code: 'FJI', flag: '🇫🇯' }, +{ name: 'Финляндия', code: 'FIN', flag: '🇫🇮' }, +{ name: 'Франция', code: 'FRA', flag: '🇫🇷' }, +{ name: 'Габон', code: 'GAB', flag: '🇬🇦' }, +{ name: 'Гамбия', code: 'GMB', flag: '🇬🇲' }, +{ name: 'Грузия', code: 'GEO', flag: '🇬🇪' }, +{ name: 'Германия', code: 'DEU', flag: '🇩🇪' }, +{ name: 'Гана', code: 'GHA', flag: '🇬🇭' }, +{ name: 'Греция', code: 'GRC', flag: '🇬🇷' }, +{ name: 'Гренада', code: 'GRD', flag: '🇬🇩' }, +{ name: 'Гватемала', code: 'GTM', flag: '🇬🇹' }, +{ name: 'Гвинея', code: 'GIN', flag: '🇬🇳' }, +{ name: 'Гвинея-Бисау', code: 'GNB', flag: '🇬🇼' }, +{ name: 'Гайана', code: 'GUY', flag: '🇬🇾' }, +{ name: 'Гаити', code: 'HTI', flag: '🇭🇹' }, +{ name: 'Гондурас', code: 'HND', flag: '🇭🇳' }, +{ name: 'Венгрия', code: 'HUN', flag: '🇭🇺' }, +{ name: 'Исландия', code: 'ISL', flag: '🇮🇸' }, +{ name: 'Индия', code: 'IND', flag: '🇮🇳' }, +{ name: 'Индонезия', code: 'IDN', flag: '🇮🇩' }, +{ name: 'Иран', code: 'IRN', flag: '🇮🇷' }, +{ name: 'Ирак', code: 'IRQ', flag: '🇮🇶' }, +{ name: 'Ирландия', code: 'IRL', flag: '🇮🇪' }, +{ name: 'Израиль', code: 'ISR', flag: '🇮🇱' }, +{ name: 'Италия', code: 'ITA', flag: '🇮🇹' }, +{ name: 'Ямайка', code: 'JAM', flag: '🇯🇲' }, +{ name: 'Япония', code: 'JPN', flag: '🇯🇵' }, +{ name: 'Иордания', code: 'JOR', flag: '🇯🇴' }, +{ name: 'Казахстан', code: 'KAZ', flag: '🇰🇿' }, +{ name: 'Кения', code: 'KEN', flag: '🇰🇪' }, +{ name: 'Кирибати', code: 'KIR', flag: '🇰🇮' }, +{ name: 'Северная Корея', code: 'PRK', flag: '🇰🇵' }, +{ name: 'Южная Корея', code: 'KOR', flag: '🇰🇷' }, +{ name: 'Кувейт', code: 'KWT', flag: '🇰🇼' }, +{ name: 'Кыргызстан', code: 'KGZ', flag: '🇰🇬' }, +{ name: 'Лаос', code: 'LAO', flag: '🇱🇦' }, +{ name: 'Латвия', code: 'LVA', flag: '🇱🇻' }, +{ name: 'Ливан', code: 'LBN', flag: '🇱🇧' }, +{ name: 'Лесото', code: 'LSO', flag: '🇱🇸' }, +{ name: 'Либерия', code: 'LBR', flag: '🇱🇷' }, +{ name: 'Ливия', code: 'LBY', flag: '🇱🇾' }, +{ name: 'Лихтенштейн', code: 'LIE', flag: '🇱🇮' }, +{ name: 'Литва', code: 'LTU', flag: '🇱🇹' }, +{ name: 'Люксембург', code: 'LUX', flag: '🇱🇺' }, +{ name: 'Македония', code: 'MKD', flag: '🇲🇰' }, +{ name: 'Мадагаскар', code: 'MDG', flag: '🇲🇬' }, +{ name: 'Малави', code: 'MWI', flag: '🇲🇼' }, +{ name: 'Малайзия', code: 'MYS', flag: '🇲🇾' }, +{ name: 'Мальдивы', code: 'MDV', flag: '🇲🇻' }, +{ name: 'Мали', code: 'MLI', flag: '🇲🇱' }, +{ name: 'Мальта', code: 'MLT', flag: '🇲🇹' }, +{ name: 'Маршалловы Острова', code: 'MHL', flag: '🇲🇭' }, +{ name: 'Мавритания', code: 'MRT', flag: '🇲🇷' }, +{ name: 'Маврикий', code: 'MUS', flag: '🇲🇺' }, +{ name: 'Мексика', code: 'MEX', flag: '🇲🇽' }, +{ name: 'Микронезия', code: 'FSM', flag: '🇫🇲' }, +{ name: 'Молдова', code: 'MDA', flag: '🇲🇩' }, +{ name: 'Монако', code: 'MCO', flag: '🇲🇨' }, +{ name: 'Монголия', code: 'MNG', flag: '🇲🇳' }, +{ name: 'Черногория', code: 'MNE', flag: '🇲🇪' }, +{ name: 'Марокко', code: 'MAR', flag: '🇲🇦' }, +{ name: 'Мозамбик', code: 'MOZ', flag: '🇲🇿' }, +{ name: 'Мьянма', code: 'MMR', flag: '🇲🇲' }, +{ name: 'Намибия', code: 'NAM', flag: '🇳🇦' }, +{ name: 'Науру', code: 'NRU', flag: '🇳🇷' }, +{ name: 'Непал', code: 'NPL', flag: '🇳🇵' }, +{ name: 'Нидерланды', code: 'NLD', flag: '🇳🇱' }, +{ name: 'Новая Зеландия', code: 'NZL', flag: '🇳🇿' }, +{ name: 'Никарагуа', code: 'NIC', flag: '🇳🇮' }, +{ name: 'Нигер', code: 'NER', flag: '🇳🇪' }, +{ name: 'Нигерия', code: 'NGA', flag: '🇳🇬' }, +{ name: 'Норвегия', code: 'NOR', flag: '🇳🇴' }, +{ name: 'Оман', code: 'OMN', flag: '🇴🇲' }, +{ name: 'Пакистан', code: 'PAK', flag: '🇵🇰' }, +{ name: 'Палау', code: 'PLW', flag: '🇵🇼' }, +{ name: 'Панама', code: 'PAN', flag: '🇵🇦' }, +{ name: 'Папуа-Новая Гвинея', code: 'PNG', flag: '🇵🇬' }, +{ name: 'Парагвай', code: 'PRY', flag: '🇵🇾' }, +{ name: 'Перу', code: 'PER', flag: '🇵🇪' }, +{ name: 'Филиппины', code: 'PHL', flag: '🇵🇭' }, +{ name: 'Польша', code: 'POL', flag: '🇵🇱' }, +{ name: 'Португалия', code: 'PRT', flag: '🇵🇹' }, +{ name: 'Катар', code: 'QAT', flag: '🇶🇦' }, +{ name: 'Румыния', code: 'ROU', flag: '🇷🇴' }, +{ name: 'Россия', code: 'RUS', flag: '🇷🇺' }, +{ name: 'Руанда', code: 'RWA', flag: '🇷🇼' }, +{ name: 'Сент-Китс и Невис', code: 'KNA', flag: '🇰🇳' }, +{ name: 'Сент-Люсия', code: 'LCA', flag: '🇱🇨' }, +{ name: 'Сент-Винсент и Гренадины', code: 'VCT', flag: '🇻🇨' }, +{ name: 'Самоа', code: 'WSM', flag: '🇼🇸' }, +{ name: 'Сан-Марино', code: 'SMR', flag: '🇸🇲' }, +{ name: 'Сан-Томе и Принсипи', code: 'STP', flag: '🇸🇹' }, +{ name: 'Саудовская Аравия', code: 'SAU', flag: '🇸🇦' }, +{ name: 'Сенегал', code: 'SEN', flag: '🇸🇳' }, +{ name: 'Сербия', code: 'SRB', flag: '🇷🇸' }, +{ name: 'Сейшельские Острова', code: 'SYC', flag: '🇸🇨' }, +{ name: 'Сьерра-Леоне', code: 'SLE', flag: '🇸🇱' }, +{ name: 'Сингапур', code: 'SGP', flag: '🇸🇬' }, +{ name: 'Словакия', code: 'SVK', flag: '🇸🇰' }, +{ name: 'Словения', code: 'SVN', flag: '🇸🇮' }, +{ name: 'Соломоновы Острова', code: 'SLB', flag: '🇸🇧' }, +{ name: 'Сомали', code: 'SOM', flag: '🇸🇴' }, +{ name: 'Южная Африка', code: 'ZAF', flag: '🇿🇦' }, +{ name: 'Южный Судан', code: 'SSD', flag: '🇸🇸' }, +{ name: 'Испания', code: 'ESP', flag: '🇪🇸' }, +{ name: 'Шри-Ланка', code: 'LKA', flag: '🇱🇰' }, +{ name: 'Судан', code: 'SDN', flag: '🇸🇩' }, +{ name: 'Суринам', code: 'SUR', flag: '🇸🇷' }, +{ name: 'Свазиленд', code: 'SWZ', flag: '🇸🇿' }, +{ name: 'Швеция', code: 'SWE', flag: '🇸🇪' }, +{ name: 'Швейцария', code: 'CHE', flag: '🇨🇭' }, +{ name: 'Сирия', code: 'SYR', flag: '🇸🇾' }, +{ name: 'Тайвань', code: 'TWN', flag: '🇹🇼' }, +{ name: 'Таджикистан', code: 'TJK', flag: '🇹🇯' }, +{ name: 'Танзания', code: 'TZA', flag: '🇹🇿' }, +{ name: 'Таиланд', code: 'THA', flag: '🇹🇭' }, +{ name: 'Восточный Тимор', code: 'TLS', flag: '🇹🇱' }, +{ name: 'Того', code: 'TGO', flag: '🇹🇬' }, +{ name: 'Тонга', code: 'TON', flag: '🇹🇴' }, +{ name: 'Тринидад и Тобаго', code: 'TTO', flag: '🇹🇹' }, +{ name: 'Тунис', code: 'TUN', flag: '🇹🇳' }, +{ name: 'Турция', code: 'TUR', flag: '🇹🇷' }, +{ name: 'Туркменистан', code: 'TKM', flag: '🇹🇲' }, +{ name: 'Тувалу', code: 'TUV', flag: '🇹🇻' }, +{ name: 'Уганда', code: 'UGA', flag: '🇺🇬' }, +{ name: 'Украина', code: 'UKR', flag: '🇺🇦' }, +{ name: 'Объединенные Арабские Эмираты', code: 'ARE', flag: '🇦🇪' }, +{ name: 'Великобритания', code: 'GBR', flag: '🇬🇧' }, +{ name: 'Соединенные Штаты Америки', code: 'USA', flag: '🇺🇸' }, +{ name: 'Уругвай', code: 'URY', flag: '🇺🇾' }, +{ name: 'Узбекистан', code: 'UZB', flag: '🇺🇿' }, +{ name: 'Вануату', code: 'VUT', flag: '🇻🇺' }, +{ name: 'Ватикан', code: 'VAT', flag: '🇻🇦' }, +{ name: 'Венесуэла', code: 'VEN', flag: '🇻🇪' }, +{ name: 'Вьетнам', code: 'VNM', flag: '🇻🇳' }, +{ name: 'Йемен', code: 'YEM', flag: '🇾🇪' }, +{ name: 'Замбия', code: 'ZMB', flag: '🇿🇲' }, +{ name: 'Зимбабве', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/ru/formatter/submission.html b/_i18n/ru/formatter/submission.html new file mode 100644 index 00000000000..b8f9a3ae597 --- /dev/null +++ b/_i18n/ru/formatter/submission.html @@ -0,0 +1,54 @@ +
+
Как подать информацию о вашей конференции
+ +
+
1. Формат CSV Python-Organizers
+

+ Добавьте вашу конференцию в репозиторий + python-organizers/conferences: +

+
    +
  • Сделайте форк репозитория
  • +
  • Отредактируйте CSV-файл соответствующего года
  • +
  • Добавьте строку с данными вашей конференции
  • +
  • Отправьте запрос на включение (pull request)
  • +
+
+ +
+
2. Формат YAML PythonDeadlin.es
+

+ Добавьте вашу конференцию в + jesperdramsch/python-deadlines: +

+
    +
  • Сделайте форк репозитория
  • +
  • Отредактируйте файл `_data/conferences.yml`
  • +
  • Добавьте данные вашей конференции в формате YAML в соответствующее место
  • +
  • Отправьте запрос на включение (pull request)
  • +
+
+ +
+
3. Формат календаря Python.org
+

Добавьте вашу конференцию в официальный календарь событий Python:

+
    +
  • + Отправьте письмо на адрес + + href="mailto:events@python.org" + >events[at]python.org + с текстом в формате календаря +
  • +
  • Укажите тему письма: "Python Event Submission: [Название вашей конференции]"
  • +
  • Дождитесь подтверждения от команды событий Python
  • +
+
+ +
+ Совет: Отправьте информацию на все три платформы, чтобы максимально повысить видимость вашей конференции Python! +
+
diff --git a/_i18n/ru/frontpage/description.md b/_i18n/ru/frontpage/description.md new file mode 100644 index 00000000000..b03042da46d --- /dev/null +++ b/_i18n/ru/frontpage/description.md @@ -0,0 +1,5 @@ +Этот инструмент сообщества служит центральным хранилищем для дедлайнов заявок на участие, предложений, воркшопов и туториалов на конференциях Python. + +Даты представлены в виде обратного отсчета, в местных часовых поясах и даже в виде календаря Google ниже! + +Дедлайны отображаются в вашем местном часовом поясе. Чтобы увидеть их в часовых поясах сайта конференции, нажмите на конференцию. diff --git a/_i18n/ru/frontpage/hook.md b/_i18n/ru/frontpage/hook.md new file mode 100644 index 00000000000..b12f99cb091 --- /dev/null +++ b/_i18n/ru/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es курирует ваши любимые конференции Python. diff --git a/_i18n/ru/maps/description.md b/_i18n/ru/maps/description.md new file mode 100644 index 00000000000..313b28b60dd --- /dev/null +++ b/_i18n/ru/maps/description.md @@ -0,0 +1,3 @@ +Обзор сроков и дат конференций на карте. + +Ниже приведены все будущие конференции Python, перечисленные на PythonDeadlin.es в удобном пространственном формате. diff --git a/_i18n/ru/resources/description.md b/_i18n/ru/resources/description.md new file mode 100644 index 00000000000..a75f0612a54 --- /dev/null +++ b/_i18n/ru/resources/description.md @@ -0,0 +1,5 @@ +Эта страница посвящена тому, чтобы помочь вам создавать выдающиеся заявки на участие (CfP) для конференций Python. Здесь вы найдете коллекцию блогов, руководств и советов по написанию убедительных предложений. + +Наши ресурсы охватывают различные аспекты написания CfP, от выбора темы до структуры подачи. Независимо от того, являетесь ли вы начинающим докладчиком или опытным оратором, эти инструменты помогут улучшить ваши навыки написания предложений. + +Изучите наш тщательно подобранный контент, чтобы увеличить свои шансы на принятие вашего доклада или воркшопа на мероприятиях Python по всему миру. diff --git a/_i18n/ru/search/description.md b/_i18n/ru/search/description.md new file mode 100644 index 00000000000..7050b347570 --- /dev/null +++ b/_i18n/ru/search/description.md @@ -0,0 +1,5 @@ +Результаты поиска из нашей обширной базы данных дедлайнов и мероприятий конференций Python. Результаты представлены в виде списка релевантных страниц, соответствующих вашему запросу. + +Каждый результат включает ключевые детали, такие как название конференции, даты дедлайнов и краткие описания. Дедлайны отображаются в вашем местном часовом поясе. + +Нажмите на название конференции, чтобы увидеть более подробную информацию, включая руководства и ссылки на официальный сайт конференции. diff --git a/_i18n/ru/series/description.md b/_i18n/ru/series/description.md new file mode 100644 index 00000000000..d5c13e6a168 --- /dev/null +++ b/_i18n/ru/series/description.md @@ -0,0 +1,5 @@ +Этот раздел нашего инструмента сообщества служит всеобъемлющим справочником по регулярным сериям конференций Python. Здесь вы найдете обзор регулярных мероприятий, их типичных расписаний и исторической информации. + +Серии представлены с краткими описаниями и ссылками на прошедшие мероприятия, что поможет вам планировать долгосрочное участие в конференциях. + +Ознакомьтесь с серией, чтобы узнать больше деталей и получить информацию о предстоящих и прошедших мероприятиях. diff --git a/_i18n/ru/trademark/django.md b/_i18n/ru/trademark/django.md new file mode 100644 index 00000000000..1aef9100602 --- /dev/null +++ b/_i18n/ru/trademark/django.md @@ -0,0 +1,2 @@ +

Django является зарегистрированной торговой маркой Django Software Foundation. Этот веб-сайт, pythondeadlin.es, не связан, не одобрен и не спонсируется Django Software Foundation или каким-либо мероприятием Django. Все торговые марки и логотипы, используемые на этом сайте, остаются собственностью их соответствующих владельцев. Любое упоминание Django или других торговых марок носит исключительно информационный характер и не подразумевает связи с владельцами торговых марок.

+

Для получения дополнительной информации о Django Software Foundation и его торговой марке посетите https://www.djangoproject.com/foundation/.

diff --git a/_i18n/ru/trademark/generic.md b/_i18n/ru/trademark/generic.md new file mode 100644 index 00000000000..17efa6f8237 --- /dev/null +++ b/_i18n/ru/trademark/generic.md @@ -0,0 +1 @@ +

Любое использование товарных знаков или логотипов, установленных мероприятиями, перечисленными на этом сайте, предназначено исключительно для информационных целей и не подразумевает ассоциации с соответствующими владельцами товарных знаков. Если вы являетесь владельцем товарного знака и хотите, чтобы ваш товарный знак был удален с этого сайта, пожалуйста, свяжитесь с нами.

diff --git a/_i18n/ru/trademark/pycon.md b/_i18n/ru/trademark/pycon.md new file mode 100644 index 00000000000..1f323cd1bff --- /dev/null +++ b/_i18n/ru/trademark/pycon.md @@ -0,0 +1 @@ +

Python, PyCon и PyLadies являются зарегистрированными товарными знаками Python Software Foundation. Этот веб-сайт pythondeadlin.es не связан, не одобрен и не спонсируется Python Software Foundation или каким-либо мероприятием PyCon. Все товарные знаки и логотипы, используемые на этом сайте, остаются собственностью их соответствующих владельцев. Любые ссылки на PyCon или другие товарные знаки носят исключительно информационный характер и не подразумевают связи с владельцами товарных знаков.

diff --git a/_i18n/ru/trademark/pydata.md b/_i18n/ru/trademark/pydata.md new file mode 100644 index 00000000000..4a89790e886 --- /dev/null +++ b/_i18n/ru/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS, PyData и Fiscally Sponsored Projects являются зарегистрированными товарными знаками NumFOCUS. Этот веб-сайт, pythondeadlin.es, не связан, не одобрен и не спонсируется NumFOCUS или каким-либо PyData или связанным с ним мероприятием. Все товарные знаки и логотипы, используемые на этом сайте, остаются собственностью их соответствующих владельцев. Любая ссылка на NumFOCUS, PyData или другие товарные знаки носит исключительно информационный характер и не подразумевает связи с владельцами товарных знаков.

diff --git a/_i18n/zh-cn.yml b/_i18n/zh-cn.yml new file mode 100644 index 00000000000..f918df69bde --- /dev/null +++ b/_i18n/zh-cn.yml @@ -0,0 +1,244 @@ +--- +global: + current: 'zh-cn' + choose: '选择语言' + sub_filter: '按子类别筛选:' + en: 'English' + es: 'Español' + de: 'Deutsch' + fr: 'Français' + pt-br: 'Português' + zh-cn: '中文' + cfp: '参与征集' + cfp_ext: '延长的征集期' + subscribe: '订阅' +titles: + default: 'Python会议截止日期' + archive: '往期Python会议' + visit_archive: '访问存档' + calendar: 'Python会议截止日期和日程日历' + map: 'Python会议地图概览' + a404: '页面未找到' + privacy: '隐私政策' + resources: '撰写优质CfP的资源' + series: 'Python活动系列列表' + impressum: '条款与条件' + past_events: '往期活动' + past_cfps: '往期征集' + search: '搜索' + about: '关于Python会议截止日期' + languages: '可用语言' + formatter: '格式化器' +buttons: + ical: 获取iCal日历 + google: 添加到Google日历 + github: 在GitHub上提交会议 + all_selected: 已选择所有会议 + none_selected: 未选择会议 +description: + summary: '会议及其历年实例的摘要。' +header: + countdown: '倒计时' + calendar: '日历' + maps: '地图' + series: '系列' + resources: '资源' + formatter: '格式化器应用' + course: '邮件课程' + articles: '入门文章' +conference: + title: '会议截止日期' + finaid: '财务资助' + sponsor: '赞助机会' + all: '所有会议' + download_dl: '下载会议截止日期' + download_date: '下载会议日期' + deadline_tz_theirs: '会议网站时区的截止日期' + deadline_tz_local: "您本地时区的截止日期" +summary: + title: '会议摘要' +subs: + PY: '通用Python' + SCIPY: '科学Python' + DATA: '数据Python' + WEB: 'Web开发Python' + BIZ: '商业Python' + GEO: '地球科学Python' + CAMP: 'Python营会' + DAY: 'Python日活动' +series: + always: '始终在' + place: + last: '上次会议在' + next: '下次会议在' + year: + last: '上次举办年份' + next: '下次举办年份' +times: + tba: "待定" + from: "从" + until: "直到" + normal: + days: '天' + hours: '小时' + minutes: '分钟' + seconds: '秒' + short: + days: '天' + hours: '时' + minutes: '分' + seconds: '秒' + months: + January: '一月' + February: '二月' + March: '三月' + April: '四月' + May: '五月' + June: '六月' + July: '七月' + August: '八月' + September: '九月' + October: '十月' + November: '十一月' + December: '十二月' +social: + twitter: '在Twitter上分享会议' + facebook: '在FB上分享会议' + linkedin: '在LinkedIn上分享会议' + whatsapp: '在WhatsApp上分享会议' + email: '通过电子邮件分享会议' +search: + no-results: '未找到结果。' + error: '加载搜索索引时出错。请稍后再试。' +about: + toggle_fullscreen: "切换全屏演示模式" + previous_slide: "上一张幻灯片" + next_slide: "下一张幻灯片" + tagline: "再也不会错过Python会议截止日期!" + hero_description: "这个社区驱动的平台帮助Python开发者发现、跟踪全球会议并提交演讲提案。" + problem: + title: "挑战" + description: "在不同网站、时区和格式中跟踪Python会议截止日期费时且容易出错。许多开发者因为太晚发现CFP而错失分享知识的机会。" + solution: + title: "我们的解决方案" + description: "Pythondeadlin.es将所有Python会议截止日期整合在一处,提供自动时区转换、多种提醒选项和全面详细信息,帮助您有效规划提交。" + features: + title: "主要功能" + tracking: + title: "全面跟踪" + description: "通过本地时区的个性化倒计时器,随时掌握全球Python会议的每个提案征集(CfP)截止日期。" + notifications: + title: "灵活通知" + description: "选择您希望的提醒方式——通过iCal、Google日历或RSS订阅,接收符合您工作流程的及时提醒。" + coverage: + title: "全球覆盖" + description: "通过我们的交互式地图视图和全面的日历概览,探索六大洲的Python活动,从PyCon到PyData。" + language: + title: "多语言支持" + description: "以英语、西班牙语、德语、法语、巴西葡萄牙语或简体中文访问平台,让Python会议对不同语言背景的开发者都易于理解。" + community: + title: "社区驱动" + description: "受益于我们的开源方式,Python社区协作维护准确、最新的会议信息。" + mobile: + title: "移动友好" + description: "借助我们能完美适应任何设备的响应式设计,随时随地查看截止日期——非常适合忙碌的开发者。" + categories: + title: "会议类别" + intro: "我们跟踪多个专业领域的Python会议:" + stats: + title: "数据概览" + conferences: + label: "跟踪的会议数量" + description: "全球Python活动的综合数据库" + categories: + label: "会议类别" + description: "从通用Python到专业领域" + guides: + label: "资源指南" + description: "为首次和经验丰富的演讲者提供的全面指南" + countries: + label: "不同国家" + description: "来自世界各地的Python会议" + languages: + label: "语言" + description: "让Python会议全球可及" + testimonials: + title: "用户评价" + first: + quote: "\"多亏了Pythondeadlin.es,我能够有充分时间准备并提交我的第一个会议演讲提案。这个网站已成为我职业发展中不可或缺的工具。\"" + author: "— Python开发者" + second: + quote: "\"作为会议组织者,我很欣赏我们的活动被准确呈现。这个平台帮助我们接触到更广泛的潜在演讲者。\"" + author: "— PyCon组织者" + third: + quote: "\"我们现在定期在Meetup上展示PythonDeadlin.es,以跟踪可能对我们参与者有兴趣的会议。\"" + author: "— Meetup组织者" + use_cases: + title: "人们如何使用Pythondeadlin.es" + first_time: + title: "首次演讲者" + description: "发现适合初学者的会议,有足够的准备时间来制作有说服力的提案,并使用资源部分获取灵感和指导。" + frequent: + title: "常规演讲者" + description: "规划您的年度演讲日程,并为多个活动的提交截止日期确定优先级。" + organizers: + title: "会议组织者" + description: "通过将您的会议添加到我们的数据库,确保您的活动能够接触到潜在的演讲者。" + cta: + title: "今天就开始跟踪会议截止日期" + description: "加入Python社区,随时了解会议机会。扫描二维码或访问pythondeadlin.es开始使用。" + visit_button: "访问网站" + github_button: "在GitHub上贡献" + qr_alt: "pythondeadlin.es的二维码" +languages: + native_speaker: '母语者' + language_learner: '语言学习者' + ai_translated: '由AI翻译' + switch_to: '切换到' + translated_by: '翻译者:' +formatter: + description: '以各种格式提交Python会议截止日期' + basic: + title: '基本信息' + name: '会议名称' + year: '年份' + type: '会议类型' + attendees: '预计参会人数' + url: '网站URL' + location_date: + title: '地点和日期' + city: '城市' + city_help: '仅输入城市名称' + country: '国家' + country_help: '开始输入以查看带有国旗的匹配国家' + venue: '场地' + extra_places: "额外地点" + extra_help: "对于混合或在线活动,在此处添加以逗号分隔的额外地点。" + start_date: '开始日期' + end_date: '结束日期' + timezone: '时区' + timezone_help: '开始输入以选择会议的时区' + cfp: + title: '征集提案' + status: 'CfP状态' + tba: '待公布' + none: '无CfP' + date: '使用日期' + deadline: '提交截止日期' + deadline_help: '提交演讲提案的截止日期' + link: 'CfP链接' + additional_info: + title: '附加信息' + sponsor: '赞助URL' + finaid: '经济资助URL' + mastodon: 'Mastodon URL' + bsky: 'Bluesky URL' + notes: '附加备注' + notes_place: '关于会议的附加备注' + submission_guidelines: '提交指南' + generated_outputs: '生成的输出' + csv_format: 'CSV格式' + yaml_format: 'YAML格式' + calendar_format: '日历格式' + copy: '复制到剪贴板' + required: '请填写所有必填字段,标记为*。' diff --git a/_i18n/zh-cn/_posts/2023-03-03-how-to-get-presentation-python-conferences.md b/_i18n/zh-cn/_posts/2023-03-03-how-to-get-presentation-python-conferences.md new file mode 100644 index 00000000000..84915c35ab0 --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-03-03-how-to-get-presentation-python-conferences.md @@ -0,0 +1,49 @@ +--- +title: 如何在Python会议上发表演讲? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP'] +--- + +Python 会议是分享知识、与同行建立关系网络以及了解 Python 社区最新发展的绝佳平台。如果你对 Python 充满热情并希望与更广泛的受众分享你的见解,在 Python 会议上发言可能是一个很好的机会。在这篇博文中,我们将探讨如何在 Python 会议上发表演讲。 + +### 被邀请 + +获得在 Python 会议上发言邀请的一种方式是在社区中建立声誉。假设你已经为开源项目做出贡献,撰写了关于 Python 的文章或博客文章,或在较小的聚会或活动中发表过演讲。在这种情况下,你可能会引起会议组织者的注意。 + +此外,如果你是某个特定领域的专家,如机器学习或 Web 开发,你可能会被邀请在专注于这些主题的会议上发言。为了增加被邀请的机会,参加会议和聚会,参与在线讨论,并以任何可能的方式为 Python 社区做出贡献。 + +### 向征集提案(CfP)提交建议 + +在 Python 会议上发言的另一种方式是向征集提案(CfP)提交建议。大多数会议在活动前几个月开放 CfP,任何人都可以提交提案。 +提交提案时,重要的是要记住,会议组织者寻求的是能吸引多元化观众的原创和吸引人的演讲。确保你的提交内容写得好,清晰简洁,并涉及与 Python 社区相关且有趣的主题。 + +以下是提交成功提案的一些技巧: + +- 选择你热爱并具有专业知识的主题。 +- 确保你的提案与会议主题或重点相关。 +- 写一个引人注目的标题和摘要,吸引会议组织者和与会者的注意。 +- 详细概述你的演讲,包括你将涵盖的内容以及如何呈现。 +- 包括任何支持材料,如代码示例或幻灯片,给组织者一个更好的了解你的演讲风格和内容。 + +### 培养你的演讲技能 + +如果你是公共演讲的新手,最好从小处开始,比如在当地聚会或活动中发言。 + +这将帮助你建立信心并完善你的演讲技能。随着经验的增加,你可以扩展并在更大的活动中发言,如地区或国家级会议。 + +在每次演讲后向与会者和组织者征求反馈,并利用这些反馈来提高你的演讲技能。 + +### 与其他演讲者和与会者建立关系网络 + +最后,建立关系网络对于在 Python 会议上发言至关重要。 + +尽可能多地参加会议和聚会,并尝试与其他演讲者和与会者建立联系。 + +通过与 Python 社区其他成员建立关系,你将提高你的可见度和可信度,这可能会导致未来有更多的演讲机会。 + +### 结论 + +总之,在 Python 会议上发言需要结合专业知识、准备和人际网络。 + +通过遵循这些技巧,你可以增加被邀请发言或成功提交 CfP 提案的机会,并最终与更广泛的 Python 社区分享你的知识。 diff --git a/_i18n/zh-cn/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md b/_i18n/zh-cn/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md new file mode 100644 index 00000000000..36494fe1063 --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-03-04-how-to-get-started-talk-python-conferences.md @@ -0,0 +1,38 @@ +--- +title: 如何为Python会议创建出色的演讲? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +Python 会议为开发者提供了展示技能、分享知识和与同行建立联系的绝佳平台。 + +在 Python 会议上演讲可以是获得认可、建立信誉并为 Python 社区做出有价值贡献的绝佳机会。然而,在会议上演讲也可能令人生畏,尤其是如果你不熟悉公开演讲或从未演讲过。在这个资源中,我们将分享一些在 Python 会议上演讲并使你的演讲成功的技巧。 + +## 选择你充满热情的主题 + +成功演讲的第一步是选择一个你充满热情的主题。如果你对自己的主题感到兴奋,你的热情会在演讲中体现出来。你将更有可能吸引和打动你的观众。选择一个与 Python 社区相关并提供有价值的见解或常见问题解决方案的主题。 + +## 了解你的受众 + +在开始准备演讲之前,了解受众的人口统计、专业水平和兴趣是至关重要的。这将帮助你调整内容和表达方式以满足他们的期望和需求。例如,如果你的受众由 Python 初学者组成,你可以简化技术术语并专注于基本概念。 + +## 创建引人入胜的叙述 + +引人入胜的叙述是任何成功演讲的关键方面。以讲故事的方式结构化你的演讲并保持观众参与是至关重要的。使用轶事、案例研究和真实生活的例子来帮助说明你的观点,并为你的演讲增添个人色彩。确保清晰简明地突出和呈现最重要的要点。 + +## 练习,练习,再练习 + +练习对于呈现精炼自信的演讲至关重要。多次排练你的演讲,直到你对内容和表达方式感到舒适。计时你的演讲,确保它符合分配的时间范围。考虑录制你的练习过程并回顾它们,以找出需要改进的领域。 + +## 使用视觉元素支持你的信息 + +幻灯片和图表等视觉辅助工具可以帮助支持你的信息并保持观众的参与。然而,要注意不要在演讲中加入过多的视觉元素,这会分散你的信息。使用图形和图像来说明复杂的概念和数据,并保持你的幻灯片简单且具有视觉吸引力。 + +## 与你的观众互动 + +与观众互动是成功演讲的关键方面。通过提问、进行投票或使用互动工具来鼓励你的观众参与。这将有助于保持观众的参与,并允许他们为讨论做出贡献。准备好回答问题并解决可能出现的任何疑虑或反馈。 + +## 结论 + +在 Python 会议上演讲可以是分享知识并为社区做出有价值贡献的好方法。遵循这些技巧,你可以准备一个引人入胜且与观众产生共鸣的演讲。记住选择你充满热情的主题,了解你的观众,创建引人入胜的叙述,练习你的表达,使用视觉元素支持你的信息,并与你的观众互动。祝好运,演讲愉快! diff --git a/_i18n/zh-cn/_posts/2023-03-05-what-are-python-cfps.md b/_i18n/zh-cn/_posts/2023-03-05-what-are-python-cfps.md new file mode 100644 index 00000000000..5687875fcfe --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-03-05-what-are-python-cfps.md @@ -0,0 +1,38 @@ +--- +title: 什么是Python会议CfP? +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'conference'] +--- + +征集提案(CfP)或参与邀请是学术、研究和专业社区中常用的术语,用于邀请个人或团体为会议、研讨会、专题讨论会和其他活动提交提案或摘要。 + +由于 Python 社区是一群可爱的极客,这一术语也进入了 Python 的日常用语中。 + +## 什么是 CfP? + +简单来说,CfP 是向专家、学者、研究人员和从业者发出的公开邀请,请他们在特定领域或兴趣范围内展示他们的想法、研究成果和案例研究。 + +CfP 通常由活动组织者、会议委员会或学术机构发布,旨在征集有兴趣的个人或团体的提交材料。 + +## CfP 的目的是什么? + +CfP 的目的是鼓励广泛的参与者参与活动或会议,确保观点和想法的多样性。 + +CfP 通常概述活动的主题、感兴趣的话题和提交指南。它们还指定接受的提交类型,如研究论文、案例研究、海报或工作坊。 + +## 如何参与 CfP? + +CfP 的提交过程通常包括准备一份提案或摘要,其中包括对所提议主题的总结、研究方法或方法论,以及预期成果。 + +一些学术 CfP 可能需要提交完整的论文,而其他的可能只要求一个简短的摘要或总结。 + +Python 的 CfP 很少要求提交完整的材料,因为它们不发表论文。然而,避免仅承诺未来工作这一常见陷阱是至关重要的。 + +## 结论 + +总之,CfP 邀请专家、学者、研究人员和从业者为活动或会议提交提案或摘要。 + +它在促进知识和专业技能的分享、促进讨论以及为特定领域的专业人士创造建立联系的机会方面发挥着至关重要的作用。 + +如果你有兴趣参加或在会议或活动上发表演讲,请留意 CfP! diff --git a/_i18n/zh-cn/_posts/2023-03-06-good-conference-talk-proposals.md b/_i18n/zh-cn/_posts/2023-03-06-good-conference-talk-proposals.md new file mode 100644 index 00000000000..16ac0386bb6 --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-03-06-good-conference-talk-proposals.md @@ -0,0 +1,46 @@ +--- +title: 如何撰写出色的Python会议演讲提案 +author: Jesper Dramsch +layout: post +tags: ['Python', 'conference', 'CfP', 'audience'] +--- + +撰写一份好的会议提案可能具有挑战性。然而,一些关键元素可以帮助使您的提案脱颖而出。以下是成功会议提案的五个基本组成部分。 + +## 主题及其有趣之处 + +一份好的会议提案的第一个组成部分是对您计划讨论的主题进行清晰而有说服力的描述。向会议观众传达为什么您的主题相关且令人兴奋是至关重要的。确保突出您主题的任何独特或创新方面,以及它呈现的任何挑战或机会。 + +## 将从参加这个演讲/教程中受益的受众 + +确定您的目标受众对于创建成功的会议提案至关重要。 + +明确指出谁将从您的演讲或教程中受益以及他们将学到什么。 + +了解您的受众将帮助您定制内容并确保您提供有价值的见解和要点。 + +## 受众的收获 + +参加者可以期望从您的演讲或教程中获得什么?明确您希望提供的关键要点。 + +这将帮助参加者评估您的演讲是否符合他们的兴趣和需求。 + +它还将帮助您构建您的演讲并保持在正轨上,以提供承诺的价值。 + +## 理解演讲/教程所需的任何背景知识 + +在制定您的提案时,考虑您的受众将需要什么背景知识来理解和参与您的内容是很重要的。 + +明确任何先决条件,并提供链接或资源,参加者可以在参加前用这些资源复习他们的知识。 + +## 将如何涵盖材料的大致时间分配 + +详细分解您计划如何覆盖您的材料对于帮助参加者了解他们可以从您的演讲或教程中期待什么是至关重要的。 + +通过为您的演讲概述一个清晰的结构和时间表,您将帮助参加者保持参与并专注于您的内容。它还将帮助您保持在正轨上并涵盖您想要做的所有关键点。 + +## 结论 + +总之,一份好的会议提案应该提供主题的清晰而有说服力的描述,确定目标受众及其需求,清晰地传达要点和任何必需的背景知识,并提供材料的详细分解。包括这些基本组成部分将增加您的提案被接受的机会,并在会议上进行成功的演讲。 + +_这个列表扩展了[Pydata Global 会议](https://pydata.org/global2022/present/)提出的出色观点。_ diff --git a/_i18n/zh-cn/_posts/2023-03-07-find-target-audience.md b/_i18n/zh-cn/_posts/2023-03-07-find-target-audience.md new file mode 100644 index 00000000000..1c3ba31d227 --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-03-07-find-target-audience.md @@ -0,0 +1,54 @@ +--- +title: 如何为Python会议演讲定义目标受众? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation', 'conference', 'audience'] +--- + +在提交会议演讲提案时,定义目标受众至关重要。了解你的演讲对象可以帮助你根据受众的需求、兴趣和背景知识来调整演讲内容。在本文中,我们将讨论如何为会议提案定义目标受众以及为什么这很重要。 + +## 考虑他们的职业角色 + +首先,你需要考虑目标受众的职业角色。他们是数据科学家、机器学习或软件工程师、研究人员,还是其他职业? + +了解他们的职业角色可以帮助你确定哪些主题和技术对他们最相关。 + +例如,如果你要展示一种新的数据可视化技术,数据科学家和研究人员可能更感兴趣于它的工作原理。 + +同时,工程师可能更关心如何将其实施到他们现有的系统中。 + +## 考虑经验水平 + +接下来,考虑目标受众的经验水平。他们在该主题上是初学者、中级还是高级? + +这将影响你如何呈现想法以及提供多少背景信息。 + +例如,如果你的演讲是关于一个复杂的算法,高级受众可能对技术细节和代码示例感兴趣,而初学者可能需要简化的概念解释才能跟上演讲。 + +## 考虑次要领域 + +相信我,我喜欢谈论机器学习。但是当人们不认识我时,他们不太可能对那个演讲感兴趣。 + +然而,你可以谈论"医学中的机器学习"或"在天气和气候预测中应用神经网络",这样对某些可能错过提案的人来说,这个演讲就成了必看的内容。 + +这是一种向目标受众明确表示某个演讲是为他们准备的方式。 + +## 为什么我们要定义目标受众? + +定义目标受众主要有两个原因。 + +首先,它帮助你将演讲内容集中在对受众最相关和有趣的主题上。这可以使你的演讲对与会者更具吸引力和价值。 + +其次,它帮助潜在与会者决定你的演讲是否符合他们的需求和兴趣。 + +如果他们能够清楚地看到你的演讲针对他们的职业角色和经验水平,他们更有可能参加并从你的演讲中获得价值。 + +## 考虑会议本身 + +在撰写会议提案时,确保包含有关目标受众的信息。 + +这可以简单到包含一个声明,如"此演讲针对中级经验水平的数据科学家。"提供这些信息可以帮助审稿人和与会者了解你的演讲对象以及它是否符合会议目标。 + +## 结论 + +定义目标受众是准备会议演讲的重要步骤。通过考虑受众的职业角色和经验水平,你可以根据他们的需求和兴趣调整演讲内容,使其对与会者更具吸引力和实用性。确保在会议提案中包含有关目标受众的信息,以帮助审稿人和与会者了解你的演讲针对谁以及是否适合他们。 diff --git a/_i18n/zh-cn/_posts/2023-03-08-common-pitfalls.md b/_i18n/zh-cn/_posts/2023-03-08-common-pitfalls.md new file mode 100644 index 00000000000..e3f1ec9f58d --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-03-08-common-pitfalls.md @@ -0,0 +1,46 @@ +--- +title: 导致Python会议演讲提案被拒绝的9个常见陷阱 +author: Jesper Dramsch +layout: post +tags: ['Python', 'CfP', 'pitfalls'] +--- + +如果你打算提交会议演讲提案,了解应该避免什么是提高接受机会的关键。以下是九个需要注意的常见陷阱: + +## 销售推介 + +请记住,会议是开源科学计算工具的创建者和用户社区。虽然你可以提及你的闭源产品或平台,但如果观众能够使用开源 PyData 堆栈尝试你的技术,他们会发现演讲更有趣。避免进行硬性销售,而是专注于问题定义、提议的策略和业务领域。 + +## 重复的演讲 + +会议偏好新的演讲和新的讲者。如果你的演讲已经在网上可获取,它不太可能被会议接受。尝试带来尚未被覆盖过的主题的新见解、技术或视角。 + +## 缺乏清晰度 + +你的提案应该清晰地传达你的演讲内容和参会者可以期望学到什么。如果你的提案不清晰、杂乱或难以理解,评审者可能无法确定你的演讲是否符合会议目标或适合目标受众。 + +## 缺乏原创性 + +评审者寻找能提供新鲜视角或常见问题新解决方案的独特、有见地和创新的演讲。如果你的提案涵盖已经被多次讨论过的主题,或者没有提供任何新的见解或技术,评审者可能会拒绝它。这并不意味着案例研究或问题的新视角不会被接受,但值得考虑这种额外的视角。 + +## 过长的提案 + +保持你的提案简单明了。好的提案通常在 250 字内提供所有重要信息。这不是严格的限制,会因会议而异。这是一个建议,帮助你保持专注并避免失去评审者的注意力。 + +## 缺乏相关性 + +确保你的演讲与会议的主题或焦点一致。如果你的提案仅与会议目标有切线关系,评审者可能看不到它如何融入更大的图景或如何使与会者受益。 + +## 未来工作 + +虽然讨论未来工作令人兴奋,可能会在你的演讲中提及,但演讲的核心内容应该已经成型,你应该能够在提案中描述它。不要过分依赖未来的数据收集或未来的原型设计,因为事情往往不会按预期发展。确保提供具体的例子和用例。 + +## 不适当或冒犯性内容 + +保持你的语言和语调专业和尊重,避免可能冒犯或疏远参会者的争议性或敏感话题。含有不适当、冒犯性或歧视性内容的提案可能会被拒绝。 + +## 与会议格式不匹配 + +会议有不同的格式,从闪电演讲到工作坊再到主题演讲。确保你的提案与会议的格式和时长相符,并能在该格式中有效传递。考虑你的演讲所需的任何设备、材料或资源。 + +通过避免这些常见陷阱,你可以增加提交成功会议演讲提案的机会,使其与会议目标一致,与参会者相关,并提供新的见解或技术。 diff --git a/_i18n/zh-cn/_posts/2023-03-09-what-about.md b/_i18n/zh-cn/_posts/2023-03-09-what-about.md new file mode 100644 index 00000000000..785c158056c --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-03-09-what-about.md @@ -0,0 +1,20 @@ +--- +title: 我的Python会议演讲应该讲什么? +author: Jesper Dramsch +layout: post +tags: ['Python', 'presentation'] +--- + +当我们终于决定在 Python 会议上发表演讲时,我们常常面临一个矛盾的困境。我们学习了许多令人兴奋的事物。有如此多的内容很有趣。但是我的 Python 演讲应该讲什么呢?! + +所以,恭喜你决定关于 Python 进行演讲!你渴望与他人分享你的知识和经验。让我们深入探讨! + +首先,考虑你的听众。你希望谁来参加你的演讲?他们是 Python 初学者、中级还是高级用户?他们有特定的兴趣或想用 Python 解决的问题吗?了解你的听众的专业知识和兴趣将帮助你决定一个能吸引他们并保持他们参与的主题。 + +接下来,考虑你想要给出的演讲类型。你想深入探讨一个复杂的主题,还是通过动手实践的教程保持简单?你想专注于 Python 的数学能力还是实际应用?选择一个与你的专业知识和热情相符,同时考虑到你的听众的主题至关重要。 + +一旦你决定了主题和演讲类型,考虑你想要设定的基调。你想要轻松有趣,还是更严肃和谨慎?这里没有对错之分,但确保你的基调适合你的主题和听众。 + +记住,你的演讲旨在教育和启发他人了解 Python,所以确保你的要点清晰且有价值。你的听众应该从你的演讲中学到或带走什么?他们如何在 Python 项目或职业中应用所学知识? + +总结一下,在决定 Python 演讲的主题时,考虑你的听众、演讲类型和你想要设定的基调。确保你的要点对你的听众来说清晰且有价值。最重要的是,享受过程并与他人分享你对 Python 的热情! diff --git a/_i18n/zh-cn/_posts/2023-06-25-beyond-python-deadlines.md b/_i18n/zh-cn/_posts/2023-06-25-beyond-python-deadlines.md new file mode 100644 index 00000000000..feb02d8bb10 --- /dev/null +++ b/_i18n/zh-cn/_posts/2023-06-25-beyond-python-deadlines.md @@ -0,0 +1,51 @@ +--- +title: 探索会议截止日期的额外资源 +author: Jesper Dramsch +layout: post +tags: ['Python', 'conferences'] +--- + +在过去的一年里,Pythondeadlin.es 一直是 Python 社区在一个便捷位置查找会议截止日期的热门目的地。 + +然而,了解其他可以增强会议规划体验并促进 Python 社区内合作的宝贵资源也很重要。 + +在这篇博文中,我们将深入探讨两个在汇总会议信息和团结 Python 社区方面发挥重要作用的资源。让我们深入了解! + +## Python-Organizers GitHub:信息宝库 + +[Python-Organizers GitHub 仓库](https://github.com/python-organizers/conferences)对会议组织者、与会者和演讲者都是一个宝贵的资源。 + +它作为会议数据的中心枢纽,提供了组织良好的会议集合、提交截止日期、活动日期、赞助商信息和位置详情。这个协作平台鼓励活动组织者分享他们的会议信息,为数据的准确性和全面性做出贡献。 + +通过利用 Python-Organizers GitHub,您可以获得丰富的知识并与其他组织者合作。 + +无论您是计划参加还是在 Python 会议上发表演讲,这个资源都能帮助您做出明智的决定,并及时了解最新的会议截止日期。 + +GitHub 仓库使互动变得容易,促进社区参与,鼓励个人积极参与促进、发展和成功举办全球 Python 会议。 + +## 官方 Python 活动列表:团结社区 + +通过 Python 邮件列表管理的[官方 Python 活动列表](https://www.python.org/events/)为 Python 社区提供了一个统一的平台。 + +这个综合资源提供了即将举行的 Python 活动概述,包括会议、聚会、研讨会等。虽然它提供了关于截止日期的信息,但它超越了这一点,促进了社区内的合作、网络和想法分享。 + +您可以订阅邮件列表,但网页为您提供了一个地图和一个 Google 日历,您可以轻松订阅以获取更新。这使您能够更有效地可视化和规划会议日程。 + +这个包容性平台汇集了来自不同背景的 Python 爱好者,鼓励他们连接、学习并为充满活力的 Python 生态系统做出贡献。 + +## 拥抱合作以增强会议规划 + +虽然 Pythondeadlin.es 仍然是一个宝贵的资源,但探索更广泛的会议信息聚合领域很重要。 + +Python-Organizers GitHub 仓库和官方 Python 活动列表在团结 Python 社区和促进合作方面发挥着重要作用。 + +通过利用这些资源,您可以了解即将举行的 Python 活动,与志同道合的人连接,并积极为 Python 会议的发展和成功做出贡献。拥抱合作使我们能够创造更强大、更有活力的会议,满足 Python 社区的多样化需求和兴趣。 + +请务必查看以下资源获取更多信息: + +- [Python-Organizers GitHub](https://github.com/python-organizers/conferences) +- [官方 Python 活动列表](https://www.python.org/events/) + +通过利用这些平台,我们可以了解即将举行的 Python 活动,与志同道合的人连接,并积极为我们的会议成功做出贡献。让我们合作,分享我们的知识,打造一个更强大的 Python 社区。 + +一起,我们可以塑造 Python 活动的未来,培育一个每个人都可以学习、成长和繁荣的环境。 diff --git a/_i18n/zh-cn/calendar/description.md b/_i18n/zh-cn/calendar/description.md new file mode 100644 index 00000000000..a2037bd4a36 --- /dev/null +++ b/_i18n/zh-cn/calendar/description.md @@ -0,0 +1,6 @@ +PythonDeadlin.es 提供的 Python 会议截止日期和日程的日历概览。 + +您可以选择将**所有截止日期**导出到 Google 日历 或 +iCal。此日历非常适合跟踪实际截止日期! + +或者,您可以订阅**即将举行的 Python 活动**到您的 Google 日历iCal。这是传统的"活动日历"。 diff --git a/_i18n/zh-cn/dates/pretty_dates.html b/_i18n/zh-cn/dates/pretty_dates.html new file mode 100644 index 00000000000..a4694e7da93 --- /dev/null +++ b/_i18n/zh-cn/dates/pretty_dates.html @@ -0,0 +1,49 @@ +{% if include.start == nil and include.end == nil %} + {% capture pretty_date %}{% t "times.tba" %}{% endcapture %} +{% elsif include.start == nil %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.until" %} {{ end_year }}年{{ end_month }}{{ end_day }}日{% endcapture %} +{% elsif include.end == nil %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign start_day = start_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% capture pretty_date %}{% t "times.from" %} {{ start_year }}年{{ start_month }}{{ start_day }}日{% endcapture %} +{% else %} + {% assign start_date = include.start | date: "%Y-%m-%d" %} + {% assign end_date = include.end | date: "%Y-%m-%d" %} + + {% if start_date == end_date %} + {% assign day = start_date | date: "%-d" %} + {% assign year = start_date | date: "%Y" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture pretty_date %}{{ year }}年{{ month }}{{ day }}日{% endcapture %} + + {% elsif start_date | date: "%Y-%m" == end_date | date: "%Y-%m" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ year }}年{{ month }}{{ start_day }}日至{{ end_day }}日{% endcapture %} + + {% elsif start_date | date: "%Y" == end_date | date: "%Y" %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign year = start_date | date: "%Y" %} + {% capture pretty_date %}{{ year }}年{{ start_month }}{{ start_day }}日至{{ end_month }}{{ end_day }}日{% endcapture %} + + {% else %} + {% assign start_day = start_date | date: "%-d" %} + {% assign end_day = end_date | date: "%-d" %} + {% capture start_month %}{% t "times.months.{{ start_date | date: '%B' }}" %}{% endcapture %} + {% capture end_month %}{% t "times.months.{{ end_date | date: '%B' }}" %}{% endcapture %} + {% assign start_year = start_date | date: "%Y" %} + {% assign end_year = end_date | date: "%Y" %} + {% capture pretty_date %}{{ start_year }}年{{ start_month }}{{ start_day }}日至{{ end_year }}年{{ end_month }}{{ end_day }}日{% endcapture %} + {% endif %} +{% endif %}{{ pretty_date | strip }} \ No newline at end of file diff --git a/_i18n/zh-cn/footer/jesper.md b/_i18n/zh-cn/footer/jesper.md new file mode 100644 index 00000000000..b94e207c510 --- /dev/null +++ b/_i18n/zh-cn/footer/jesper.md @@ -0,0 +1 @@ +Jesper DramschML.recipesdata-science-gui.deLate to the Party 🎉Latent Space 社区的创建者。 diff --git a/_i18n/zh-cn/footer/maintainer.md b/_i18n/zh-cn/footer/maintainer.md new file mode 100644 index 00000000000..aef8eaf4388 --- /dev/null +++ b/_i18n/zh-cn/footer/maintainer.md @@ -0,0 +1,4 @@ +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +

Jesper Dramsch 创建 • 开源 • 社区驱动

+

灵感来源于 aideadlin.es • 自2022年以来已归档 {{confs | size}} 个Python会议

diff --git a/_i18n/zh-cn/footer/terms.md b/_i18n/zh-cn/footer/terms.md new file mode 100644 index 00000000000..24db9c649f9 --- /dev/null +++ b/_i18n/zh-cn/footer/terms.md @@ -0,0 +1,3 @@ +

不保证内容的准确性,请通过提交拉取请求来纠正错误。

+ +条款隐私政策 diff --git a/_i18n/zh-cn/formatter/countries.html b/_i18n/zh-cn/formatter/countries.html new file mode 100644 index 00000000000..4c0a5a4d14c --- /dev/null +++ b/_i18n/zh-cn/formatter/countries.html @@ -0,0 +1,193 @@ +{ name: '阿富汗', code: 'AFG', flag: '🇦🇫' }, +{ name: '阿尔巴尼亚', code: 'ALB', flag: '🇦🇱' }, +{ name: '阿尔及利亚', code: 'DZA', flag: '🇩🇿' }, +{ name: '安道尔', code: 'AND', flag: '🇦🇩' }, +{ name: '安哥拉', code: 'AGO', flag: '🇦🇴' }, +{ name: '安提瓜和巴布达', code: 'ATG', flag: '🇦🇬' }, +{ name: '阿根廷', code: 'ARG', flag: '🇦🇷' }, +{ name: '亚美尼亚', code: 'ARM', flag: '🇦🇲' }, +{ name: '澳大利亚', code: 'AUS', flag: '🇦🇺' }, +{ name: '奥地利', code: 'AUT', flag: '🇦🇹' }, +{ name: '阿塞拜疆', code: 'AZE', flag: '🇦🇿' }, +{ name: '巴哈马', code: 'BHS', flag: '🇧🇸' }, +{ name: '巴林', code: 'BHR', flag: '🇧🇭' }, +{ name: '孟加拉国', code: 'BGD', flag: '🇧🇩' }, +{ name: '巴巴多斯', code: 'BRB', flag: '🇧🇧' }, +{ name: '白俄罗斯', code: 'BLR', flag: '🇧🇾' }, +{ name: '比利时', code: 'BEL', flag: '🇧🇪' }, +{ name: '伯利兹', code: 'BLZ', flag: '🇧🇿' }, +{ name: '贝宁', code: 'BEN', flag: '🇧🇯' }, +{ name: '不丹', code: 'BTN', flag: '🇧🇹' }, +{ name: '玻利维亚', code: 'BOL', flag: '🇧🇴' }, +{ name: '波斯尼亚和黑塞哥维那', code: 'BIH', flag: '🇧🇦' }, +{ name: '博茨瓦纳', code: 'BWA', flag: '🇧🇼' }, +{ name: '巴西', code: 'BRA', flag: '🇧🇷' }, +{ name: '文莱', code: 'BRN', flag: '🇧🇳' }, +{ name: '保加利亚', code: 'BGR', flag: '🇧🇬' }, +{ name: '布基纳法索', code: 'BFA', flag: '🇧🇫' }, +{ name: '布隆迪', code: 'BDI', flag: '🇧🇮' }, +{ name: '柬埔寨', code: 'KHM', flag: '🇰🇭' }, +{ name: '喀麦隆', code: 'CMR', flag: '🇨🇲' }, +{ name: '加拿大', code: 'CAN', flag: '🇨🇦' }, +{ name: '佛得角', code: 'CPV', flag: '🇨🇻' }, +{ name: '中非共和国', code: 'CAF', flag: '🇨🇫' }, +{ name: '乍得', code: 'TCD', flag: '🇹🇩' }, +{ name: '智利', code: 'CHL', flag: '🇨🇱' }, +{ name: '中国', code: 'CHN', flag: '🇨🇳' }, +{ name: '哥伦比亚', code: 'COL', flag: '🇨🇴' }, +{ name: '科摩罗', code: 'COM', flag: '🇰🇲' }, +{ name: '刚果', code: 'COG', flag: '🇨🇬' }, +{ name: '哥斯达黎加', code: 'CRI', flag: '🇨🇷' }, +{ name: '克罗地亚', code: 'HRV', flag: '🇭🇷' }, +{ name: '古巴', code: 'CUB', flag: '🇨🇺' }, +{ name: '塞浦路斯', code: 'CYP', flag: '🇨🇾' }, +{ name: '捷克共和国', code: 'CZE', flag: '🇨🇿' }, +{ name: '丹麦', code: 'DNK', flag: '🇩🇰' }, +{ name: '吉布提', code: 'DJI', flag: '🇩🇯' }, +{ name: '多米尼克', code: 'DMA', flag: '🇩🇲' }, +{ name: '多米尼加共和国', code: 'DOM', flag: '🇩🇴' }, +{ name: '厄瓜多尔', code: 'ECU', flag: '🇪🇨' }, +{ name: '埃及', code: 'EGY', flag: '🇪🇬' }, +{ name: '萨尔瓦多', code: 'SLV', flag: '🇸🇻' }, +{ name: '赤道几内亚', code: 'GNQ', flag: '🇬🇶' }, +{ name: '厄立特里亚', code: 'ERI', flag: '🇪🇷' }, +{ name: '爱沙尼亚', code: 'EST', flag: '🇪🇪' }, +{ name: '埃塞俄比亚', code: 'ETH', flag: '🇪🇹' }, +{ name: '斐济', code: 'FJI', flag: '🇫🇯' }, +{ name: '芬兰', code: 'FIN', flag: '🇫🇮' }, +{ name: '法国', code: 'FRA', flag: '🇫🇷' }, +{ name: '加蓬', code: 'GAB', flag: '🇬🇦' }, +{ name: '冈比亚', code: 'GMB', flag: '🇬🇲' }, +{ name: '格鲁吉亚', code: 'GEO', flag: '🇬🇪' }, +{ name: '德国', code: 'DEU', flag: '🇩🇪' }, +{ name: '加纳', code: 'GHA', flag: '🇬🇭' }, +{ name: '希腊', code: 'GRC', flag: '🇬🇷' }, +{ name: '格林纳达', code: 'GRD', flag: '🇬🇩' }, +{ name: '危地马拉', code: 'GTM', flag: '🇬🇹' }, +{ name: '几内亚', code: 'GIN', flag: '🇬🇳' }, +{ name: '几内亚比绍', code: 'GNB', flag: '🇬🇼' }, +{ name: '圭亚那', code: 'GUY', flag: '🇬🇾' }, +{ name: '海地', code: 'HTI', flag: '🇭🇹' }, +{ name: '洪都拉斯', code: 'HND', flag: '🇭🇳' }, +{ name: '匈牙利', code: 'HUN', flag: '🇭🇺' }, +{ name: '冰岛', code: 'ISL', flag: '🇮🇸' }, +{ name: '印度', code: 'IND', flag: '🇮🇳' }, +{ name: '印度尼西亚', code: 'IDN', flag: '🇮🇩' }, +{ name: '伊朗', code: 'IRN', flag: '🇮🇷' }, +{ name: '伊拉克', code: 'IRQ', flag: '🇮🇶' }, +{ name: '爱尔兰', code: 'IRL', flag: '🇮🇪' }, +{ name: '以色列', code: 'ISR', flag: '🇮🇱' }, +{ name: '意大利', code: 'ITA', flag: '🇮🇹' }, +{ name: '牙买加', code: 'JAM', flag: '🇯🇲' }, +{ name: '日本', code: 'JPN', flag: '🇯🇵' }, +{ name: '约旦', code: 'JOR', flag: '🇯🇴' }, +{ name: '哈萨克斯坦', code: 'KAZ', flag: '🇰🇿' }, +{ name: '肯尼亚', code: 'KEN', flag: '🇰🇪' }, +{ name: '基里巴斯', code: 'KIR', flag: '🇰🇮' }, +{ name: '朝鲜', code: 'PRK', flag: '🇰🇵' }, +{ name: '韩国', code: 'KOR', flag: '🇰🇷' }, +{ name: '科威特', code: 'KWT', flag: '🇰🇼' }, +{ name: '吉尔吉斯斯坦', code: 'KGZ', flag: '🇰🇬' }, +{ name: '老挝', code: 'LAO', flag: '🇱🇦' }, +{ name: '拉脱维亚', code: 'LVA', flag: '🇱🇻' }, +{ name: '黎巴嫩', code: 'LBN', flag: '🇱🇧' }, +{ name: '莱索托', code: 'LSO', flag: '🇱🇸' }, +{ name: '利比里亚', code: 'LBR', flag: '🇱🇷' }, +{ name: '利比亚', code: 'LBY', flag: '🇱🇾' }, +{ name: '列支敦士登', code: 'LIE', flag: '🇱🇮' }, +{ name: '立陶宛', code: 'LTU', flag: '🇱🇹' }, +{ name: '卢森堡', code: 'LUX', flag: '🇱🇺' }, +{ name: '马其顿', code: 'MKD', flag: '🇲🇰' }, +{ name: '马达加斯加', code: 'MDG', flag: '🇲🇬' }, +{ name: '马拉维', code: 'MWI', flag: '🇲🇼' }, +{ name: '马来西亚', code: 'MYS', flag: '🇲🇾' }, +{ name: '马尔代夫', code: 'MDV', flag: '🇲🇻' }, +{ name: '马里', code: 'MLI', flag: '🇲🇱' }, +{ name: '马耳他', code: 'MLT', flag: '🇲🇹' }, +{ name: '马绍尔群岛', code: 'MHL', flag: '🇲🇭' }, +{ name: '毛里塔尼亚', code: 'MRT', flag: '🇲🇷' }, +{ name: '毛里求斯', code: 'MUS', flag: '🇲🇺' }, +{ name: '墨西哥', code: 'MEX', flag: '🇲🇽' }, +{ name: '密克罗尼西亚', code: 'FSM', flag: '🇫🇲' }, +{ name: '摩尔多瓦', code: 'MDA', flag: '🇲🇩' }, +{ name: '摩纳哥', code: 'MCO', flag: '🇲🇨' }, +{ name: '蒙古', code: 'MNG', flag: '🇲🇳' }, +{ name: '黑山', code: 'MNE', flag: '🇲🇪' }, +{ name: '摩洛哥', code: 'MAR', flag: '🇲🇦' }, +{ name: '莫桑比克', code: 'MOZ', flag: '🇲🇿' }, +{ name: '缅甸', code: 'MMR', flag: '🇲🇲' }, +{ name: '纳米比亚', code: 'NAM', flag: '🇳🇦' }, +{ name: '瑙鲁', code: 'NRU', flag: '🇳🇷' }, +{ name: '尼泊尔', code: 'NPL', flag: '🇳🇵' }, +{ name: '荷兰', code: 'NLD', flag: '🇳🇱' }, +{ name: '新西兰', code: 'NZL', flag: '🇳🇿' }, +{ name: '尼加拉瓜', code: 'NIC', flag: '🇳🇮' }, +{ name: '尼日尔', code: 'NER', flag: '🇳🇪' }, +{ name: '尼日利亚', code: 'NGA', flag: '🇳🇬' }, +{ name: '挪威', code: 'NOR', flag: '🇳🇴' }, +{ name: '阿曼', code: 'OMN', flag: '🇴🇲' }, +{ name: '巴基斯坦', code: 'PAK', flag: '🇵🇰' }, +{ name: '帕劳', code: 'PLW', flag: '🇵🇼' }, +{ name: '巴拿马', code: 'PAN', flag: '🇵🇦' }, +{ name: '巴布亚新几内亚', code: 'PNG', flag: '🇵🇬' }, +{ name: '巴拉圭', code: 'PRY', flag: '🇵🇾' }, +{ name: '秘鲁', code: 'PER', flag: '🇵🇪' }, +{ name: '菲律宾', code: 'PHL', flag: '🇵🇭' }, +{ name: '波兰', code: 'POL', flag: '🇵🇱' }, +{ name: '葡萄牙', code: 'PRT', flag: '🇵🇹' }, +{ name: '卡塔尔', code: 'QAT', flag: '🇶🇦' }, +{ name: '罗马尼亚', code: 'ROU', flag: '🇷🇴' }, +{ name: '俄罗斯', code: 'RUS', flag: '🇷🇺' }, +{ name: '卢旺达', code: 'RWA', flag: '🇷🇼' }, +{ name: '圣基茨和尼维斯', code: 'KNA', flag: '🇰🇳' }, +{ name: '圣卢西亚', code: 'LCA', flag: '🇱🇨' }, +{ name: '圣文森特和格林纳丁斯', code: 'VCT', flag: '🇻🇨' }, +{ name: '萨摩亚', code: 'WSM', flag: '🇼🇸' }, +{ name: '圣马力诺', code: 'SMR', flag: '🇸🇲' }, +{ name: '圣多美和普林西比', code: 'STP', flag: '🇸🇹' }, +{ name: '沙特阿拉伯', code: 'SAU', flag: '🇸🇦' }, +{ name: '塞内加尔', code: 'SEN', flag: '🇸🇳' }, +{ name: '塞尔维亚', code: 'SRB', flag: '🇷🇸' }, +{ name: '塞舌尔', code: 'SYC', flag: '🇸🇨' }, +{ name: '塞拉利昂', code: 'SLE', flag: '🇸🇱' }, +{ name: '新加坡', code: 'SGP', flag: '🇸🇬' }, +{ name: '斯洛伐克', code: 'SVK', flag: '🇸🇰' }, +{ name: '斯洛文尼亚', code: 'SVN', flag: '🇸🇮' }, +{ name: '所罗门群岛', code: 'SLB', flag: '🇸🇧' }, +{ name: '索马里', code: 'SOM', flag: '🇸🇴' }, +{ name: '南非', code: 'ZAF', flag: '🇿🇦' }, +{ name: '南苏丹', code: 'SSD', flag: '🇸🇸' }, +{ name: '西班牙', code: 'ESP', flag: '🇪🇸' }, +{ name: '斯里兰卡', code: 'LKA', flag: '🇱🇰' }, +{ name: '苏丹', code: 'SDN', flag: '🇸🇩' }, +{ name: '苏里南', code: 'SUR', flag: '🇸🇷' }, +{ name: '斯威士兰', code: 'SWZ', flag: '🇸🇿' }, +{ name: '瑞典', code: 'SWE', flag: '🇸🇪' }, +{ name: '瑞士', code: 'CHE', flag: '🇨🇭' }, +{ name: '叙利亚', code: 'SYR', flag: '🇸🇾' }, +{ name: '台湾', code: 'TWN', flag: '🇹🇼' }, +{ name: '塔吉克斯坦', code: 'TJK', flag: '🇹🇯' }, +{ name: '坦桑尼亚', code: 'TZA', flag: '🇹🇿' }, +{ name: '泰国', code: 'THA', flag: '🇹🇭' }, +{ name: '东帝汶', code: 'TLS', flag: '🇹🇱' }, +{ name: '多哥', code: 'TGO', flag: '🇹🇬' }, +{ name: '汤加', code: 'TON', flag: '🇹🇴' }, +{ name: '特立尼达和多巴哥', code: 'TTO', flag: '🇹🇹' }, +{ name: '突尼斯', code: 'TUN', flag: '🇹🇳' }, +{ name: '土耳其', code: 'TUR', flag: '🇹🇷' }, +{ name: '土库曼斯坦', code: 'TKM', flag: '🇹🇲' }, +{ name: '图瓦卢', code: 'TUV', flag: '🇹🇻' }, +{ name: '乌干达', code: 'UGA', flag: '🇺🇬' }, +{ name: '乌克兰', code: 'UKR', flag: '🇺🇦' }, +{ name: '阿拉伯联合酋长国', code: 'ARE', flag: '🇦🇪' }, +{ name: '英国', code: 'GBR', flag: '🇬🇧' }, +{ name: '美国', code: 'USA', flag: '🇺🇸' }, +{ name: '乌拉圭', code: 'URY', flag: '🇺🇾' }, +{ name: '乌兹别克斯坦', code: 'UZB', flag: '🇺🇿' }, +{ name: '瓦努阿图', code: 'VUT', flag: '🇻🇺' }, +{ name: '梵蒂冈', code: 'VAT', flag: '🇻🇦' }, +{ name: '委内瑞拉', code: 'VEN', flag: '🇻🇪' }, +{ name: '越南', code: 'VNM', flag: '🇻🇳' }, +{ name: '也门', code: 'YEM', flag: '🇾🇪' }, +{ name: '赞比亚', code: 'ZMB', flag: '🇿🇲' }, +{ name: '津巴布韦', code: 'ZWE', flag: '🇿🇼' }, diff --git a/_i18n/zh-cn/formatter/submission.html b/_i18n/zh-cn/formatter/submission.html new file mode 100644 index 00000000000..2a036c64ebb --- /dev/null +++ b/_i18n/zh-cn/formatter/submission.html @@ -0,0 +1,56 @@ +
+
如何提交您的会议信息
+ +
+
1. Python-Organizers CSV格式
+

+ 将您的会议添加到 + python-organizers/conferences + 存储库: +

+
    +
  • 复刻(Fork)该存储库
  • +
  • 编辑对应年份的CSV文件
  • +
  • 添加您的会议数据行
  • +
  • 提交拉取请求(Pull Request)
  • +
+
+ +
+
2. PythonDeadlin.es YAML格式
+

+ 将您的会议添加到 + jesperdramsch/python-deadlines: +

+
    +
  • 复刻(Fork)该存储库
  • +
  • 编辑`_data/conferences.yml`文件
  • +
  • 在适当位置添加您的会议YAML数据
  • +
  • 提交拉取请求(Pull Request)
  • +
+
+ +
+
3. Python.org日历格式
+

将您的会议提交到官方Python活动日历:

+
    +
  • + 发送邮件至 + + href="mailto:events@python.org" + >events[at]python.org + ,附上日历格式文本 +
  • +
  • 邮件主题为:"Python Event Submission: [您的会议名称]"
  • +
  • 等待Python活动团队的确认
  • +
+
+ +
+ 提示: 向所有三个平台提交,以最大限度地提高 + 您的Python会议的可见度! +
+
diff --git a/_i18n/zh-cn/frontpage/description.md b/_i18n/zh-cn/frontpage/description.md new file mode 100644 index 00000000000..f8be7699a46 --- /dev/null +++ b/_i18n/zh-cn/frontpage/description.md @@ -0,0 +1,5 @@ +这个社区工具作为 Python 会议参与征集、提案、工作坊和教程截止日期的中央存储库。 + +这些日期以倒计时形式提供,以本地时区显示! + +截止日期显示在您的本地时区。要在会议网站时区中查看它们,请点击会议。 diff --git a/_i18n/zh-cn/frontpage/hook.md b/_i18n/zh-cn/frontpage/hook.md new file mode 100644 index 00000000000..2e2129683db --- /dev/null +++ b/_i18n/zh-cn/frontpage/hook.md @@ -0,0 +1 @@ +PythonDeadlin.es 为您整理精选Python会议。 diff --git a/_i18n/zh-cn/maps/description.md b/_i18n/zh-cn/maps/description.md new file mode 100644 index 00000000000..196a8ce9766 --- /dev/null +++ b/_i18n/zh-cn/maps/description.md @@ -0,0 +1,3 @@ +在地图上查看会议截止日期和会议日期概览。 + +下面是 PythonDeadlin.es 上列出的所有未来 Python 会议,以地理空间格式呈现。 diff --git a/_i18n/zh-cn/resources/description.md b/_i18n/zh-cn/resources/description.md new file mode 100644 index 00000000000..f561613e356 --- /dev/null +++ b/_i18n/zh-cn/resources/description.md @@ -0,0 +1,5 @@ +本页致力于帮助您为 Python 会议撰写出色的提案征集(CfP)。在这里,您将找到关于撰写引人注目的提案的博客文章、指南和技巧的集合。 + +我们的资源涵盖 CfP 写作的各个方面,从选择主题到构建您的提交。无论您是首次演讲者还是经验丰富的演讲者,这些工具都旨在提升您的提案写作技能。 + +探索我们精选的内容,增加您在全球 Python 活动中使演讲或工作坊被接受的机会。 diff --git a/_i18n/zh-cn/search/description.md b/_i18n/zh-cn/search/description.md new file mode 100644 index 00000000000..92c635eff5f --- /dev/null +++ b/_i18n/zh-cn/search/description.md @@ -0,0 +1,5 @@ +从我们全面的 Python 会议截止日期和活动数据库中的搜索结果。结果以与您的查询匹配的相关页面列表形式呈现。 + +每个结果包含关键详细信息,如会议名称、截止日期和简要描述。截止日期显示在您的本地时区。 + +点击会议名称可查看更详细的信息,包括指南和官方会议网站的链接。 diff --git a/_i18n/zh-cn/series/description.md b/_i18n/zh-cn/series/description.md new file mode 100644 index 00000000000..818d6563ac7 --- /dev/null +++ b/_i18n/zh-cn/series/description.md @@ -0,0 +1,4 @@ +我们社区工具的这一部分作为重复性 Python 会议系列的综合目录。在这里,您将找到常规活动的概览、它们的典型日程安排和历史信息。 + +这些系列以简短的描述和过去活动的链接呈现,帮助您规划长期的会议参与。 +查看系列以查看更多详情并访问有关其即将举行和过去活动的信息。 diff --git a/_i18n/zh-cn/trademark/django.md b/_i18n/zh-cn/trademark/django.md new file mode 100644 index 00000000000..5cc96ce3e14 --- /dev/null +++ b/_i18n/zh-cn/trademark/django.md @@ -0,0 +1,2 @@ +

Django 是 Django 软件基金会的注册商标。本网站 pythondeadlin.es 与 Django 软件基金会或任何 Django 活动没有关联、认可或赞助关系。本网站上使用的所有商标和标志仍然是其各自所有者的财产。对 Django 或其他商标的任何引用仅供参考,不暗示与商标持有者有任何关联。

+

有关 Django 软件基金会及其商标的更多信息,请访问 https://www.djangoproject.com/foundation/

diff --git a/_i18n/zh-cn/trademark/generic.md b/_i18n/zh-cn/trademark/generic.md new file mode 100644 index 00000000000..4730ef592e7 --- /dev/null +++ b/_i18n/zh-cn/trademark/generic.md @@ -0,0 +1 @@ +

本网站上列出的活动所建立的商标或标志的任何使用仅出于信息目的,不暗示与各自商标持有者的关联。如果您是商标持有者,希望从本网站上移除您的商标,请与我们联系。

diff --git a/_i18n/zh-cn/trademark/pycon.md b/_i18n/zh-cn/trademark/pycon.md new file mode 100644 index 00000000000..d4e9d1ec044 --- /dev/null +++ b/_i18n/zh-cn/trademark/pycon.md @@ -0,0 +1 @@ +

Python、PyCon 和 PyLadies 是 Python 软件基金会的注册商标。本网站 pythondeadlin.es 与 Python 软件基金会或任何 PyCon 活动没有关联、认可或赞助关系。本网站上使用的所有商标和标志仍然是其各自所有者的财产。对 PyCon 或其他商标的任何引用仅供参考,不暗示与商标持有者有任何关联。

diff --git a/_i18n/zh-cn/trademark/pydata.md b/_i18n/zh-cn/trademark/pydata.md new file mode 100644 index 00000000000..3548acaa0bc --- /dev/null +++ b/_i18n/zh-cn/trademark/pydata.md @@ -0,0 +1 @@ +

NumFOCUS、PyData 和 Fiscally Sponsored Projects 是 NumFOCUS 的注册商标。本网站 pythondeadlin.es 与 NumFOCUS 或任何 PyData 或附属活动没有关联、认可或赞助关系。本网站上使用的所有商标和标志仍然是其各自所有者的财产。对 NumFOCUS、PyData 或其他商标的任何引用仅供参考,不暗示与商标持有者有任何关联。

diff --git a/_includes/action_bar.html b/_includes/action_bar.html new file mode 100644 index 00000000000..751a07c1089 --- /dev/null +++ b/_includes/action_bar.html @@ -0,0 +1,60 @@ + +{% assign conf_id = include.conf_id %} +{% assign is_saved = false %} +{% assign is_series = false %} + + + + +
+ +
+ + + + + + diff --git a/_includes/breadcrumbs.html b/_includes/breadcrumbs.html new file mode 100644 index 00000000000..cb6c2fb845e --- /dev/null +++ b/_includes/breadcrumbs.html @@ -0,0 +1,21 @@ + + diff --git a/_includes/calendar.js b/_includes/calendar.js index ceee6103adf..b84620792a8 100644 --- a/_includes/calendar.js +++ b/_includes/calendar.js @@ -4,7 +4,7 @@ clickDay: function (e) { if (e.events.length > 0) { for (var i in e.events) { - window.open("{{site.baseurl}}/conference?id=" + e.events[i].abbreviation, "_self") + window.open("{{site.baseurl}}/conference/" + e.events[i].abbreviation, "_self") } } }, @@ -16,8 +16,8 @@ var headline_color = ""; var break_html = '
'; - var location_html = ' ' + e.events[i].location; - var date_html = ' ' + e.events[i].date; + var location_html = 'Location icon ' + e.events[i].location; + var date_html = 'Calendar icon ' + e.events[i].date; var badges_html = ""; var subs = e.events[i].subject.split(','); @@ -36,9 +36,9 @@ } else { } content += - '
' + + '
' + '
' + - '' + e.events[i].name + '' + + '' + e.events[i].name + '' + '
' + '
' + location_html + @@ -59,12 +59,14 @@ }); $(e.element).popover("show"); + timeoutPopover(e); } }, - mouseOutDay: function (e) { - if (e.events.length > 0) { - $(e.element).popover("hide"); - } + focusoutDay: function (e) { + // if (e.events.length > 0) { + // $(e.element).popover("hide"); + // } + timeoutPopover(e); }, customDayRenderer: function (cellContent, currentDate) { var today = new Date(); @@ -74,34 +76,76 @@ } }, dayContextMenu: function (e) { - $(e.element).popover("hide"); + // $(e.element).popover("hide"); + timeoutPopover(e); }, dataSource: conf_list_all - } +} + +// Function to show the popover +function timeoutPopover(e) { + // Ensure e has a property to store the timeout if it doesn't already exist + if (!e.hidePopoverTimeout) { + e.hidePopoverTimeout = null; + } + + // Mouse enter event for the calendar item to show the popover + $(e.element).mouseover(function() { + clearTimeout(e.hidePopoverTimeout); // Cancel any pending hide operation + $(e.element).popover('show'); + }); + + // Mouse leave event for the calendar item to hide the popover + $(e.element).mouseout(function() { + // Start a timeout when leaving the element, gives a buffer time to move to the popover + e.hidePopoverTimeout = setTimeout(function() { + $(e.element).popover('hide'); + }, 300); // Adjust delay as needed + }); + + // Prevent popover from hiding when mouse is over the popover + $("body").on('mouseover', '.popover', function() { + clearTimeout(e.hidePopoverTimeout); + }).on('mouseout', '.popover', function() { + // Hide the popover when leaving it after a delay, allows returning to the calendar item + e.hidePopoverTimeout = setTimeout(function() { + $(e.element).popover('hide'); + }, 300); // Adjust delay as needed + }); +} + + function load_conference_list() { // Gather data var conf_list_all = []; {% for conf in site.data.conferences + site.data.archive %} + {% if conf.cfp_ext %} + {% assign cfp = conf.cfp_ext %} + {% assign extended = "(extended)" %} + {% else %} + {% assign cfp = conf.cfp %} + {% endif %} + {% capture conf_date %}{%- translate_file dates/pretty_dates.html start=conf.start end=conf.end -%}{% endcapture %} // add deadlines in red conf_list_all.push({ - id: "{{conf.id}}-deadline", - abbreviation: "{{conf.id}}", - name: "{{conf.title}} {{conf.year}} CfP", + id: "{{conf.conference | slugify: "latin"}}-{{conf.year}}-deadline", + abbreviation: "{{conf.conference | slugify: "latin"}}-{{conf.year}}", + name: "{{conf.conference}} {{conf.year}} CfP {{extended}}", color: "red", location: "{{conf.place}}", - date: "{{conf.date}}", + date: "{{conf_date | strip}}", subject: "{{conf.sub}}", - startDate: Date.parse("{{conf.cfp}}"), - endDate: Date.parse("{{conf.cfp}}"), + startDate: Date.parse("{{cfp}}"), + endDate: Date.parse("{{cfp}}"), }); {% if conf.workshop_deadline %} conf_list_all.push({ - id: "{{conf.id}}-deadline", - abbreviation: "{{conf.id}}", - name: "{{conf.title}} {{conf.year}} Workshop Deadline", + id: "{{conf.conference | slugify: "latin"}}-{{conf.year}}-deadline", + abbreviation: "{{conf.conference | slugify: "latin"}}-{{conf.year}}", + name: "{{conf.conference}} {{conf.year}} Workshop Deadline", color: "red", location: "{{conf.place}}", - date: "{{conf.date}}", + date: "{{ conf_date | strip }}", subject: "{{conf.sub}}", startDate: Date.parse("{{conf.workshop_deadline}}"), endDate: Date.parse("{{conf.workshop_deadline}}"), @@ -109,15 +153,15 @@ function load_conference_list() { {% endif %} {% if conf.tutorial_deadline %} conf_list_all.push({ - id: "{{conf.id}}-deadline", - abbreviation: "{{conf.id}}", - name: "{{conf.title}} {{conf.year}} Tutorial Deadline", + id: "{{conf.conference | slugify: "latin"}}-{{conf.year}}-deadline", + abbreviation: "{{conf.conference | slugify: "latin"}}-{{conf.year}}", + name: "{{conf.conference}} {{conf.year}} Tutorial Deadline", color: "red", location: "{{conf.place}}", - date: "{{conf.date}}", + date: "{{ conf_date | strip }}", subject: "{{conf.sub}}", - startDate: Date.parse("{{conf.cfp}}"), - endDate: Date.parse("{{conf.cfp}}"), + startDate: Date.parse("{{cfp}}"), + endDate: Date.parse("{{cfp}}"), }); {% endif %} @@ -131,12 +175,12 @@ function load_conference_list() { {% endif %} {% endfor %} conf_list_all.push({ - id: "{{conf.id}}-conference", - abbreviation: "{{conf.id}}", - name: "{{conf.title}} {{conf.year}}", + id: "{{conf.conference | slugify: "latin"}}-{{conf.year}}-conference", + abbreviation: "{{conf.conference | slugify: "latin"}}-{{conf.year}}", + name: "{{conf.conference}} {{conf.year}}", color: color, location: "{{conf.place}}", - date: "{{conf.date}}", + date: "{{ conf_date | strip }}", subject: "{{conf.sub}}", startDate: Date.parse("{{conf.start}}"), endDate: Date.parse("{{conf.end}}"), @@ -148,7 +192,13 @@ function load_conference_list() { } function update_filtering(data) { - store.set('{{site.domain}}-subs', data.subs); + // Defensive check for data parameter + if (!data || typeof data !== 'object' || !data.subs || !Array.isArray(data.subs)) { + console.error('calendar update_filtering called with invalid data:', data); + return; + } + + store.set('{{site.domain}}-subs', {subs: data.subs, timestamp: new Date().getTime()}); conf_list = conf_list_all.filter(v => { var commonValues = data.subs.filter(function (value) { @@ -160,11 +210,13 @@ function update_filtering(data) { // rerender calendar calendar_data['dataSource'] = conf_list; // need to update only this + calendar_data['language'] = "{{site.lang}}"; calendar = new Calendar("#calendar-page", calendar_data); - if (subs.length == 0) { - window.history.pushState('', '', page_url); - } else { - window.history.pushState('', '', page_url + '/?sub=' + data.subs.join()); - } -} \ No newline at end of file + if (data.subs.length === 0 || data.subs.length == data.all_subs.length) { + window.history.pushState('', '', page_url); + } else { + // Join the selected values into a query parameter + window.history.pushState('', '', page_url + '?sub=' + data.subs.join()); + } +} diff --git a/_includes/conference_detail_actions.html b/_includes/conference_detail_actions.html new file mode 100644 index 00000000000..08a616cf77d --- /dev/null +++ b/_includes/conference_detail_actions.html @@ -0,0 +1,68 @@ + +{% assign conf_id = page.conference | append: "-" | append: page.year | slugify: "latin" %} {% assign cfp_date = +page.cfp_ext | default: page.cfp %} + +
+ + + + + + + + +
diff --git a/_includes/footer.html b/_includes/footer.html index f28bbdb932c..1298807fc53 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,17 +1,36 @@ -
-
- {{ site.domain }} - is maintained by - Jesper Dramsch since 2022.
It was inspired (and coded) by the fantastic aideadlin.es. No guarantee for correctness, please correct mistakes by submitting a pull request.
-
-
-
- +
+
+
{% tf footer/maintainer.md %}
+
+
+
+
+ + + + +
+
+
+
+
+
{% tf footer/terms.md %}
+
+
+
+
{% tf footer/jesper.md %}
+
+
+
+ +
+
+{% include google_analytics.js %} diff --git a/_includes/google_analytics.js b/_includes/google_analytics.js index 37457952fd0..2f9e6e67c32 100644 --- a/_includes/google_analytics.js +++ b/_includes/google_analytics.js @@ -3,7 +3,7 @@ {% endif %} {% if site.ga_id %} - + -{% endif %} \ No newline at end of file +{% endif %} diff --git a/_includes/handle_url_retrieval.js b/_includes/handle_url_retrieval.js index d55bbba8ce7..416f633a576 100644 --- a/_includes/handle_url_retrieval.js +++ b/_includes/handle_url_retrieval.js @@ -1,15 +1,19 @@ // Get subjects from URL/Cache var url = new URL(window.location); -subs = url.searchParams.get("sub"); +subs = url.searchParams.get('sub'); if (subs == undefined) { - subs = store.get("{{site.domain}}-subs"); + data = store.get('{{site.domain}}-subs'); + if (!data || typeof data !== 'object' || isDataExpired(data)) { + data = { subs: all_subs }; + } + subs = data.subs; } else { - subs = subs.toUpperCase().split(","); + subs = subs.toUpperCase().split(','); } // Apply selections if (subs == undefined) { - subs = all_subs; + subs = all_subs; } -$("#subject-select").multiselect("select", subs); +$('#subject-select').multiselect('select', subs); update_filtering({ subs: subs, all_subs: all_subs }); diff --git a/_includes/head.html b/_includes/head.html index db9f97e4d90..5fa233c0f8f 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -1,17 +1,43 @@ + + -{{ site.title }} - - - +{% capture base_title %}{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}{% endcapture %} +{% assign start_title = base_title | split: "." | first %} +{% capture title %}{% if start_title == "titles" %}{% t base_title %}{% else %}{{ base_title }}{% endif %}{% endcapture %} - - - +{{title}} | PythonDeadlin.es +{% seo title=false %} - + +{% assign page_path = page.permalink | default: page.url %} + + + +{% for lang in site.languages %}{% if lang != "en" %}{% capture lang_permalink %}permalink_{{ lang }}{% endcapture %}{% assign lang_path = page[lang_permalink] | default: page.url %} + +{% endif %}{% endfor %} + + + + + + + + + + + + + + + + + + + -{% include google_analytics.js %} - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/_includes/header.html b/_includes/header.html index 46396682c5e..6a701dd4742 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,41 +1,110 @@ +Skip to main content \ No newline at end of file + + +
+ diff --git a/_includes/index_conf_date_place.html b/_includes/index_conf_date_place.html new file mode 100644 index 00000000000..0c3402eb08e --- /dev/null +++ b/_includes/index_conf_date_place.html @@ -0,0 +1,27 @@ +
+
+
+ {%- translate_file dates/pretty_dates.html start=include.start end=include.end -%}. + + {% if include.place == "Online" %} + {{include.place}} + {% else %} + {{include.place}} + {% if include.extra_places %} {% for place in include.extra_places %} & + {{place}} + {% endfor %} {% endif %} {% endif %} + +
+ {% if include.note %} +
Note: {{include.note}}
+ {% endif %} +
+
+
+
+ Deadline: + {{include.cfp | date: "%A, %e %B %Y"}} +
+
+
+
diff --git a/_includes/index_conf_subs.html b/_includes/index_conf_subs.html new file mode 100644 index 00000000000..6171af72150 --- /dev/null +++ b/_includes/index_conf_subs.html @@ -0,0 +1,18 @@ +
+
+ {% for sub in include.subs %} + {% assign sub_trimmed = sub | strip %} + {% for type in site.data.types %} + {% if type.sub == sub_trimmed %} + + {% endif %} + {% endfor %} + {% endfor %} +
+
diff --git a/_includes/index_conf_title_row.html b/_includes/index_conf_title_row.html new file mode 100644 index 00000000000..0400e4b1d99 --- /dev/null +++ b/_includes/index_conf_title_row.html @@ -0,0 +1,50 @@ +
+
+
+ + {{conf.conference}} {{conf.year}} + + + {{conf.conference}} '{{conf.year | slice: -2, 3}} + + + Website + {% if conf.cfp_link %} + CFP + {% endif %} + {% if conf.finaid %} + Aid + {% endif %} + {% if conf.sponsor %} + Sponsor + {% endif %} + {% if conf.mastodon %} + Mastodon + {% elsif conf.twitter %} + Twitter + {% endif %} + {% if conf.bluesky %} + + {% endif %} + +
+
+
+ {% assign cfp_deadline = conf.cfp_ext | default: conf.cfp %} + {% if cfp_deadline == "TBA" or cfp_deadline == "Cancelled" or cfp_deadline == "None" %} + {{cfp_deadline}} + {{cfp_deadline}} + {% else %} + + {{cfp_deadline | date: "%b %e, %Y"}} + + + + + {% endif %} +
+
+ +{% assign conf_id = conf.conference | append: "-" | append: conf.year | slugify: "latin" %} +{% assign cfp_date = conf.cfp_ext | default: conf.cfp %} +{% include action_bar.html conf_id=conf_id conf_name=conf.conference conf_title=conf.conference conf_cfp=cfp_date conf_place=conf.place %} diff --git a/_includes/load_data.js b/_includes/load_data.js index 80fc1a08f9c..00dacc753f4 100644 --- a/_includes/load_data.js +++ b/_includes/load_data.js @@ -10,4 +10,3 @@ for (var i = 0; i < conf_type_data.length; i++) { name2sub[conf_type_data[i]['name']] = conf_type_data[i]['sub']; } const all_subs = _all_subs; - diff --git a/_includes/masthead.html b/_includes/masthead.html new file mode 100644 index 00000000000..98a481f92c8 --- /dev/null +++ b/_includes/masthead.html @@ -0,0 +1,54 @@ + diff --git a/_includes/mastodon_feed.html b/_includes/mastodon_feed.html new file mode 100644 index 00000000000..7caad341369 --- /dev/null +++ b/_includes/mastodon_feed.html @@ -0,0 +1,9 @@ +{% assign mastodon_account = include.account %} +{% assign mastodon_label = include.label | default: page.conference %} +{% assign mastodon_post_limit = include.post_limit | default: 2 %} + +
Mastodon Posts by {{ mastodon_label }}:
+
+See all Mastodon posts for {{ mastodon_label }} diff --git a/_includes/mastodon_head.html b/_includes/mastodon_head.html new file mode 100644 index 00000000000..05430a824d7 --- /dev/null +++ b/_includes/mastodon_head.html @@ -0,0 +1,2 @@ + + diff --git a/_includes/multiselect_handler.js b/_includes/multiselect_handler.js index 81871b17b17..bbdb975a238 100644 --- a/_includes/multiselect_handler.js +++ b/_includes/multiselect_handler.js @@ -1,48 +1,50 @@ // Multi-select handler -$("#subject-select").multiselect({ - includeSelectAllOption: true, - numberDisplayed: 5, - onChange: function (option, checked, select) { - var csub = $(option).val(); - if (checked == true) { - if (subs.indexOf(csub) < 0) subs.push(csub); - } else { - var idx = subs.indexOf(csub); - if (idx >= 0) subs.splice(idx, 1); - // In case a conf with multiple types (including this type) is wrongly hid, show all confs with at least one checked type. - for (var i = 0; i < subs.length; i++) { - // $('.' + subs[i] + '-conf').show(); - } - } - update_filtering({ subs: subs, all_subs: all_subs }); - }, - onSelectAll: function (options) { - subs = all_subs; - update_filtering({ subs: subs, all_subs: all_subs }); - }, - onDeselectAll: function (options) { - subs = []; - update_filtering({ subs: subs, all_subs: all_subs }); - }, - buttonText: function (options, select) { - if (options.length === 0) { - return "None selected"; - } else { - var labels = []; - options.each(function () { - if ($(this).attr("value") !== undefined) { - labels.push($(this).attr("value")); - } else { - labels.push($(this).html()); - } - }); - return labels.join(", ") + ""; - } - }, - buttonTitle: function (options, select) { - return ""; - }, - optionClass: function(element) { - return $(element).val() + '-select'; - }, +$('#subject-select').multiselect({ + includeSelectAllOption: true, + numberDisplayed: 5, + onChange: function (option, checked, select) { + var csub = $(option).val(); + if (checked == true) { + if (subs.indexOf(csub) < 0) subs.push(csub); + } else { + var idx = subs.indexOf(csub); + if (idx >= 0) subs.splice(idx, 1); + // In case a conf with multiple types (including this type) is wrongly hid, show all confs with at least one checked type. + for (var i = 0; i < subs.length; i++) { + // $('.' + subs[i] + '-conf').show(); + } + } + update_filtering({ subs: subs, all_subs: all_subs }); + }, + onSelectAll: function (options) { + subs = all_subs; + update_filtering({ subs: subs, all_subs: all_subs }); + }, + onDeselectAll: function (options) { + subs = []; + update_filtering({ subs: subs, all_subs: all_subs }); + }, + buttonText: function (options, select) { + if (options.length === 0) { + return '{% t buttons.none_selected %}'; + } else if (options.length === select.children('option').length) { + return '{% t buttons.all_selected %}'; + } else { + var labels = []; + options.each(function () { + if ($(this).attr('value') !== undefined) { + labels.push($(this).attr('value').slice(0, 3)); + } else { + labels.push($(this).html()); + } + }); + return labels.join(', ') + ''; + } + }, + buttonTitle: function (options, select) { + return ''; + }, + optionClass: function (element) { + return $(element).val() + '-select'; + }, }); diff --git a/_includes/sneks.html b/_includes/sneks.html new file mode 100644 index 00000000000..6fc3ef6f62a --- /dev/null +++ b/_includes/sneks.html @@ -0,0 +1,242 @@ +
+ + + + +
+ diff --git a/_includes/trademarks.html b/_includes/trademarks.html new file mode 100644 index 00000000000..c9eb28dc1e1 --- /dev/null +++ b/_includes/trademarks.html @@ -0,0 +1,21 @@ +{% assign trademarks = "" | split: "" %} + +{% if include.title contains "PyCon" or include.title contains "PyLadies" %} +{% assign trademarks = trademarks | push: "pycon" %} +{% endif %} + +{% if include.title contains "Django" %} +{% assign trademarks = trademarks | push: "django" %} +{% endif %} + +{% if include.title contains "PyData" or include.title contains "Jupyter" or include.title contains "SciPy" %} +{% assign trademarks = trademarks | push: "pydata" %} +{% endif %} + +{% if trademarks.size == 0 %} +{% assign trademarks = trademarks | push: "generic" %} +{% endif %} + +{% for trademark in trademarks %} +{% tf trademark/{{ trademark }}.md %} +{% endfor %} diff --git a/_includes/utils.js b/_includes/utils.js index 25f82ba11a5..9fe5633b64e 100644 --- a/_includes/utils.js +++ b/_includes/utils.js @@ -1,40 +1,84 @@ function update_filtering(data) { - var page_url = "{{site.baseurl}}"; - store.set("{{site.domain}}-subs", data.subs); - - $(".confItem").hide(); - for (const j in data.all_subs) { - const s = data.all_subs[j]; - const identifier = "." + s + "-conf"; - if (data.subs.includes(s)) { - $(identifier).show(); - } - } - - if (subs.length == 0) { - window.history.pushState("", "", page_url); - } else { - window.history.pushState("", "", page_url + "/?sub=" + data.subs.join()); - } + // Delegate to consolidated ConferenceFilter module + if (window.ConferenceFilter && window.ConferenceFilter.updateFromMultiselect) { + window.ConferenceFilter.updateFromMultiselect(data.subs); + } else { + // Fallback for legacy support + console.warn('ConferenceFilter module not loaded, using legacy filtering'); + + // Defensive check for data parameter + if (!data || typeof data !== 'object') { + console.error('update_filtering called with invalid data:', data); + return; + } + + // Ensure required properties exist + if (!data.subs || !Array.isArray(data.subs)) { + console.error('update_filtering: data.subs is not an array:', data.subs); + return; + } + + var page_url = window.location.pathname; + store.set('{{site.domain}}-subs', { subs: data.subs, timestamp: new Date().getTime() }); + + $('.ConfItem').hide(); + + // Loop through selected values in data.subs + for (const s of data.subs) { + // Show elements with class .s-conf (where s is the selected value) + $('.' + s + '-conf').show(); + } + + // Notify CountdownManager about filter changes for lazy loading optimization + if (window.CountdownManager && window.CountdownManager.onFilterUpdate) { + window.CountdownManager.onFilterUpdate(); + } + + if (data.subs.length === 0 || data.subs.length == data.all_subs.length) { + window.history.pushState('', '', page_url); + } else { + // Join the selected values into a query parameter + window.history.pushState('', '', page_url + '?sub=' + data.subs.join()); + } + } +} + +function isDataExpired(data) { + const EXPIRATION_PERIOD = 1 * 17 * 60 * 60 * 1000; // 1 day in milliseconds + const now = new Date().getTime(); + if (data.timestamp && now - data.timestamp > EXPIRATION_PERIOD) { + return true; + } + return false; } function createCalendarFromObject(data) { - return createCalendar({ - options: { - class: "calendar-obj", - - // You can pass an ID. If you don't, one will be generated for you - id: data.id, - }, - data: { - // Event title - title: data.title, - - // Event start date - start: data.date, - - // Event duration - duration: 60, - }, - }); + return createCalendar({ + options: { + class: 'calendar-obj', + + // You can pass an ID. If you don't, one will be generated for you + id: data.id, + }, + data: { + // Event title + title: data.title, + + // Event start date + start: data.start_date, + + // Event duration (minutes) + duration: 60, + + // You can also choose to set an end time + // If an end time is set, this will take precedence over duration + end: data.end_date, + + // Event Address + address: data.place, + + // Event Description + description: '' + data.title + '', + }, + }); } diff --git a/_layouts/calendar-conferences.ics b/_layouts/calendar-conferences.ics new file mode 100644 index 00000000000..62b60b1503b --- /dev/null +++ b/_layouts/calendar-conferences.ics @@ -0,0 +1,18 @@ +BEGIN:VCALENDAR +METHOD:PUBLISH +VERSION:2.0 +PRODID:-//{{ site.url }}//{{ site.github_repo }}//EN +X-PUBLISHED-TTL:PT1H{% for conf in site.data.conferences %} +BEGIN:VEVENT +SUMMARY:{{ conf.conference }} {{ conf.year }} +UID:{{conf.conference | slugify: "latin"}}-{{conf.year}} +ORGANIZER:pythondeadlin.es +DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} +DTSTART;VALUE=DATE:{{ conf.start | date: "%Y%m%d"}} +DTEND;VALUE=DATE:{{ conf.end | date: "%Y%m%d"}} +{% capture desc -%}{{ conf.conference }} {{ conf.year }} found on PythonDeadlin.es.{% endcapture -%} +{{ desc | prepend: "DESCRIPTION:" | normalize_whitespace | wrap_lines }} +LOCATION:{{ conf.place }} +ORGANIZER:pythondeadlin.es +END:VEVENT{% endfor %} +END:VCALENDAR diff --git a/_layouts/calendar-deadlines.ics b/_layouts/calendar-deadlines.ics new file mode 100644 index 00000000000..a0a45863866 --- /dev/null +++ b/_layouts/calendar-deadlines.ics @@ -0,0 +1,54 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//{{ site.url }}//{{ site.github_repo }}//EN +METHOD:PUBLISH +X-PUBLISHED-TTL:PT1H +BEGIN:VTIMEZONE +TZID:UTC +BEGIN:STANDARD +DTSTART:19700101T000000Z +TZOFFSETFROM:+0000 +TZOFFSETTO:+0000 +END:STANDARD +END:VTIMEZONE +{%- for conf in site.data.conferences %} +{%- if conf.cfp_ext -%} + {%- assign cfp = conf.cfp_ext -%} + {%- assign extended = "(extended)" -%} +{%- else -%} + {%- assign cfp = conf.cfp -%} + {%- assign extended = "" -%} +{%- endif -%} +{%- capture desc -%}{{ conf.conference }} {{ conf.year }} found on PythonDeadlin.es.{%- endcapture -%} +{%- if conf.workshop_deadline and conf.workshop_deadline != "TBA" %} +BEGIN:VEVENT +SUMMARY:{{ conf.conference }} {{ conf.year }} Workshop Deadline +UID:{{ conf.conference | slugify: "latin" }}-{{ conf.year }}-workshop@pythondeadlin.es +DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} +DTSTART:{{ conf.workshop_deadline | to_utc: conf.timezone }} +{{ desc | prepend: "DESCRIPTION:" | normalize_whitespace | wrap_lines }} +ORGANIZER;CN=PythonDeadlines:mailto:noreply@pythondeadlin.es +END:VEVENT +{%- endif %} +{%- if conf.tutorial_deadline and conf.tutorial_deadline != "TBA" %} +BEGIN:VEVENT +SUMMARY:{{ conf.conference }} {{ conf.year }} Tutorial Deadline +UID:{{ conf.conference | slugify: "latin" }}-{{ conf.year }}-tutorial@pythondeadlin.es +DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} +DTSTART:{{ conf.tutorial_deadline | to_utc: conf.timezone }} +{{ desc | prepend: "DESCRIPTION:" | normalize_whitespace | wrap_lines }} +ORGANIZER;CN=PythonDeadlines:mailto:noreply@pythondeadlin.es +END:VEVENT +{%- endif %} +{%- if cfp != "TBA" and cfp != "None" and cfp != "Cancelled" %} +BEGIN:VEVENT +SUMMARY:{{ conf.conference }} {{ conf.year }} Deadline {{ extended }} +UID:{{ conf.conference | slugify: "latin" }}-{{ conf.year }}@pythondeadlin.es +DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} +DTSTART:{{ cfp | to_utc: conf.timezone }} +{{ desc | prepend: "DESCRIPTION:" | normalize_whitespace | wrap_lines }} +ORGANIZER;CN=PythonDeadlines:mailto:noreply@pythondeadlin.es +END:VEVENT +{%- endif %} +{%- endfor %} +END:VCALENDAR diff --git a/_layouts/calendar.ics b/_layouts/calendar.ics deleted file mode 100644 index cd15fb2744e..00000000000 --- a/_layouts/calendar.ics +++ /dev/null @@ -1,43 +0,0 @@ -BEGIN:VCALENDAR -METHOD:PUBLISH -VERSION:2.0 -PRODID:-//{{ site.url }}//{{ site.github_repo }}//EN -X-PUBLISHED-TTL:PT1H -{%- for conf in site.data.conferences -%} -{% if conf.workshop_deadline and conf.workshop_deadline != "TBA" %} -BEGIN:VEVENT -SUMMARY:{{ conf.title }} {{ conf.year }} Workshop Deadline -UID:{{ conf.id }}-workshop {% if conf.timezone contains "UTC" %} {% assign tz = conf.timezone | split: "UTC" %} {% if tz[1] contains "-" %} {% assign tz = tz[1] | replace: "-", "+" %} {% else if tz[1] contains "+" %} {% assign tz = tz[1] | replace: "+", "-" %} {% else assign tz = tz[1] %} {% endif %} -ORGANIZER:pythondeadlin.es -DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} -DTSTART;TZID=Etc/GMT{{ tz }}:{{ conf.workshop_deadline | date: "%Y%m%dT%H%M%S" }} -{% else %} -ORGANIZER:pythondeadlin.es -DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} -DTSTART;TZID={{ conf.timezone }}:{{ conf.workshop_deadline | date: "%Y%m%dT%H%M%S" }} -{% endif %}END:VEVENT{% endif %} -{% if conf.tutorial_deadline and conf.tutorial_deadline != "TBA" %} -BEGIN:VEVENT -SUMMARY:{{ conf.title }} {{ conf.year }} Tutorial Deadline -UID:{{ conf.id }}-tutorial {% if conf.timezone contains "UTC" %} {% assign tz = conf.timezone | split: "UTC" %} {% if tz[1] contains "-" %} {% assign tz = tz[1] | replace: "-", "+" %} {% else if tz[1] contains "+" %} {% assign tz = tz[1] | replace: "+", "-" %} {% else assign tz = tz[1] %} {% endif %} -ORGANIZER:pythondeadlin.es -DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} -DTSTART;TZID=Etc/GMT{{ tz }}:{{ conf.tutorial_deadline | date: "%Y%m%dT%H%M%S" }} -{% else %} -ORGANIZER:pythondeadlin.es -DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} -DTSTART;TZID={{ conf.timezone }}:{{ conf.tutorial_deadline | date: "%Y%m%dT%H%M%S" }} -{% endif %}END:VEVENT{% endif %} -{% if conf.cfp != "TBA" %}BEGIN:VEVENT -SUMMARY:{{ conf.title }} {{ conf.year }} Deadline -UID:{{ conf.id }} {% if conf.timezone contains "UTC" %} {% assign tz = conf.timezone | split: "UTC" %} {% if tz[1] contains "-" %} {% assign tz = tz[1] | replace: "-", "+" %} {% else if tz[1] contains "+" %} {% assign tz = tz[1] | replace: "+", "-" %} {% else assign tz = tz[1] %} {% endif %} -ORGANIZER:pythondeadlin.es -DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} -DTSTART;TZID=Etc/GMT{{ tz }}:{{ conf.cfp | date: "%Y%m%dT%H%M%S" }} -{% else %} -ORGANIZER:pythondeadlin.es -DTSTAMP:{{ site.time | date: "%Y%m%dT%H%M%SZ" }} -DTSTART;TZID={{ conf.timezone }}:{{ conf.cfp | date: "%Y%m%dT%H%M%S" }} -{% endif %}END:VEVENT -{% endif %} -{%- endfor -%}END:VCALENDAR diff --git a/_layouts/conference.html b/_layouts/conference.html new file mode 100644 index 00000000000..50959ba31df --- /dev/null +++ b/_layouts/conference.html @@ -0,0 +1,453 @@ +--- +--- + +{% if page.cfp_ext %} + {% assign cfp = page.cfp_ext %} +{% else %} + {% assign cfp = page.cfp %} +{% endif %} + + + + {% include head.html %} + + + + + + + {% if page.mastodon %} + {% include mastodon_head.html %} + {% endif %} + + + + {% include header.html %} +
+ +
+
+
+
+
+ {% if cfp == "TBA" or cfp == "Cancelled" or cfp == "None" %}{{cfp}}{%endif%} +
+
+ +
+
+ {% include conference_detail_actions.html %} +
+
+
+
+
+ Calendar icon + {% assign conf = page %}{%- translate_file dates/pretty_dates.html start=conf.start end=conf.end -%} +
+ + + {% if page.cfp_ext %} +
+ Document Icon for original CfP + {% t global.cfp_ext %} {{page.cfp}} +
+ {% endif %} + {% if page.cfp_link %} + + {% endif %} + + {% if page.finaid %} + + {% endif %} + {% if page.sponsor %} + + {% endif %} + {% if page.twitter %} + + {% endif %} + {% if page.mastodon %} +
+ Mastodon icon + Mastodon +
+ {% endif %} + {% if page.bluesky %} +
+ + Bluesky +
+ {% endif %} + {% if page.youtube %} +
+ + YouTube +
+ {% endif %} +
+
+
+
+
+ {% t conference.deadline_tz_theirs %}: +
+
+ {{conf.cfp | date: "%A, %e %B %Y"}} +
+
+ {% t conference.deadline_tz_local %}: +
+
+ +
+
+
+ +
+ {% if page.mastodon %} +
+ {% include mastodon_feed.html account=page.mastodon label=page.conference %} +
+ {% endif %} +
+
+ {% if page.location %} + {% google_map zoom="6" width="100%" %} + {% endif %} +
+
+
+ + +{% include sneks.html %} +
+ {% include_cached footer.html %} + + {% assign title_length = page.title | size | minus: 26 %} + {% assign sliced_title = page.title | slice: 0, title_length %} + +
+
+ {% include_cached trademarks.html title=sliced_title %} +
+
+
+ + + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 00000000000..dc64f7ed8c3 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,51 @@ + + + + {% include head.html %} + {% if page.extra_css %} + {% for css in page.extra_css %} + + {% endfor %} + {% endif %} + + + {% include header.html %} + + {% if page.show_masthead %} + {% capture masthead_title %} + {% if page.masthead_title %} + {{ page.masthead_title }} + {% elsif page.title %} + {% t page.title %} + {% endif %} + {% endcapture %} + + {% capture masthead_hook %} + {% if page.masthead_hook %} + {{ page.masthead_hook }} + {% endif %} + {% endcapture %} + + {% capture masthead_description %} + {% if page.masthead_description %} + {{ page.masthead_description }} + {% endif %} + {% endcapture %} + + {% include masthead.html url=page.url title=masthead_title hook=masthead_hook description=masthead_description %} + {% endif %} + +
+ {{ content }} +
+ + {% if page.extra_js %} + {% for js in page.extra_js %} + + {% endfor %} + {% endif %} + +
{% include_cached footer.html %}
+ {% include sneks.html %} + + diff --git a/_layouts/home.html b/_layouts/home.html new file mode 100644 index 00000000000..e75238ddc14 --- /dev/null +++ b/_layouts/home.html @@ -0,0 +1,20 @@ +--- +layout: default +--- + +{% capture fp_title %} + {% t titles.default %} +{% endcapture %} +{% capture fp_hook %} + {% tf frontpage/hook.md %} +{% endcapture %} +{% capture fp_description %} + {% tf frontpage/description.md %} +{% endcapture %} + +{% include masthead.html url=page.url title=fp_title hook=fp_hook description=fp_description %} + +{{ content }} + + + diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 00000000000..5e7112684af --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 00000000000..1ac5a30d46f --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,32 @@ +--- +--- + + + + {% include head.html %} + + + {% include header.html %} +
+ +
{{ content }}
+
+
{% include_cached footer.html %}
+ + {% include sneks.html %} + + diff --git a/_layouts/search.html b/_layouts/search.html new file mode 100644 index 00000000000..af5b27825a5 --- /dev/null +++ b/_layouts/search.html @@ -0,0 +1,25 @@ +--- +layout: default +show_masthead: true +--- + +{% capture search_title %}{% t titles.search %}{% endcapture %} +{% capture search_hook %}{% tf frontpage/hook.md %}{% endcapture %} +{% capture search_description %} +{% tf search/description.md %} +
+ + +
+{% endcapture %} + +{% include masthead.html url=page.url title=search_title hook=search_hook description=search_description %} + +
{{ content }}
diff --git a/_layouts/summary.html b/_layouts/summary.html new file mode 100644 index 00000000000..9f796ca5568 --- /dev/null +++ b/_layouts/summary.html @@ -0,0 +1,224 @@ +--- +description: Summary of the conference and its instances throughout the years. +--- + + + + + {% include head.html %} + {% if page.mastodon %} + {% include mastodon_head.html %} + {% endif %} + + + + {% include header.html %} + {% if page.alt_name and page.alt_name != nil %} + {% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy | where_exp:"item","page.conference contains item.conference or item.conference contains page.conference or page.alt_name == item.alt_name or page.conference contains item.alt_name or item.conference contains page.alt_name" | sort: "year" | reverse %} + {% else %} + {% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy | where_exp:"item","page.conference contains item.conference or item.conference contains page.conference" | sort: "year" | reverse %} + {% endif %} +
+ +
+
+
+
+
+ + {% if confs[0].twitter %} + + {% endif %} + {% if confs[0].mastodon %} +
+ Mastodon icon + Mastodon +
+ {% endif %} + {% if confs[0].bluesky %} +
+ + Bluesky +
+ {% endif %} + {% if confs[0].youtube %} +
+ + YouTube +
+ {% endif %} +
+
+
+ {% for conf in confs %} + {% assign subs = conf.sub | split: "," %} +
+ {% include index_conf_title_row.html %} + {% include_cached index_conf_date_place.html place=conf.place extra_places=conf.extra_places note=conf.note cfp=conf.cfp start=conf.start end=conf.end %} + {% include index_conf_subs.html subs=subs %} +
+
+ {% endfor %} +
+
+ {% if confs[0].mastodon %} +
+ {% assign summary_mastodon = confs[0].mastodon %} + {% include mastodon_feed.html account=summary_mastodon label=page.conference %} +
+ {% endif %} +
+ {% if page.place == confs[0].place and confs[0].place == confs[1].place %} +
+ {% google_map zoom="6" width="100%" %} +
+ {% endif %} +
+
+
+ {% include_cached footer.html %} + {% assign title_length = page.title | size | minus: 27 %} + {% assign sliced_title = page.title | slice: 0, title_length %} + + {% include_cached trademarks.html title=sliced_title %} +
+ + + {% include sneks.html %} + + + diff --git a/_layouts/year.html b/_layouts/year.html new file mode 100644 index 00000000000..ec56a4d2086 --- /dev/null +++ b/_layouts/year.html @@ -0,0 +1,117 @@ + + + {% include head.html %} + + + {% include header.html %} {% capture fp_title %} {% t titles.archive %} {{page.year}} {% endcapture %} {% + capture fp_hook %} {% tf frontpage/hook.md %} {% endcapture %} {% capture fp_description %} {% tf + frontpage/description.md %} {% endcapture %} {% include masthead.html url=page.url title=fp_title hook=fp_hook + description=fp_description %} +
+
+
+

{% t titles.past_events %}

+ {% assign confs = site.data.archive | concat: site.data.legacy | sort: "start" | reverse | + where_exp: "item", "item.year == page.year" %} {% for conf in confs %} {% assign subs = conf.sub | + split: "," %} +
+ {% include index_conf_title_row.html %} {% include_cached index_conf_date_place.html + place=conf.place extra_places=conf.extra_places note=conf.note cfp=conf.cfp start=conf.start + end=conf.end %} {% include index_conf_subs.html subs=subs %} +
+
+ {% endfor %} +
+
+ {% assign years = site.years | sort: 'year' %} {% assign current_year = page.year %} {% assign previous_year + = null %} {% assign next_year = null %} {% for year in years %} {% if year.year == current_year %} {% assign + previous_year_index = forloop.index0 | minus: 1 %} {% assign next_year_index = forloop.index0 | plus: 1 %} + {% if previous_year_index >= 0 %} {% assign previous_year = years[previous_year_index] %} {% endif %} {% if + next_year_index < years.size %} {% assign next_year = years[next_year_index] %} {% endif %} {% break %} {% + endif %} {% endfor %} + + +
+
{% include_cached footer.html %}
+ + {% include sneks.html %} + + diff --git a/_pages/404.html b/_pages/404.html new file mode 100644 index 00000000000..dddcd90a479 --- /dev/null +++ b/_pages/404.html @@ -0,0 +1,83 @@ +--- +permalink: /404.html +title: titles.a404 +--- + + + + {% include head.html %} + + + + + {% include header.html %} +
+
+
+ + +
+

404

+

This page slithered away! The sneks couldn't find what you're looking for.

+ Back to conference deadlines +
+
+
{% include_cached footer.html %}
+ + diff --git a/_pages/about.html b/_pages/about.html new file mode 100644 index 00000000000..13c94e4f048 --- /dev/null +++ b/_pages/about.html @@ -0,0 +1,285 @@ +--- +layout: page +title: titles.about +author: Jesper Dramsch +description: 'Never miss another Python conference deadline!' +keywords: 'Python, conferences, deadlines, community-driven, tracking, reminders' +namespace: about +permalink: /about/ +permalink_es: /sobre/ +permalink_de: /über-uns/ +permalink_fr: /à-propos/ +permalink_pt-br: /sobre/ +permalink_zh-cn: /关于我们/ +permalink_ru: /о-нас/ +permalink_id: /tentang-kami/ +permalink_hi: /के-बारे-में/ +extra_css: + - /static/css/about.css +extra_js: + - /static/js/about.js +include_footer: true +--- + +{% assign confs = site.data.archive | concat: site.data.conferences | concat: site.data.legacy %} + +
+ + 1/7 + +
+ + +
+
+
+ +

{% t about.tagline %}

+

{% t about.hero_description %}

+
+
+
+ + +
+
+
+
+
+

{% t about.problem.title %}

+

{% t about.problem.description %}

+
+
+
+
+

{% t about.solution.title %}

+

{% t about.solution.description %}

+
+
+
+
+
+ + +
+
+

{% t about.features.title %}

+
+
+
+
📅
+

{% t about.features.tracking.title %}

+

+ {% t about.features.tracking.description %} +

+
+
+
+
+
🔔
+

{% t about.features.notifications.title %}

+

+ {% t about.features.notifications.description %} +

+
+
+
+
+
🗺️
+

{% t about.features.coverage.title %}

+

+ {% t about.features.coverage.description %} +

+
+
+
+
+
🌍
+

{% t about.features.language.title %}

+

+ {% t about.features.language.description %} +

+
+
+
+
+
🤝
+

{% t about.features.community.title %}

+

+ {% t about.features.community.description %} +

+
+
+
+
+
📱
+

{% t about.features.mobile.title %}

+

+ {% t about.features.mobile.description %} +

+
+
+
+
+
+ + +
+
+

{% t about.categories.title %}

+
+

{% t about.categories.intro %}

+
+ {% assign types = site.data.types | sort: 'name' %} + {% for type in types %} +
+
+ + {% t 'subs.{{type.sub | strip}}' %} +
+
+ {% endfor %} +
+
+
+
+ + +{% assign countries = "" | split: "," %} +{% for conf in confs %} + {% assign country = conf.place | split: ", " | last | strip %} + {% assign countries = countries | push: country %} +{% endfor %} + + + +
+
+
+

{% t about.testimonials.title %}

+
+
+
+

{% t about.testimonials.first.quote %}

+

{% t about.testimonials.first.author %}

+
+
+
+
+

{% t about.testimonials.second.quote %}

+

{% t about.testimonials.second.author %}

+
+
+
+
+

{% t about.testimonials.third.quote %}

+

{% t about.testimonials.third.author %}

+
+
+
+
+
+
+ + +
+
+

{% t about.use_cases.title %}

+
+
+
+

{% t about.use_cases.first_time.title %}

+

{% t about.use_cases.first_time.description %}

+
+
+
+
+

{% t about.use_cases.frequent.title %}

+

{% t about.use_cases.frequent.description %}

+
+
+
+
+

{% t about.use_cases.organizers.title %}

+

{% t about.use_cases.organizers.description %}

+
+
+
+
+
+ + +
+
+
+

{% t about.cta.title %}

+
+
+

{% t about.cta.description %}

+ +
+
+
+ {% t about.cta.qr_alt %} +
+
+
+
+
+
diff --git a/_pages/archive.html b/_pages/archive.html new file mode 100644 index 00000000000..0e991f7ce33 --- /dev/null +++ b/_pages/archive.html @@ -0,0 +1,105 @@ +--- +namespace: archive +permalink: /archive/ +permalink_es: /archivo/ +permalink_de: /archiv/ +permalink_fr: /archive/ +permalink_pt-br: /arquivo/ +permalink_zh-cn: /存档/ +permalink_ru: /архив/ +permalink_id: /arsip/ +permalink_hi: /आर्काइव/ +title: titles.archive +--- + + + + {% include head.html %} + + + {% include header.html %} {% capture arch_title %} {% t titles.archive %} {% endcapture %} {% capture arch_hook + %} {% tf frontpage/hook.md %} {% endcapture %} {% capture arch_description %} {% tf frontpage/description.md %} + {% endcapture %} {% include masthead.html url=page.url title=arch_title hook=arch_hook + description=arch_description %} + +
+
+

{% t titles.past_events %}

+ {% assign current_year = site.time | date: "%Y" | plus: 0 %} {% for page in site.years %} {% assign year + = page.year | plus: 0 %} {% if year <= current_year %} +
  • Year {{ year }}
  • + {% endif %} {% endfor %} +
    +
    +
    {% include_cached footer.html %}
    + + + {% include sneks.html %} + + diff --git a/_pages/calendar.html b/_pages/calendar.html new file mode 100644 index 00000000000..b489df7d8c4 --- /dev/null +++ b/_pages/calendar.html @@ -0,0 +1,109 @@ +--- +layout: default +namespace: calendar +permalink: /calendar/ +permalink_es: /calendario/ +permalink_de: /kalender/ +permalink_fr: /calendrier/ +permalink_pt-br: /calendario/ +permalink_zh-cn: /日历/ +permalink_ru: /календарь/ +permalink_id: /kalender/ +permalink_hi: /कैलेंडर/ +title: titles.calendar +show_masthead: true +include_footer: true +--- + +
    + + +
    +
    +
    +
    + Deadlines +
    +
    Today
    + {% for type in site.data.types %} +
    + {{ type.name }} +
    + {% endfor %} +
    +
    + + diff --git a/_pages/conference.html b/_pages/conference.html deleted file mode 100644 index e618e206a7f..00000000000 --- a/_pages/conference.html +++ /dev/null @@ -1,163 +0,0 @@ ---- -permalink: /conference/ ---- - - - - {% include head.html %} - - - {% include header.html %} -
    - -
    -
    -
    - - . -
    -
    - - . -
    -
    - - -
    -
    -
    -
    - Download Conference deadline: -
    -
    -
    - Deadline in timezone from conference website: -
    -
    - -
    -
    - Deadline in your local timezone: -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - {% include footer.html %} -
    -
    - - - diff --git a/_pages/conference.md b/_pages/conference.md new file mode 100644 index 00000000000..c8c6f0f2123 --- /dev/null +++ b/_pages/conference.md @@ -0,0 +1,28 @@ +--- +layout: post +title: 'What is a Python conference?' +author: Jesper Dramsch +tags: ['Python', 'CfP'] +permalink: /conference/index.html +redirect_to: /index.html +--- + +Python is an incredibly popular programming language, with millions of developers building all sorts of software applications. + +As a result, there are many Python conferences around the world, where people gather to share their knowledge, learn from each other, and explore the latest trends in the Python ecosystem. + +Attending a Python conference can be an incredible experience for developers as they meet other like-minded individuals, learn about new technologies and best practices, and gain inspiration for their next projects. Conferences also provide an opportunity for attendees to network with others in the field, which can lead to new job opportunities, collaborations, and friendships. + +But attending a conference is just one part of the experience - presenting at one is an entirely different ballgame. Speaking at a conference is a great way to showcase your expertise, build your personal brand, and share your ideas with a broader audience. It's also a chance to challenge yourself to become a better communicator and improve your public speaking skills. + +Suppose you're interested in presenting at a Python conference. In that case, plenty of resources are out there to help you get started. One such resource is PythonDeadlines, a website aggregating calls for participation (CFPs) for various Python conferences worldwide. By keeping track of these deadlines, Pythonistas can ensure they don't miss out on any opportunities to present at conferences. + +There are many benefits to presenting at a Python conference. First and foremost, it can be a gratifying experience to share your knowledge and ideas with others in the community. It's also a great way to establish yourself as an authority in your field, which can lead to new job opportunities, speaking engagements, and other professional opportunities. And, of course, presenting at a conference can be a lot of fun. There's nothing quite like being on stage and sharing your passion with a room full of people just as passionate about Python as you are. + +Another benefit of presenting at a conference is that it can be a great way to get feedback on your work. Whether you're introducing a new library you've built or sharing some best practices you've developed, the feedback you receive from other attendees can be precious in helping you refine your ideas and improve your work. + +In conclusion, attending a Python conference can be a fantastic experience for developers, but presenting at one can take that experience to the next level. With resources like PythonDeadlines to help you keep track of CFPs, there's never been a better time to consider submitting a proposal for your next Python conference. + +So why not give it a try? + +You might just find that it's one of the most rewarding experiences of your career. diff --git a/_pages/course.html b/_pages/course.html new file mode 100644 index 00000000000..193caa62d67 --- /dev/null +++ b/_pages/course.html @@ -0,0 +1,313 @@ +--- +title: 'From Zero to CfP: Email Course' +author: Jesper Dramsch +description: 'A free 5-lesson email course to help you submit your first Python conference talk proposal' +namespace: course +permalink: /course/ +permalink_de: /kurs/ +permalink_es: /curso/ +permalink_fr: /cours/ +permalink_pt-br: /curso/ +permalink_id: /kursus/ +permalink_hi: /course/ +permalink_zh-cn: /course/ +permalink_ru: /course/ +--- + + + + + {% include head.html %} + + + + {% include header.html %} + + +
    +
    +

    From Zero to CfP

    +

    A free 5-lesson email course to help you submit your first Python conference talk proposal

    +
    + + + +
    +
    +
    + + +
    +
    +

    What You'll Learn

    +
    +
    + +
    +

    Why you already know enough to give a conference talk

    +
    +
    +
    + +
    +

    Finding the right conference for your first submission

    +
    +
    +
    + +
    +

    Writing a CfP that review committees love

    +
    +
    +
    + +
    +

    From "accepted" to stage-ready

    +
    +
    +
    + +
    +

    Open CfPs right now + weekly deadline digest

    +
    +
    +
    + +
    +

    Present at a Python conference

    +
    +
    +
    +
    +
    + + +
    +
    +

    Who Is This For?

    +
      +
    • You've thought about speaking at a conference but haven't submitted yet
    • +
    • You've attended Python conferences and want to give back to the community
    • +
    • You have expertise to share but aren't sure how to write a compelling proposal
    • +
    • You want practical, step-by-step guidance from idea to accepted talk
    • +
    +

    After the course, you'll receive our weekly digest of new Python conference deadlines.

    +
    +
    + + +
    +
    +

    Get Your First Talk Accepted

    +

    Join hundreds of Python developers who turned their knowledge into conference talks.

    +
    + + + +
    +
    +
    + +
    {% include_cached footer.html %}
    + {% include sneks.html %} + + diff --git a/_pages/formatter-app.html b/_pages/formatter-app.html new file mode 100644 index 00000000000..737a7eccf76 --- /dev/null +++ b/_pages/formatter-app.html @@ -0,0 +1,887 @@ +--- +title: titles.formatter +author: Jesper Dramsch +description: 'Create Python conference submissions in multiple formats across the community' +namespace: formatter +permalink: /app/formatter +permalink_de: /app/formatter +permalink_es: /app/formatter +permalink_fr: /app/formatter +permalink_pt-br: /app/formatter +permalink_id: /app/formatter +permalink_hi: /app/formatter +permalink_zh-cn: /app/formatter +--- + + + + + {% include head.html %} + + + + + + + {% include header.html %} + +
    +
    +

    {% t titles.formatter%}

    +

    {% t formatter.description %}

    +
    + +
    + +
    +
    +
    {% t formatter.basic.title %}
    + +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    + + +

    {% t formatter.location_date.city_help %}

    +
    +
    + + + +

    {% t formatter.location_date.country_help %}

    +
    +
    +
    +
    + + +
    +
    + + +

    {% t formatter.location_date.extra_help %}

    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +

    {% t formatter.location_date.timezone_help %}

    +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    + +
    +
    {% tf formatter/submission.html %}
    +
    +
    +
    + +
    + +
    + + + +
    +
    {% include_cached footer.html %}
    + + + + + + + + + diff --git a/_pages/languages.html b/_pages/languages.html new file mode 100644 index 00000000000..9f8ad051dbf --- /dev/null +++ b/_pages/languages.html @@ -0,0 +1,139 @@ +--- +title: titles.languages +author: Jesper Dramsch +namespace: languages +permalink: /languages/ +pemalink_de: /sprachen/ +permalink_es: /idiomas/ +permalink_fr: /langues/ +permalink_pt-br: /idiomas/ +permalink_zh-cn: /语言/ +permalink_hi: /भाषाएँ/ +permalink_id: /bahasa/ +--- + + + + + {% include head.html %} + + + {% include header.html %} + +
    + +
    + {% for lang in site.languages %} {% assign lang_obj = site.languages_available[lang] %} +
    +
    +
    +
    + {{ lang_obj.name }} ({{lang}}) {% if lang == site.lang %} + + {% endif %} +
    +

    + {% if lang_obj.status == "native" %} + {% t languages.native_speaker %} + {% elsif lang_obj.status == "non-native" %} + {% t languages.language_learner %} + {% elsif lang_obj.status == "ai" %} + {% t languages.ai_translated %} + {% endif %} +

    + + {% t languages.switch_to %} + + {% if lang_obj.translators %} +
    + {% t languages.translated_by %} +
      + {% for translator in lang_obj.translators %} +
    • + + {{ translator.name }} + + {% if translator.level %} {% if translator.level == "native" %} + + {% elsif translator.level == "non-native" %} + + {% elsif translator.level == "ai" %} + + {% endif %} {% endif %} +
    • + {% endfor %} +
    +
    + {% endif %} +
    +
    +
    + {% endfor %} +
    +
    +
    +

    {% t languages.legend %}

    + {% t languages.native_speaker %} + + {% t languages.language_learner %} + {% t languages.ai_translated %} +
    +
    +
    + +
    {% include_cached footer.html %}
    + + diff --git a/_pages/map.html b/_pages/map.html new file mode 100644 index 00000000000..1f40cdbceba --- /dev/null +++ b/_pages/map.html @@ -0,0 +1,34 @@ +--- +namespace: maps +permalink: /map/ +permalink_es: /mapa/ +permalink_de: /karte/ +permalink_fr: /carte/ +permalink_pt-br: /mapa/ +permalink_zh-cn: /地图/ +permalink_ru: /карта/ +permalink_id: /peta/ +permalink_hi: /नक्शा/ +title: titles.map +--- + + + + {% include head.html %} + + + + {% include header.html %} {% capture map_title %} {% t titles.map %} {% endcapture %} {% capture map_hook %} {% + tf frontpage/hook.md %} {% endcapture %} {% capture map_description %} {% tf frontpage/description.md %} {% + endcapture %} {% include masthead.html url=page.url title=map_title hook=map_hook description=map_description %} + +
    + +
    + {% google_map width="100%" zoom="2" id="places" src="_data/conferences.yml" no_cluster %} +
    +
    + {% include sneks.html %} +
    {% include_cached footer.html %}
    + + diff --git a/_pages/my-conferences.html b/_pages/my-conferences.html new file mode 100644 index 00000000000..31402aa28a5 --- /dev/null +++ b/_pages/my-conferences.html @@ -0,0 +1,348 @@ +--- +layout: default +title: My Conferences +permalink: /my-conferences/ +extra_css: + - /static/css/dashboard.css +extra_js: + - /static/js/dashboard.js + - /static/js/dashboard-filters.js + - /static/js/notifications.js +--- + + + + +
    +
    + +
    +
    +
    +
    Filters
    + +
    +
    + +
    +
    Conference Format
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    Topics
    + {% for type in site.data.types %} +
    + + +
    + {% endfor %} +
    + + +
    +
    Features
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    Series
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    Conference Series
    +
    +
    +
    + +
    +
    +
    Quick Subscribe
    +
    + + + + +
    +
    +
    +
    + + +
    + + + + +
    +
    +
    +

    My Conference Dashboard

    +

    + 0 favorite conferences | + 0 series subscriptions +

    +
    +
    +
    + + +
    + +
    +
    +
    + + + + + +
    + +
    +
    + Loading... +
    +

    Loading your conferences...

    +
    + + + + + +
    + +
    +
    + + +
    +

    Predicted Upcoming CFPs

    +
    + +
    +
    +
    +
    +
    + + + + + +
    + +
    diff --git a/_pages/privacy-policy.md b/_pages/privacy-policy.md new file mode 100644 index 00000000000..c71924f627e --- /dev/null +++ b/_pages/privacy-policy.md @@ -0,0 +1,61 @@ +--- +title: titles.privacy +author: Jesper Dramsch +namespace: privacy-policy +permalink: /legal/privacy-policy/ +permalink_es: /legal/privacidad +permalink_de: /legal/datenschutz +permalink_fr: /legal/confidentialite +permalink_pt-br: /legal/privacidade +permalink_zh-cn: /legal/隐私政策 +permalink_ru: /legal/конфиденциальность +permalink_id: /legal/privasi +permalink_hi: /legal/गोपनीयता-नीति +layout: post +--- + +At pythondeadlin.es, accessible from pythondeadlin.es, one of our main priorities is the privacy of our visitors. This Privacy Policy document contains types of information that is collected and recorded by pythondeadlin.es and how we use it. + +If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us. + +## Log Files + +pythondeadlin.es follows a standard procedure of using log files. These files log visitors when they visit websites. All hosting companies do this and a part of hosting services' analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp, referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users' movement on the website, and gathering demographic information. Our Privacy Policy was created with the help of the [Privacy Policy Generator](https://www.privacypolicyonline.com/privacy-policy-generator/). + +## Cookies and Web Beacons + +Like any other website, pythondeadlin.es uses 'cookies'. These cookies are used to store information including visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users' experience by customizing our web page content based on visitors' browser type and/or other information. + +For more general information on cookies, please read ["Cookies" article from the Privacy Policy Generator](https://www.generateprivacypolicy.com/#cookies). + +## Google DoubleClick DART Cookie + +Google is one of a third-party vendor on our site. It also uses cookies, known as DART cookies, to serve ads to our site visitors based upon their visit to www.website.com and other sites on the internet. However, visitors may choose to decline the use of DART cookies by visiting the Google ad and content network Privacy Policy at the following URL – [https://policies.google.com/technologies/ads](https://policies.google.com/technologies/ads) + +## Privacy Policies + +You may consult this list to find the Privacy Policy for each of the advertising partners of pythondeadlin.es. + +Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in their respective advertisements and links that appear on pythondeadlin.es, which are sent directly to users' browser. They automatically receive your IP address when this occurs. These technologies are used to measure the effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites that you visit. + +Note that pythondeadlin.es has no access to or control over these cookies that are used by third-party advertisers. + +## Third Party Privacy Policies + +pythondeadlin.es's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may include their practices and instructions about how to opt-out of certain options. + +You can choose to disable cookies through your individual browser options. To know more detailed information about cookie management with specific web browsers, it can be found at the browsers' respective websites. What Are Cookies? + +## Children's Information + +Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity. + +pythondeadlin.es does not knowingly collect any Personal Identifiable Information from children under the age of 13\. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records. + +## Online Privacy Policy Only + +This Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to the information that they shared and/or collect in pythondeadlin.es. This policy is not applicable to any information collected offline or via channels other than this website. + +## Consent + +By using our website, you hereby consent to our Privacy Policy and agree to its Terms and Conditions. diff --git a/_pages/resources.html b/_pages/resources.html new file mode 100644 index 00000000000..cd26ea0f88b --- /dev/null +++ b/_pages/resources.html @@ -0,0 +1,83 @@ +--- +namespace: resources +permalink: /resources/ +permalink_de: /ressourcen/ +permalink_es: /recursos/ +permalink_fr: /ressources/ +permalink_pt-br: /recursos/ +permalink_zh-cn: /资源/ +permalink_ru: /ресурсы/ +permalink_id: /sumber-daya/ +permalink_hi: /संसाधन/ +title: titles.resources +--- + + + + {% include head.html %} + + + {% include header.html %} + + {% capture ress_title %} + {% t titles.resources %} + {% endcapture %} + {% capture ress_hook %} + {% tf frontpage/hook.md %} + {% endcapture %} + {% capture ress_description %} + {% tf resources/description.md %} + {% endcapture %} + + {% include masthead.html url=page.url title=ress_title hook=ress_hook description=ress_description %} +
    +
    +
    +
    +

    Want to submit your first conference talk?

    +

    Our free 5-lesson email course walks you from idea to accepted proposal.

    +
    + +
    +
    +
    +
    +
    +
    + {% for post in site.posts %} +
    +
    + +
    +
    +
    +
    + Tags: {{ post.tags | sort | join:", " }} +
    +
    +
    +
    +
    + {{post.excerpt}} +
    +
    +
    +
    + {% endfor %} +
    +
    +
    +
    {% include_cached footer.html %}
    + + {% include sneks.html %} + + diff --git a/_pages/search.html b/_pages/search.html new file mode 100644 index 00000000000..da24b3aff82 --- /dev/null +++ b/_pages/search.html @@ -0,0 +1,208 @@ +--- +layout: search +namespace: search +permalink: /search/ +permalink_es: /buscar/ +permalink_de: /suche/ +permalink_fr: /recherche/ +permalink_pt-br: /buscar/ +permalink_zh-cn: /搜索/ +permalink_ru: /поиск/ +permalink_id: /pencarian/ +permalink_hi: /खोजें/ +title: titles.search +--- + +
    + + + + + diff --git a/_pages/series.html b/_pages/series.html new file mode 100644 index 00000000000..c47f1cfc358 --- /dev/null +++ b/_pages/series.html @@ -0,0 +1,121 @@ +--- +namespace: series +permalink: /series/ +permalink_es: /serias/ +permalink_de: /serien/ +permalink_fr: /series/ +permalink_pt-br: /series/ +permalink_zh-cn: /系列/ +permalink_ru: /серии/ +permalink_id: /seri/ +permalink_hi: /श्रृंखला/ +title: titles.series +--- + + + + {% include head.html %} + + + {% include header.html %} + + {% capture series_title %} + {% t titles.series %} + {% endcapture %} + {% capture series_hook %} + {% tf frontpage/hook.md %} + {% endcapture %} + {% capture series_description %} + {% tf series/description.md %} + {% endcapture %} + + {% include masthead.html url=page.url title=series_title hook=series_hook description=series_description %} +
    +
    +
    + {% assign confs = site.data.conferences | concat: site.data.archive | concat: site.data.legacy | sort: "year" | reverse | group_by: "conference" | sort: "name" %} + {% assign this_time = "now" | date: "%s" %} + {% for conf in confs %} + {% if conf.items.size > 1 %} +
    +
    +
    + + {{conf.name}} + + + {{conf.name}} + + + Link to Conference Website + ​ + + {% if conf.items[0].mastodon %} + + Link to Conference Mastodon + ​ + + {% elsif conf.items[0].twitter %} + + Link to Conference Twitter + ​ + + {% endif %} +
    +
    +
    + {% capture lastnext_place %}{% assign conf_time = conf.items[0].start | date: "%s" %}{% if this_time < conf_time %}{% t series.place.next %}{% else %}{% t series.place.last %}{% endif %}{% endcapture %} + {% capture lastnext_year %}{% assign conf_time = conf.items[0].start | date: "%s" %}{% if this_time < conf_time %}{% t series.year.next %}{% else %}{% t series.year.last %}{% endif %}{% endcapture %} +
    +
    + + {% assign last_place = conf.items[0].place %} + {% if last_place == conf.items[2].place and last_place == conf.items[1].place %} + {% t series.always %}:  + {% else %} + {{ lastnext_place }}:  + {% endif %} + {% assign idx = 0 %} + {% if last_place == "TBD" %} + {% assign idx = 1 %} + {% endif %} + {% if conf.items[idx].place == "Online" %} + {{conf.items[idx].place}} + {% else %} + {{conf.items[idx].place}} + {% endif %} + +
    +
    +
    +
    +
    +
    + + {{ lastnext_year }} {{ conf.items[0].year }}. + +
    +
    +
    +
    +
    + {% assign subs = conf.items[0].sub | split: "," %} + {% for sub in subs %} + + {% endfor %} +
    +
    +
    +
    +
    +
    +
    + {% endif %} + {% endfor %} +
    +
    +
    +
    {% include_cached footer.html %}
    + {% include sneks.html %} + + diff --git a/_pages/terms-conditions.md b/_pages/terms-conditions.md new file mode 100644 index 00000000000..a5621f8b1e8 --- /dev/null +++ b/_pages/terms-conditions.md @@ -0,0 +1,114 @@ +--- +title: titles.impressum +author: Jesper Dramsch +namespace: impressum +permalink: /legal/terms-conditions/ +permalink_es: /legal/condiciones/ +permalink_de: /legal/impressum/ +permalink_fr: /legal/mentions-legales +permalink_pt-br: /legal/termos-e-condicoes +permalink_zh-cn: /legal/条款和条件 +permalink_ru: /legal/условия +permalink_id: /legal/syarat-dan-ketentuan +permalink_hi: /legal/नियम-और-शर्तें +layout: post +--- + +Welcome to pythondeadlin.es! + +These terms and conditions outline the rules and regulations for the use of pythondeadlin.es's Website, located at pythondeadlin.es. + +By accessing this website we assume you accept these terms and conditions. Do not continue to use pythondeadlin.es if you do not agree to take all of the terms and conditions stated on this page. + +The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice and all Agreements: "Client", "You" and "Your" refers to you, the person log on this website and compliant to the Company’s terms and conditions. "The Company", "Ourselves", "We", "Our" and "Us", refers to our Company. "Party", "Parties", or "Us", refers to both the Client and ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner for the express purpose of meeting the Client’s needs in respect of provision of the Company’s stated services, in accordance with and subject to, prevailing law of Netherlands. Any use of the above terminology or other words in the singular, plural, capitalization and/or he/she or they, are taken as interchangeable and therefore as referring to same. Our Terms and Conditions were created with the help of the [Terms & Conditions Generator](https://www.privacypolicyonline.com/terms-conditions-generator/). + +## Legal Notice (Impressum) + +### **Responsible for the content** (Verantwortlich für den Inhalt): + +- Jesper Dramsch +- c/o easy-shop +- K. Mothes +- Schloßstraße 20 +- 06869 Coswig (Anhalt) +- Germany + +- + +## **Dispute resolution** (Streitschlichtung): + +We are not willing or obliged to participate in dispute resolution proceedings before a consumer arbitration board. + +## **Privacy Notice** (Datenschutz): + +See [Privacy Policy](/legal/privacy-policy). + +### Cookies + +We employ the use of cookies. By accessing pythondeadlin.es, you agreed to use cookies in agreement with the pythondeadlin.es's [Privacy Policy](/legal/privacy-policy/). + +Most interactive websites use cookies to let us retrieve the user’s details for each visit. Cookies are used by our website to enable the functionality of certain areas to make it easier for people visiting our website. Some of our affiliate/advertising partners may also use cookies. + +### License + +Unless otherwise stated, pythondeadlin.es and/or its licensors own the intellectual property rights for all material on pythondeadlin.es. All intellectual property rights are reserved. You may access this from pythondeadlin.es for your own personal use subjected to restrictions set in these terms and conditions. + +You must not: + +- Republish material from pythondeadlin.es +- Sell, rent or sub-license material from pythondeadlin.es +- Reproduce, duplicate or copy material from pythondeadlin.es +- Redistribute content from pythondeadlin.es + +This Agreement shall begin on the date hereof. + +Parts of this website offer an opportunity for users to post and exchange opinions and information in certain areas of the website. pythondeadlin.es does not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views and opinions of pythondeadlin.es,its agents and/or affiliates. Comments reflect the views and opinions of the person who post their views and opinions. To the extent permitted by applicable laws, pythondeadlin.es shall not be liable for the Comments or for any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website. + +pythondeadlin.es reserves the right to monitor all Comments and to remove any Comments which can be considered inappropriate, offensive or causes breach of these Terms and Conditions. + +You warrant and represent that: + +- You are entitled to post the Comments on our website and have all necessary licenses and consents to do so; +- The Comments do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party; +- The Comments do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy +- The Comments will not be used to solicit or promote business or custom or present commercial activities or unlawful activity. + +You hereby grant pythondeadlin.es a non-exclusive license to use, reproduce, edit and authorize others to use, reproduce and edit any of your Comments in any and all forms, formats or media. + +### iFrames + +Without prior approval and written permission, you may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website. + +### Content Liability + +We shall not be hold responsible for any content that appears on your Website. You agree to protect and defend us against all claims that is rising on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights. + +### Reservation of Rights + +We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amen these terms and conditions and it’s linking policy at any time. By continuously linking to our Website, you agree to be bound to and follow these linking terms and conditions. + +### Removal of links from our website + +If you find any link on our Website that is offensive for any reason, you are free to contact and inform us any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly. + +We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up to date. + +### Disclaimer + +To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website. Nothing in this disclaimer will: + +- limit or exclude our or your liability for death or personal injury; +- limit or exclude our or your liability for fraud or fraudulent misrepresentation; +- limit any of our or your liabilities in any way that is not permitted under applicable law; or +- exclude any of our or your liabilities that may not be excluded under applicable law. + +The limitations and prohibitions of liability set in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort and for breach of statutory duty. + +As long as the website and the information and services on the website are provided free of charge, we will not be liable for any loss or damage of any nature. + +## Trademark Notice + +{% tf trademark/generic.md %} +{% tf trademark/django.md %} +{% tf trademark/pycon.md %} +{% tf trademark/pydata.md %} diff --git a/_plugins/data_page_generator.rb b/_plugins/data_page_generator.rb deleted file mode 100644 index 787ac3a2207..00000000000 --- a/_plugins/data_page_generator.rb +++ /dev/null @@ -1,135 +0,0 @@ -# coding: utf-8 -# Generate pages from individual records in yml files -# (c) 2014-2016 Adolfo Villafiorita -# Distributed under the conditions of the MIT License - -module Jekyll - - module Sanitizer - # strip characters and whitespace to create valid filenames, also lowercase - def sanitize_filename(name) - if(name.is_a? Integer) - return name.to_s - end - return name.tr( - "ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÑñÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž", - "AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz" -).downcase.strip.gsub(' ', '-').gsub(/[^\w.-]/, '') - end - end - - # this class is used to tell Jekyll to generate a page - class DataPage < Page - include Sanitizer - - # - site and base are copied from other plugins: to be honest, I am not sure what they do - # - # - `index_files` specifies if we want to generate named folders (true) or not (false) - # - `dir` is the default output directory - # - `data` is the data defined in `_data.yml` of the record for which we are generating a page - # - `name` is the key in `data` which determines the output filename - # - `template` is the name of the template for generating the page - # - `extension` is the extension for the generated file - def initialize(site, base, index_files, dir, data, name, template, extension) - @site = site - @base = base - - # @dir is the directory where we want to output the page - # @name is the name of the page to generate - # - # the value of these variables changes according to whether we - # want to generate named folders or not - if data[name] == nil - puts "error (datapage_gen). empty value for field '#{name}' in record #{data}" - else - filename = sanitize_filename(data[name]).to_s - - @dir = dir + (index_files ? "/" + filename + "/" : "") - @name = (index_files ? "index" : filename) + "." + extension.to_s - - self.process(@name) - self.read_yaml(File.join(base, '_layouts'), template + ".html") - self.data['title'] = data[name] - # add all the information defined in _data for the current record to the - # current page (so that we can access it with liquid tags) - self.data.merge!(data) - end - end - end - - class DataPagesGenerator < Generator - safe true - - # generate loops over _config.yml/page_gen invoking the DataPage - # constructor for each record for which we want to generate a page - - def generate(site) - # page_gen_dirs determines whether we want to generate index pages - # (name/index.html) or standard files (name.html). This information - # is passed to the DataPage constructor, which sets the @dir variable - # as required by this directive - index_files = site.config['page_gen-dirs'] == true - - # data contains the specification of the data for which we want to generate - # the pages (look at the README file for its specification) - data = site.config['page_gen'] - if data - data.each do |data_spec| - index_files_for_this_data = data_spec['index_files'] != nil ? data_spec['index_files'] : index_files - template = data_spec['template'] || data_spec['data'] - name = data_spec['name'] - dir = data_spec['dir'] || data_spec['data'] - extension = data_spec['extension'] || "html" - - if site.layouts.key? template - # records is the list of records defined in _data.yml - # for which we want to generate different pages - records = nil - data_spec['data'].split('.').each do |level| - if records.nil? - records = site.data[level] - else - records = records[level] - end - end - - # apply filtering conditions: - # - filter requires the name of a boolean field - # - filter_condition evals a ruby expression - records = records.select { |r| r[data_spec['filter']] } if data_spec['filter'] - records = records.select { |record| eval(data_spec['filter_condition']) } if data_spec['filter_condition'] - - records.each do |record| - site.pages << DataPage.new(site, site.source, index_files_for_this_data, dir, record, name, template, extension) - end - else - puts "error (datapage_gen). could not find template #{template}" if not site.layouts.key? template - end - end - end - end - end - - module DataPageLinkGenerator - include Sanitizer - - # use it like this: {{input | datapage_url: dir}} - # to generate a link to a data_page. - # - # the filter is smart enough to generate different link styles - # according to the data_page-dirs directive ... - # - # ... however, the filter is not smart enough to support different - # extensions for filenames. - # - # Thus, if you use the `extension` feature of this plugin, you - # need to generate the links by hand - def datapage_url(input, dir) - extension = Jekyll.configuration({})['page_gen-dirs'] ? '/' : '.html' - "#{dir}/#{sanitize_filename(input)}#{extension}" - end - end - -end - -Liquid::Template.register_filter(Jekyll::DataPageLinkGenerator) diff --git a/_plugins/jekyll-ics-wrap-lines-filter.rb b/_plugins/jekyll-ics-wrap-lines-filter.rb new file mode 100644 index 00000000000..5d8f0c87275 --- /dev/null +++ b/_plugins/jekyll-ics-wrap-lines-filter.rb @@ -0,0 +1,21 @@ +module Jekyll + module WrapLinesFilter + def wrap_lines(input_string) + max_length = 72 + wrapped_string = "" + + while input_string.length > max_length + line = input_string.slice!(0, max_length) + line += "\r\n " + wrapped_string += line + end + + wrapped_string += input_string + + wrapped_string + + end + end +end + +Liquid::Template.register_filter(Jekyll::WrapLinesFilter) diff --git a/_plugins/jekyll-lunr-search-index-generator.rb b/_plugins/jekyll-lunr-search-index-generator.rb new file mode 100644 index 00000000000..0f2cd0dc689 --- /dev/null +++ b/_plugins/jekyll-lunr-search-index-generator.rb @@ -0,0 +1,173 @@ +# frozen_string_literal: true +require 'fileutils' +require 'json' +require 'execjs' +require 'nokogiri' +require 'kramdown' + +module Jekyll + + class SearchIndexFile < Jekyll::StaticFile + # Override write as the index.json index file has already been created + def write(dest) + true + end + end + + class LunrSearchIndexGenerator < Jekyll::Generator + safe true + priority :low + + # Initialize with site configuration + def initialize(config = {}) + super(config) + + # Get lunr config from _config.yml or use defaults + @config = config['lunr_search'] || {} + @config['index_dir'] ||= 'assets/search' # Directory for the index file + @config['index_name'] ||= 'search_index' # Name of the generated index file + + # Fields to index with their boost values + @config['fields'] ||= { + 'title' => 10, + 'content' => 1, + 'url' => 1, + 'date' => 1, + 'place' => 1, + 'alt_name' => 10, + 'subs' => 1, + 'link' => 1 + } + end + + def generate(site) + Jekyll.logger.info 'Lunr:', 'Generating search index...' + + # Get the documents to index + items = get_documents_to_index(site) + + # Create the index + index = build_index(site, items) + + # Write the index file + write_index_file(site, index, items) + + Jekyll.logger.info 'Lunr:', 'Search index generated successfully' + end + + private + + def get_documents_to_index(site) + items = [] + + # Add posts + site.posts.docs.each do |post| + items << { + 'id' => post.url.to_s, + 'title' => post.data['title'].to_s, + 'content' => extract_content(post.content), + 'url' => post.url, + 'date' => post.date.strftime('%Y-%m-%d'), + 'place' => '', + 'subs' => '', + 'link' => '', + 'alt_name' => '' + } + end + + # Add conference data + if site.data['conferences'] + confs = [] + confs.concat(site.data['archive']) if site.data['archive'] + confs.concat(site.data['conferences']) if site.data['conferences'] + confs.concat(site.data['legacy']) if site.data['legacy'] + + confs.each do |conf| + next unless conf && conf['conference'] + items << { + 'id' => "#{conf['conference'].to_s.downcase.gsub(/\s+/, '-')}-#{conf['year']}", + 'title' => "#{conf['conference']} #{conf['year']}", + 'content' => "#{conf['conference']} #{conf['year']}", + 'url' => "#{site.baseurl}/conference/#{conf['conference'].to_s.downcase.gsub(/\s+/, '-')}-#{conf['year']}", + 'date' => format_conference_date(conf['start'], conf['end']), + 'place' => conf['place'].to_s, + 'subs' => conf['sub'].to_s, + 'link' => conf['link'].to_s, + 'alt_name' => conf['alt_name'].to_s + } + end + end + + items + end + + def build_index(site, items) + # Load lunr.js + lunr_path = File.join(site.source, "/static/js/lunr.min.js") + lunr_js = File.read(lunr_path) + ctx = ExecJS.compile(lunr_js) + + # Prepare the documents for lunr + documents = items.map do |item| + doc = {} + @config['fields'].each_key do |field| + doc[field] = item[field].to_s if item[field] + end + doc['id'] = item['id'] + doc + end + + # Create the lunr index configuration and add documents + index_js = <<-JS + lunr(function() { + this.ref('id'); + #{@config['fields'].map { |field, boost| "this.field('#{field}', {boost: #{boost}});" }.join("\n")} + + var docs = #{documents.to_json}; + docs.forEach(function(doc) { + this.add(doc); + }, this); + }) + JS + + # Build and return the index + ctx.eval(index_js) + end + + def write_index_file(site, index, items) + # Prepare the index directory + index_dir = File.join(site.dest, @config['index_dir']) + FileUtils.mkdir_p(index_dir) + + # Create the combined index and documents file + data = { + 'index' => index, + 'docs' => items.map { |item| [item['id'], item] }.to_h + } + + # Write to file + index_file = File.join(index_dir, "#{@config['index_name']}.json") + File.write(index_file, JSON.generate(data)) + + # Register the file with Jekyll + site.static_files << Jekyll::SearchIndexFile.new( + site, + site.dest, + @config['index_dir'], + "#{@config['index_name']}.json" + ) + end + + def extract_content(content) + return '' unless content + # Convert markdown to HTML and strip all tags + html = Kramdown::Document.new(content).to_html + Nokogiri::HTML(html).text.strip.gsub(/\s+/, ' ') + end + + def format_conference_date(start_date, end_date) + return '' unless start_date && end_date + "#{start_date} - #{end_date}" + end + end +end diff --git a/_plugins/jekyll-timezone-finder.rb b/_plugins/jekyll-timezone-finder.rb new file mode 100644 index 00000000000..834d535146a --- /dev/null +++ b/_plugins/jekyll-timezone-finder.rb @@ -0,0 +1,33 @@ +# _plugins/timezone_filters.rb +require 'tzinfo' + +module Jekyll + module TimezoneFilters + def to_utc(date, timezone = "Etc/GMT+12") + return nil if date.nil? || date == "TBA" || date == "None" || date == "Cancelled" + + date = Time.parse(date.to_s) unless date.is_a?(Time) + + begin + if timezone&.start_with?("UTC") + offset = timezone[3..-1].to_i + offset_seconds = offset * 3600 + time_with_offset = Time.at(date.to_i - offset_seconds).utc + time_with_offset.strftime("%Y%m%dT%H%M%SZ") + else + tz = TZInfo::Timezone.get(timezone) + local = tz.local_datetime(date.year, date.month, date.day, date.hour, date.min, date.sec) + utc = tz.local_to_utc(local) + utc.strftime("%Y%m%dT%H%M%SZ") + end + rescue TZInfo::InvalidTimezoneIdentifier + tz = TZInfo::Timezone.get("Etc/GMT+12") + local = tz.local_datetime(date.year, date.month, date.day, date.hour, date.min, date.sec) + utc = tz.local_to_utc(local) + utc.strftime("%Y%m%dT%H%M%SZ") + end + end + end +end + +Liquid::Template.register_filter(Jekyll::TimezoneFilters) diff --git a/_years/2002.md b/_years/2002.md new file mode 100644 index 00000000000..91686736a79 --- /dev/null +++ b/_years/2002.md @@ -0,0 +1,3 @@ +--- +year: 2002 +--- diff --git a/_years/2003.md b/_years/2003.md new file mode 100644 index 00000000000..83256bef3c1 --- /dev/null +++ b/_years/2003.md @@ -0,0 +1,3 @@ +--- +year: 2003 +--- diff --git a/_years/2004.md b/_years/2004.md new file mode 100644 index 00000000000..a7bb87c51f8 --- /dev/null +++ b/_years/2004.md @@ -0,0 +1,3 @@ +--- +year: 2004 +--- diff --git a/_years/2005.md b/_years/2005.md new file mode 100644 index 00000000000..8723e3e6434 --- /dev/null +++ b/_years/2005.md @@ -0,0 +1,3 @@ +--- +year: 2005 +--- diff --git a/_years/2006.md b/_years/2006.md new file mode 100644 index 00000000000..6747e597252 --- /dev/null +++ b/_years/2006.md @@ -0,0 +1,3 @@ +--- +year: 2006 +--- diff --git a/_years/2007.md b/_years/2007.md new file mode 100644 index 00000000000..1c5121a51d5 --- /dev/null +++ b/_years/2007.md @@ -0,0 +1,3 @@ +--- +year: 2007 +--- diff --git a/_years/2008.md b/_years/2008.md new file mode 100644 index 00000000000..4c32642902a --- /dev/null +++ b/_years/2008.md @@ -0,0 +1,3 @@ +--- +year: 2008 +--- diff --git a/_years/2009.md b/_years/2009.md new file mode 100644 index 00000000000..5fc56876f37 --- /dev/null +++ b/_years/2009.md @@ -0,0 +1,3 @@ +--- +year: 2009 +--- diff --git a/_years/2010.md b/_years/2010.md new file mode 100644 index 00000000000..659b67bb34a --- /dev/null +++ b/_years/2010.md @@ -0,0 +1,3 @@ +--- +year: 2010 +--- diff --git a/_years/2011.md b/_years/2011.md new file mode 100644 index 00000000000..63fbb8649d0 --- /dev/null +++ b/_years/2011.md @@ -0,0 +1,3 @@ +--- +year: 2011 +--- diff --git a/_years/2012.md b/_years/2012.md new file mode 100644 index 00000000000..7281b6e961a --- /dev/null +++ b/_years/2012.md @@ -0,0 +1,3 @@ +--- +year: 2012 +--- diff --git a/_years/2013.md b/_years/2013.md new file mode 100644 index 00000000000..9d8f8f8a191 --- /dev/null +++ b/_years/2013.md @@ -0,0 +1,3 @@ +--- +year: 2013 +--- diff --git a/_years/2014.md b/_years/2014.md new file mode 100644 index 00000000000..2828042606f --- /dev/null +++ b/_years/2014.md @@ -0,0 +1,3 @@ +--- +year: 2014 +--- diff --git a/_years/2015.md b/_years/2015.md new file mode 100644 index 00000000000..8572d3cbfce --- /dev/null +++ b/_years/2015.md @@ -0,0 +1,3 @@ +--- +year: 2015 +--- diff --git a/_years/2016.md b/_years/2016.md new file mode 100644 index 00000000000..ec04d8fd233 --- /dev/null +++ b/_years/2016.md @@ -0,0 +1,3 @@ +--- +year: 2016 +--- diff --git a/_years/2017.md b/_years/2017.md new file mode 100644 index 00000000000..4844419e9d2 --- /dev/null +++ b/_years/2017.md @@ -0,0 +1,3 @@ +--- +year: 2017 +--- diff --git a/_years/2018.md b/_years/2018.md new file mode 100644 index 00000000000..3fe1b88d02e --- /dev/null +++ b/_years/2018.md @@ -0,0 +1,3 @@ +--- +year: 2018 +--- diff --git a/_years/2019.md b/_years/2019.md new file mode 100644 index 00000000000..99fdf3104ee --- /dev/null +++ b/_years/2019.md @@ -0,0 +1,3 @@ +--- +year: 2019 +--- diff --git a/_years/2020.md b/_years/2020.md new file mode 100644 index 00000000000..515dd650c2e --- /dev/null +++ b/_years/2020.md @@ -0,0 +1,3 @@ +--- +year: 2020 +--- diff --git a/_years/2021.md b/_years/2021.md new file mode 100644 index 00000000000..3ed76fe6f2f --- /dev/null +++ b/_years/2021.md @@ -0,0 +1,3 @@ +--- +year: 2021 +--- diff --git a/_years/2022.md b/_years/2022.md new file mode 100644 index 00000000000..80adbe524a4 --- /dev/null +++ b/_years/2022.md @@ -0,0 +1,3 @@ +--- +year: 2022 +--- diff --git a/_years/2023.md b/_years/2023.md new file mode 100644 index 00000000000..cb0fbd75f96 --- /dev/null +++ b/_years/2023.md @@ -0,0 +1,3 @@ +--- +year: 2023 +--- diff --git a/_years/2024.md b/_years/2024.md new file mode 100644 index 00000000000..fa1761ca23c --- /dev/null +++ b/_years/2024.md @@ -0,0 +1,3 @@ +--- +year: 2024 +--- diff --git a/_years/2025.md b/_years/2025.md new file mode 100644 index 00000000000..d52bf724c4c --- /dev/null +++ b/_years/2025.md @@ -0,0 +1,3 @@ +--- +year: 2025 +--- diff --git a/ads.txt b/ads.txt new file mode 100644 index 00000000000..5ab7136a2ed --- /dev/null +++ b/ads.txt @@ -0,0 +1 @@ +google.com, pub-2158291969836277, DIRECT, f08c47fec0942fa0 diff --git a/calendar.html b/calendar.html deleted file mode 100644 index 8ea9d098ee7..00000000000 --- a/calendar.html +++ /dev/null @@ -1,155 +0,0 @@ ---- -permalink: /calendar/ ---- - - - - {% include head.html %} - - - - - {% include header.html %} -
    -
    -

    Calendar Overview of Conference Deadlines and Dates

    -
    -
    - Overview of deadlines and conference dates in a calendar. - Also, countdowns to Python conference deadlines. -
    -
    -
    - -
    - - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    -
    - - -
    -
    -
    -
    - Deadlines -
    -
    - Today -
    - {% for type in site.data.types %} -
    - {{ type.name }} -
    - {% endfor %} -
    -
    -
    - {% include footer.html %} -
    - -
    - - - - - - \ No newline at end of file diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000000..05b3e603a4b --- /dev/null +++ b/codecov.yml @@ -0,0 +1,94 @@ +# Codecov configuration for Python Deadlines + +coverage: + # Coverage precision + precision: 2 + round: down + range: "70...90" + + status: + # Overall project coverage + project: + default: + target: 75% + threshold: 2% + base: auto + if_not_found: success + if_ci_failed: error + only_pulls: false + + # Frontend JavaScript coverage + frontend: + target: 75% + threshold: 2% + paths: + - "static/js/**/*.js" + flags: + - frontend + + # Python utilities coverage + python: + target: 80% + threshold: 2% + paths: + - "utils/**/*.py" + flags: + - python + + # Patch coverage for PRs + patch: + default: + target: 80% + threshold: 5% + base: auto + if_not_found: success + +# Flags configuration +flags: + frontend: + paths: + - "static/js/**/*.js" + carryforward: true + + python: + paths: + - "utils/**/*.py" + carryforward: true + + e2e: + paths: + - "tests/e2e/**" + carryforward: false + +# Comment configuration +comment: + layout: "reach, diff, flags, files" + behavior: default + require_changes: false + require_base: false + require_head: true + hide_project_coverage: false + +# Ignore certain files +ignore: + - "**/*.min.js" + - "**/vendor/**" + - "**/node_modules/**" + - "tests/**" + - "_site/**" + - "**/__pycache__/**" + - "*.egg-info/**" + +# Codecov behavior +behavior: + default_rules: + flag_coverage_not_uploaded_behavior: include + individual_flags: + - name: frontend + after_n_builds: 1 + - name: python + after_n_builds: 1 + +# GitHub integration +github_checks: + annotations: true diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000000..ae2bc32d346 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,23 @@ +files: + - source: /_i18n/en.yml + translation: /_i18n/%locale%.yml + - source: /_i18n/en/_posts/* + translation: /_i18n/%locale%/_posts/%original_file_name% + - source: /_i18n/en/calendar + translation: /_i18n/%locale%/calendar/%original_file_name% + - source: /_i18n/en/dates + translation: /_i18n/%locale%/dates/%original_file_name% + - source: /_i18n/en/footer + translation: /_i18n/%locale%/footer/%original_file_name% + - source: /_i18n/en/frontpage + translation: /_i18n/%locale%/frontpage/%original_file_name% + - source: /_i18n/en/maps + translation: /_i18n/%locale%/maps/%original_file_name% + - source: /_i18n/en/resources + translation: /_i18n/%locale%/resources/%original_file_name% + - source: /_i18n/en/search + translation: /_i18n/%locale%/search/%original_file_name% + - source: /_i18n/en/series + translation: /_i18n/%locale%/series/%original_file_name% + - source: /_i18n/en/trademark + translation: /_i18n/%locale%/trademark/%original_file_name% diff --git a/feed.xml b/feed.xml new file mode 100644 index 00000000000..32cd4eaccb6 --- /dev/null +++ b/feed.xml @@ -0,0 +1,74 @@ +--- +--- + + + + + {{ site.title | xml_escape }} + {% if site.description %}{{ site.description | xml_escape }}{% endif %} + {{ site.url }} + + en-US + Copyright {{ site.time | date: '%Y' }}, {{ site.title | xml_escape }} + {{ site.time | date_to_rfc822 }} + Jekyll v{{ jekyll.version }} + hourly + 1 + + {{ site.baseurl_root }}/static/images/logo.png + {{ site.title | xml_escape }} + {{ site.baseurl}} + + + {% for conf in site.data.conferences limit:23 %} + {% if conf.cfp_ext %} + {% assign cfp = conf.cfp_ext %} + {% else %} + {% assign cfp = conf.cfp %} + {% endif %} + {% if cfp != "TBA" and cfp != "Cancelled" and cfp != "None" %} + + {{ conf.conference | xml_escape }} {{ conf.year }} Conference Deadline + {{ site.baseurl }}/conference/{{conf.conference | slugify: "latin"}}-{{conf.year}}/ + {{conf.conference | slugify: "latin"}}-{{conf.year}} + {{ cfp | date: "%Y-%m-%d %H:%M:%S" | date_to_rfc822 }} + + {{ site.title | xml_escape }} + {{ conf.sub }} + + + + +

    📍 {{ conf.place | xml_escape }} ·

    +

    📝 CfP Deadline:

    + {% if conf.cfp_link %}

    Submit your proposal →

    {% endif %} +
    + ]]> + + + + + {{ conf.conference | xml_escape }} {{ conf.year }} + {{ conf.start }} + {{ conf.end }} + {{ conf.place | xml_escape }} + {{ cfp }} + + + + {% if conf.latitude and conf.longitude %} + {{ conf.latitude }} {{ conf.longitude }} + {% endif %} + + {% endif %} + {% endfor %} + + diff --git a/index.html b/index.html index c9c0587a0d7..88e2c76c891 100644 --- a/index.html +++ b/index.html @@ -1,288 +1,174 @@ --- +layout: home --- - - - - {% include head.html %} - - - {% include header.html %} -
    - -
    +
    - {% for conf in site.data.conferences %} + {% assign confs = site.data.conferences | sort: "cfp" | reverse %} + {% for conf in confs %} {% assign subs = conf.sub | split: "," %} -
    - -
    -
    -
    - {{conf.date}}. - - {% if conf.place == "Online" %} - {{conf.place}}. - {% else %} - {{conf.place}}. - {% endif %} - -
    - {% if conf.note %} -
    - Note: {{conf.note}} -
    - {% endif %} - -
    -
    -
    -
    Deadline: - -
    -
    - -
    -
    -
    -
    - {% assign subs = conf.sub | split: "," %} - {% for sub in subs %} - - {% endfor %} -
    -
    -
    -
    -
    -
    +
    + {% include index_conf_title_row.html %} + {% include_cached index_conf_date_place.html place=conf.place extra_places=conf.extra_places note=conf.note cfp=conf.cfp start=conf.start end=conf.end %} + {% include index_conf_subs.html subs=subs %} +
    {% endfor %}
    -

    Past Calls for Participation

    -
    - -
    +

    {% t titles.past_cfps %}

    -

    Past Events

    -
    - -
    +

    {% t titles.past_events %}

    +
    +
    -
    - {% include footer.html %} -


    + - - diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000000..907955c1bfa --- /dev/null +++ b/jest.config.js @@ -0,0 +1,174 @@ +module.exports = { + testEnvironment: 'jsdom', + roots: ['/tests/frontend', '/static/js'], + + // Setup files + setupFiles: [ + '/tests/frontend/utils/globalSetup.js', + 'jest-localstorage-mock' + ], + setupFilesAfterEnv: [ + '/tests/frontend/setup.js' + ], + + // Module mappings + moduleNameMapper: { + // Mock static assets + '\\.(css|less|scss|sass)$': '/tests/frontend/__mocks__/styleMock.js', + '\\.(jpg|jpeg|png|gif|svg)$': '/tests/frontend/__mocks__/fileMock.js', + + // Map jQuery and other libraries + '^jquery$': '/static/js/jquery.min.js', + '^luxon$': '/static/js/luxon.js', + '^store$': '/static/js/store.min.js' + }, + + // Coverage configuration + collectCoverageFrom: [ + 'static/js/**/*.js', + '!static/js/**/*.min.js', + '!static/js/jquery*.js', + '!static/js/bootstrap*.js', + '!static/js/popper*.js', + '!static/js/lunr*.js', + '!static/js/store*.js', + '!static/js/luxon.js', + '!static/js/js-year-calendar*.js', + '!static/js/ouical*.js', + '!static/js/bootstrap-multiselect*.js', + '!static/js/jquery.countdown*.js' + ], + + coverageDirectory: '/coverage', + + coverageThreshold: { + './static/js/notifications.js': { + branches: 71, + functions: 85, + lines: 85, + statements: 82 + }, + './static/js/countdown-simple.js': { + branches: 75, + functions: 80, + lines: 80, + statements: 80 + }, + './static/js/search.js': { + branches: 70, + functions: 75, + lines: 75, + statements: 75 + }, + './static/js/favorites.js': { + branches: 65, + functions: 60, + lines: 78, + statements: 78 + }, + './static/js/dashboard.js': { + branches: 60, + functions: 70, + lines: 70, + statements: 70 + }, + './static/js/conference-manager.js': { + branches: 50, + functions: 60, + lines: 60, + statements: 60 + }, + './static/js/conference-filter.js': { + branches: 65, + functions: 70, + lines: 70, + statements: 70 + }, + './static/js/theme-toggle.js': { + branches: 85, + functions: 100, + lines: 94, + statements: 94 + }, + './static/js/timezone-utils.js': { + branches: 85, + functions: 100, + lines: 92, + statements: 92 + }, + './static/js/series-manager.js': { + branches: 65, + functions: 70, + lines: 82, + statements: 80 + }, + './static/js/lazy-load.js': { + branches: 48, + functions: 65, + lines: 72, + statements: 72 + }, + './static/js/action-bar.js': { + branches: 38, + functions: 30, + lines: 40, + statements: 40 + }, + './static/js/dashboard-filters.js': { + branches: 70, + functions: 85, + lines: 88, + statements: 86 + }, + './static/js/about.js': { + branches: 80, + functions: 85, + lines: 95, + statements: 93 + }, + './static/js/snek.js': { + branches: 100, + functions: 40, + lines: 84, + statements: 84 + } + }, + + // Test patterns + testMatch: [ + '**/tests/frontend/**/*.test.js', + '**/tests/frontend/**/*.spec.js' + ], + + + // Global variables available in tests + globals: { + IS_TESTING: true, + JEKYLL_ENV: 'test' + }, + + // Ignore patterns + testPathIgnorePatterns: [ + '/node_modules/', + '/_site/', + '/vendor/' + ], + + // Reporter configuration + reporters: [ + 'default' + // Uncomment if jest-html-reporter is installed: + // ['jest-html-reporter', { + // pageTitle: 'Python Deadlines Frontend Test Report', + // outputPath: './coverage/test-report.html' + // }] + ], + + // Timeout for tests + testTimeout: 10000, + + // Clear mocks between tests + clearMocks: true, + restoreMocks: true, + resetMocks: true +}; diff --git a/naver6aa9ea87864768e31ad9139c89a0c2eb.html b/naver6aa9ea87864768e31ad9139c89a0c2eb.html new file mode 100644 index 00000000000..b56393ed59c --- /dev/null +++ b/naver6aa9ea87864768e31ad9139c89a0c2eb.html @@ -0,0 +1 @@ +naver-site-verification: naver6aa9ea87864768e31ad9139c89a0c2eb.html diff --git a/newsletter.xml b/newsletter.xml new file mode 100644 index 00000000000..22d0d7ce567 --- /dev/null +++ b/newsletter.xml @@ -0,0 +1,50 @@ +--- +permalink: /newsletter.xml +--- + + + + {{ site.title | xml_escape }} Newsletter + Python conference CFP deadlines coming up in the next 14 days + {{ site.url }} + + en-US + {{ site.time | date_to_rfc822 }} + Jekyll v{{ jekyll.version }} +{%- assign today = site.time | date: "%s" | plus: 0 -%} +{%- assign horizon = site.time | date: "%s" | plus: 1209600 -%} +{%- assign taglines = "yes, your weird side project counts.|first-timers especially welcome.|got a Python story worth telling?|your debugging war stories are gold.|submit before you talk yourself out of it.|that thing you fixed at 2am? talk material.|the niche you think is too niche? it isn't.|lurkers, this is your sign.|polish optional. submit anyway.|the talk you wish existed? write it.|your maintainer rants are speaker material.|the conference is just people who said yes." | split: "|" -%} +{%- assign shuffled = taglines | sample: taglines.size -%} +{%- assign emitted = 0 -%} +{%- for conf in site.data.conferences -%} + {%- if conf.cfp_ext -%} + {%- assign cfp = conf.cfp_ext -%} + {%- else -%} + {%- assign cfp = conf.cfp -%} + {%- endif -%} + {%- if cfp != "TBA" and cfp != "Cancelled" and cfp != "None" -%} + {%- assign cfp_epoch = cfp | date: "%s" | plus: 0 -%} + {%- if cfp_epoch >= today and cfp_epoch <= horizon -%} + {%- assign idx = emitted | modulo: shuffled.size -%} + {%- assign tagline = shuffled[idx] -%} + {%- assign today_midnight = site.time | date: "%Y-%m-%d" | date: "%s" | plus: 0 -%} + {%- assign days_until = cfp_epoch | minus: today_midnight | divided_by: 86400 %} + + {{ conf.conference | xml_escape }} {{ conf.year }} + {{ site.url }}{{ site.baseurl }}/conference/{{ conf.conference | slugify: "latin" }}-{{ conf.year }}/ + {{ conf.conference | slugify: "latin" }}-{{ conf.year }} + {{ site.time | date_to_rfc822 }} + {{ site.title | xml_escape }} + {{ conf.sub }} + 📍 {{ conf.place | xml_escape }} · 📅 {% translate_file dates/pretty_dates.html start=conf.start end=conf.end %}

    ✍ CfP closes {% translate_file dates/pretty_dates.html start=cfp end=cfp %} — {{ tagline }}

    ]]>
    +
    + {%- assign emitted = emitted | plus: 1 -%} + {%- endif -%} + {%- endif -%} +{%- endfor %} +
    +
    diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000000..1d4b54c68fa --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5462 @@ +{ + "name": "python-deadlines-frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "python-deadlines-frontend", + "version": "1.0.0", + "devDependencies": { + "@playwright/test": "^1.56.1", + "@testing-library/dom": "^9.3.3", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/user-event": "^14.5.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-localstorage-mock": "^2.4.26", + "luxon": "^3.4.4" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@playwright/test": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", + "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.56.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz", + "integrity": "sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", + "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/node": { + "version": "24.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", + "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", + "dev": true, + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001741", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", + "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.217", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.217.tgz", + "integrity": "sha512-Pludfu5iBxp9XzNl0qq2G87hdD17ZV7h5T4n6rQXDi3nCyloBV3jreE9+8GC6g4X/5yxqVgXEURpcLtM0WS4jA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-localstorage-mock": { + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.26.tgz", + "integrity": "sha512-owAJrYnjulVlMIXOYQIPRCCn3MmqI3GzgfZCXdD3/pmwrIvFMXcKVWZ+aMc44IzaASapg0Z4SEFxR+v5qxDA2w==", + "dev": true, + "engines": { + "node": ">=6.16.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz", + "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.24", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz", + "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/playwright": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.56.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000000..0c0f29b5cfa --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "python-deadlines-frontend", + "version": "1.0.0", + "description": "Frontend testing and build tools for Python Deadlines", + "private": true, + "scripts": { + "test": "jest", + "test:watch": "jest --watch", + "test:coverage": "jest --coverage", + "test:integration": "jest tests/frontend/integration", + "test:debug": "node --inspect-brk ./node_modules/.bin/jest --runInBand", + "test:ci": "jest --ci --coverage --maxWorkers=2", + "e2e": "playwright test", + "e2e:headed": "playwright test --headed", + "e2e:debug": "playwright test --debug", + "e2e:ui": "playwright test --ui", + "e2e:codegen": "playwright codegen http://localhost:4000", + "e2e:report": "playwright show-report", + "e2e:fast": "playwright test --project=chromium", + "e2e:all": "playwright test --project=chromium --project=firefox --project=webkit", + "e2e:mobile": "playwright test --project=mobile-chrome --project=mobile-safari", + "playwright:install": "playwright install --with-deps chromium", + "playwright:install-all": "playwright install --with-deps", + "serve:test": "bundle exec jekyll serve --config _config.yml,_config.test.yml --incremental", + "serve:minimal": "bundle exec jekyll serve --config _config.yml,_config.minimal.yml --incremental", + "serve:dev": "bundle exec jekyll serve --config _config.yml,_config.dev.yml --incremental" + }, + "devDependencies": { + "@playwright/test": "^1.56.1", + "@testing-library/dom": "^9.3.3", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/user-event": "^14.5.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-localstorage-mock": "^2.4.26", + "luxon": "^3.4.4" + } +} diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 00000000000..b2b77436a41 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,4692 @@ +version: 6 +environments: + all-contrib: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.26.1-py311hfdbb021_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.6.0-hc19f0b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py311h7db5c69_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py311h902ca64_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.26.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.1-py311h1ddb823_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311hf719da1_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h146a0b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/levenshtein-0.26.1-py311h6885ffc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-29_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-29_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-29_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.13.0-h02a13b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.3-py311h8685306_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py311hca32420_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py311h71babbd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.26.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rapidfuzz-3.14.1-py311h251fd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311h2c37856_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py311h5bb9006_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2025.1.31-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311h3485c13_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.26.1-py311hda3d55a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-29_h576b46c_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-29_h7ad3364_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_ha69328c_1001.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-29_hacfb0e4_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.5-he286e8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.13.0-hfeaa22a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.3-py311h80b3fa1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.3-py311hcf9f919_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py311hf51aa87_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.26.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py311h5082efb_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.1-py311h3e6a449_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h3257749_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h5fd82a7_24.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_31.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py311hf893f09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.25.1-py311hb755f60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py311h7db5c69_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py311h902ca64_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.1-py311h1ddb823_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311hf719da1_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h146a0b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/levenshtein-0.26.1-py311h6885ffc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-29_h10e41b3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-29_hb3479ef_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-29_hc9a63f6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.3-py311h8685306_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py311hca32420_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py311h71babbd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.26.1-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rapidfuzz-3.14.1-py311h251fd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311h2c37856_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py311h5bb9006_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311h3485c13_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.25.1-py311h12c1d0e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.0-h06f855e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.0-ha29bfb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.3-py311h80b3fa1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.3-py311hcf9f919_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py311hf51aa87_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.25.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py311h5082efb_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.1-py311h3e6a449_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h3257749_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_31.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + tests: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.27.1-py311h1ddb823_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-24.4.1-heeeca48_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py311h7db5c69_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py311h902ca64_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.27.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.1-py311h1ddb823_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311hf719da1_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h146a0b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.6-py311ha9b3269_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/levenshtein-0.27.1-py311hf719da1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-35_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-35_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.1-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.1.0-hfdf1602_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-35_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.0-hbb9b287_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-24.4.1-hab9d20b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.3-py311h8685306_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py311hca32420_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py311h71babbd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.27.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rapidfuzz-3.14.1-py311h251fd82_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311h2c37856_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py311h5bb9006_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311h3485c13_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.6-py311h3f79411_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.27.1-py311h3e6a449_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.0-h06f855e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.0-ha29bfb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-20.1.8-hfa2b4ca_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-24.4.1-he453025_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.3-py311h80b3fa1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.3-py311hcf9f919_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py311hf51aa87_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.27.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py311h5082efb_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.1-py311h3e6a449_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h3257749_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py311hf893f09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + - pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + sha256: 668f0825b6c18e4012ca24a0070562b6ec801ebc7008228a428eb52b4038873f + md5: 7e9f4612544c8edbfd6afad17f1bd045 + depends: + - python >=3.7 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types?source=hash-mapping + size: 18235 + timestamp: 1716290348421 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c + depends: + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/annotated-types?source=hash-mapping + size: 18074 + timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda + sha256: 318d4985acbf46457d254fbd6f0df80cc069890b5fc0013b3546d88eee1b1a1f + md5: 7138a06a7b0d11a23cfae323e6010a08 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 hb03c661_4 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=compressed-mapping + size: 354304 + timestamp: 1756599521587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py311hf719da1_4.conda + sha256: 64645da991de052f0e522486cf97f8457fb37ed5c30d67655d3a32d2b9f56167 + md5: 4cd43bb7ba1a3cb4cd7a2e335f6d3c32 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - libbrotlicommon 1.1.0 h6caf38d_4 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=compressed-mapping + size: 340889 + timestamp: 1756599941690 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda + sha256: d524edc172239fec70ad946e3b2fa1b9d7eea145ad80e9e66da25a4d815770ea + md5: 21d3a7fa95d27938158009cd08e461f2 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libbrotlicommon 1.1.0 hfd05255_4 + license: MIT + license_family: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + size: 323289 + timestamp: 1756600106141 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 + md5: 69b8b6202a07720f448be700e300ccf4 + depends: + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 254228 + timestamp: 1699279927352 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 260341 + timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 125061 + timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 + md5: 1077e9333c41ff0be8edd1a5ec0ddace + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 55977 + timestamp: 1757437738856 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 54927 + timestamp: 1720974860185 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 + md5: 26eb8ca6ea332b675e11704cce84a3be + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 124580 + timestamp: 1699280668742 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda + sha256: 979af0932b2a5a26112044891a2d79e402e5ae8166f50fa48b8ebae47c0a2d65 + md5: 847c3c2905cc467cea52c24f9cfa8080 + license: ISC + purls: [] + size: 156035 + timestamp: 1717311767102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + license: ISC + purls: [] + size: 158144 + timestamp: 1738298224464 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: c9e0c0f82f6e63323827db462b40ede8 + depends: + - __win + license: ISC + purls: [] + size: 154489 + timestamp: 1754210967212 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: 74784ee3d225fc3dca89edb635b4e5cc + depends: + - __unix + license: ISC + purls: [] + size: 154402 + timestamp: 1754210968730 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda + sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 + md5: 3569d6a9141adc64d2fe4797f3289e06 + license: ISC + purls: [] + size: 158425 + timestamp: 1738298167688 +- conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 + md5: 63da060240ab8087b60d1357051ea7d6 + license: ISC + purls: [] + size: 155886 + timestamp: 1706843918052 +- conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2025.1.31-h56e8100_0.conda + sha256: 1bedccdf25a3bd782d6b0e57ddd97cdcda5501716009f2de4479a779221df155 + md5: 5304a31607974dfc2110dfbb662ed092 + license: ISC + purls: [] + size: 158690 + timestamp: 1738298232550 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + sha256: 048c16a9cbcb1fbad02083414d3bc7c1d0eea4b39aee6aa6bf8d1d5089ca8bad + md5: 6feb87357ecd66733be3279f16a8c400 + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 161642 + timestamp: 1734380604767 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + md5: 0876280e409658fc6f9e75d035960333 + depends: + - python >=3.7 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 160559 + timestamp: 1707022289175 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 11f59985f49df4620890f3e746ed7102 + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/certifi?source=compressed-mapping + size: 158692 + timestamp: 1754231530168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda + sha256: bbd04c8729e6400fa358536b1007c1376cc396d569b71de10f1df7669d44170e + md5: 82e0123a459d095ac99c76d150ccdacf + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=compressed-mapping + size: 303055 + timestamp: 1756808613387 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py311h146a0b8_1.conda + sha256: 97635f50d473eae17e11b954570efdc66b615dfa6321dd069742d6df4c14a8ba + md5: 1c72ccc307e7681c34e1c06c1711ee33 + depends: + - __osx >=11.0 + - libffi >=3.4.6,<3.5.0a0 + - pycparser + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=compressed-mapping + size: 293204 + timestamp: 1756808628759 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py311h3485c13_1.conda + sha256: 46baee342b50ce7fbf4c52267f73327cb0512b970332037c8911afee1e54f063 + md5: 553a1836df919ca232b80ce1324fa5bb + depends: + - pycparser + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 296743 + timestamp: 1756808544874 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c + md5: ebb5f5f7dc4f1a3780ef7ea7738db08c + depends: + - python >=3.6.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfgv?source=hash-mapping + size: 10788 + timestamp: 1629909423398 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + sha256: d5696636733b3c301054b948cdd793f118efacce361d9bd4afb57d5980a9064f + md5: 57df494053e17dce2ac3a0b33e1b2a2e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfgv?source=hash-mapping + size: 12973 + timestamp: 1734267180483 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + md5: 7f4a9e3fcff3f6356ae99244a014da6a + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 46597 + timestamp: 1698833765762 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda + sha256: 838d5a011f0e7422be6427becba3de743c78f3874ad2743c341accbba9bb2624 + md5: 7e7d5ef1b9ed630e4a1c358d6bc62284 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=hash-mapping + size: 51033 + timestamp: 1754767444665 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 25170 + timestamp: 1666700778190 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_1.conda + sha256: 5728c93177af112d6d53ea8e1e4a11c47395c8f7d50f00b7e3aabc3b0529922f + md5: d4d341946049625afebfb720f011753a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 392749 + timestamp: 1756930683653 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.10.6-py311ha9b3269_1.conda + sha256: 05a8a2768837849085de1f4ff8e3c0603f661f23e7b4a193b084fd9e9daddeb8 + md5: 362773080a4a2580b6f43a976c9af809 + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - tomli + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 389526 + timestamp: 1756931060621 +- conda: https://conda.anaconda.org/conda-forge/win-64/coverage-7.10.6-py311h3f79411_1.conda + sha256: 2262f950b8b32e1a3869b872bbff4c0b7324b8cd81e1c590c953e9c970899572 + md5: cb00671279e93d3007cc55ff53023da7 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + size: 417327 + timestamp: 1756930890538 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + sha256: 3ff11acdd5cc2f80227682966916e878e45ced94f59c402efb94911a5774e84e + md5: db16c66b759a64dc5183d69cc3745a52 + depends: + - python 2.7|>=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=hash-mapping + size: 274915 + timestamp: 1702383349284 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda + sha256: 0e160c21776bd881b79ce70053e59736f51036784fa43a50da10a04f0c1b9c45 + md5: 8d88f4a2242e6b96f9ecff9a6a05b2f1 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=hash-mapping + size: 274151 + timestamp: 1733238487461 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + sha256: 6d977f0b2fc24fee21a9554389ab83070db341af6d6f09285360b2e09ef8b26e + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=hash-mapping + size: 275642 + timestamp: 1752823081585 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca + md5: 72e42d28960d875c7654614f8b50939a + depends: + - python >=3.9 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 21284 + timestamp: 1746947398083 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + sha256: 6031be667e1b0cc0dee713f1cbca887cdee4daafa8bac478da33096f3147d38b + md5: 831d85ae0acfba31b8efd0f0d07da736 + depends: + - python >=3.7 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 15902 + timestamp: 1714422911808 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17544 + timestamp: 1737517924333 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda + sha256: 7a2497c775cc7da43b5e32fc5cf9f4e8301ca723f0eb7f808bbe01c6094a3693 + md5: 9c418d067409452b2e87e0016257da68 + depends: + - python >=3.9 + license: Unlicense + purls: + - pkg:pypi/filelock?source=compressed-mapping + size: 18003 + timestamp: 1755216353218 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + sha256: 0aa1cdc67a9fe75ea95b5644b734a756200d6ec9d0dff66530aec3d1c1e9df75 + md5: b4754fb1bdcb70c8fd54f918301582c6 + depends: + - hpack >=4.1,<5 + - hyperframe >=6.1,<7 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + size: 53888 + timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + depends: + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.1,<5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=compressed-mapping + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: 0a802cb9888dd14eeefc611f05c40b6e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 30731 + timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.12-pyhd8ed1ab_0.conda + sha256: c0a5017090710e25c3735b8d0661c27d8c1827b2ec909a80cfddb7940b01a733 + md5: 27cd8ec0c95ba9405f912037b3b8b99c + depends: + - python >=3.6 + - python-dateutil + - pytz + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/icalendar?source=hash-mapping + size: 87114 + timestamp: 1711279495579 +- conda: https://conda.anaconda.org/conda-forge/noarch/icalendar-5.0.13-pyhd8ed1ab_0.conda + sha256: 59cad3090170c9bbd99122331ec6e7de867f7bb824bd4a6d1a162b838fefc821 + md5: 6803a801b7a65415231486554c7a98c3 + depends: + - python >=3.6 + - python-dateutil + - pytz + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/icalendar?source=hash-mapping + size: 89169 + timestamp: 1718965757008 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-75.1-he0c23c2_0.conda + sha256: 1d04369a1860a1e9e371b9fc82dd0092b616adcf057d6c88371856669280e920 + md5: 8579b6bb8d18be7c0b27fb08adeeeb40 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 14544252 + timestamp: 1720853966338 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda + sha256: dc98ab2233d3ed3692499e2a06b027489ee317658cef9277ec23cab00236f31c + md5: ba68cb5105760379432cebc82b45af40 + depends: + - python >=3.6 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=hash-mapping + size: 78375 + timestamp: 1713673091737 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda + sha256: b7fc614777da38244ff36da51f9417822d6507a7b6a8da27aba579490941d160 + md5: 34a8172d191193030438d7b30bcdeaf5 + depends: + - python >=3.10 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=compressed-mapping + size: 79065 + timestamp: 1757209085517 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda + sha256: 27c1c5c1f3090ce826a08d50e70c53c77a8b6b39561b2967388f014fa2d52297 + md5: 1027da8216437467b4588fa79e143d89 + depends: + - python >=3.9 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=hash-mapping + size: 78597 + timestamp: 1739058677860 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b + md5: c0cc1420498b17414d8617d0b9f506ca + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=hash-mapping + size: 52718 + timestamp: 1713279497047 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=hash-mapping + size: 11474 + timestamp: 1733223232820 +- conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda + sha256: 7b029e476ad6d401d645636ee3e4b40130bfcc9534f7415209dd5b666c6dd292 + md5: c66eb2fd33b999ccc258aef85689758e + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 1617555 + timestamp: 1712943333029 +- conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda + sha256: 0fd2b0b84c854029041b0ede8f4c2369242ee92acc0092f8407b1fe9238a8209 + md5: 2d89243bfb53652c182a7c73182cce4f + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 1852356 + timestamp: 1723739573141 +- conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_0.tar.bz2 + sha256: b95ba946aa80024b9b169f02d3afac52055f74552b4f4e96070a1077ffd695de + md5: 1b840d043530b7b85a72ba5083d5b179 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iso3166?source=hash-mapping + size: 13991 + timestamp: 1657623202820 +- conda: https://conda.anaconda.org/conda-forge/noarch/iso3166-2.1.1-pyhd8ed1ab_1.conda + sha256: 8d023f5b7b6ba97599ac86337920001d47e8df92d9ea62d51e6d4de05a8d6d14 + md5: e47384c2f2d8b31d773efb3074b83c94 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iso3166?source=hash-mapping + size: 15262 + timestamp: 1734878600719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda + sha256: 5ed96807b26bc32d2d180e38e7340388ddfdb642950f888f7da78d274846afea + md5: 61b0bd5219ce7192b4e3633521a78975 + constrains: + - binutils_impl_linux-64 2.40 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 708179 + timestamp: 1717523002366 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 669211 + timestamp: 1729655358674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda + sha256: 1a620f27d79217c1295049ba214c2f80372062fd251b569e9873d4a953d27554 + md5: 0be7c6e070c19105f966d3758448d018 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.44 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 676044 + timestamp: 1752032747103 +- conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.25.1-py311hb755f60_1.conda + sha256: 9d22ec034bbdde122bf4a7bb9aeea5dba18894d6f3112d1d87f0c89478ff0af8 + md5: e1e59b60c36dbc0baefee1e322efc717 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 145524 + timestamp: 1712506283369 +- conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.26.1-py311hfdbb021_0.conda + sha256: 41ee5adbdf51380511022cb16c6ac05b4d27618c14555c5c8092eed139b63b80 + md5: a7ccbc67ceadd2667d37e3294699742c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 135799 + timestamp: 1730117328799 +- conda: https://conda.anaconda.org/conda-forge/linux-64/levenshtein-0.27.1-py311h1ddb823_1.conda + sha256: 524078d4869945b2885bc147b8040735c43deb6b0c6861dccc975cb69923c617 + md5: f56642777735387dd32738e33ca1577b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 148452 + timestamp: 1756575196021 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/levenshtein-0.26.1-py311h6885ffc_0.conda + sha256: ed114ef77d01ebf3e139d925f1c7898acd1011c26a09b21e1e48c52d36f362b0 + md5: 547341036da54ea3cb03e0324f0db12f + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 100768 + timestamp: 1730117487450 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/levenshtein-0.27.1-py311hf719da1_1.conda + sha256: 133b529dc17645de598d190819ae8821ff1065657c4cdf5ecb08d9371f921ebe + md5: 37e1551879e8df1a76edf721de11b7ca + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 96273 + timestamp: 1756575409752 +- conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.25.1-py311h12c1d0e_1.conda + sha256: e26c8b3e0716996a58f589083409ab1904cffc80ef7acb9f28be99f1777a1f11 + md5: dbe96204605bd435af07e1858f7cdd8f + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 98780 + timestamp: 1712506643449 +- conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.26.1-py311hda3d55a_0.conda + sha256: ba3173827ba76010c6fa4af4db51aa6f6d870c2cab08dc4f8309269c6357bc9b + md5: 21d1f6cf1a53bea3c0aafad6dc78c5db + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 96123 + timestamp: 1730117628168 +- conda: https://conda.anaconda.org/conda-forge/win-64/levenshtein-0.27.1-py311h3e6a449_1.conda + sha256: 62e764d743655a3384d0a5d372d96ff1a9c75be914a99b2450ae5d5f6c674ac5 + md5: d529d27520c569b20f87515b32c219d5 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - rapidfuzz >=3.8.0,<4.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/levenshtein?source=hash-mapping + size: 100936 + timestamp: 1756575401283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda + build_number: 22 + sha256: 082b8ac20d43a7bbcdc28b3b1cd40e4df3a8b5daf0a2d23d68953a44d2d12c1b + md5: 1a2a0cd3153464fee6646f3dd6dad9b8 + depends: + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 + constrains: + - libcblas 3.9.0 22_linux64_openblas + - blas * openblas + - liblapacke 3.9.0 22_linux64_openblas + - liblapack 3.9.0 22_linux64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14537 + timestamp: 1712542250081 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda + build_number: 28 + sha256: 93fbcf2800b859b7ca5add3ab5d3aa11c6a6ff4b942a1cea4bf644f78488edb8 + md5: 73e2a99fdeb8531d50168987378fda8a + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - libcblas =3.9.0=28*_openblas + - blas =2.128=openblas + - liblapack =3.9.0=28*_openblas + - liblapacke =3.9.0=28*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16621 + timestamp: 1738114033763 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda + build_number: 35 + sha256: 6cae2184069dd6527a405bc4a3de1290729f6f1c7a475fa4c937a6c02e05f058 + md5: 6da7e852c812a84096b68158574398d0 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - blas 2.135 openblas + - liblapacke 3.9.0 35*_openblas + - mkl <2025 + - liblapack 3.9.0 35*_openblas + - libcblas 3.9.0 35*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17153 + timestamp: 1757446766752 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-29_h10e41b3_openblas.conda + build_number: 29 + sha256: a966b39403203dfe122e2eefe9f3a04b353dc7c2fa76703f0d78fddc4e849704 + md5: 6ebbed2244408eca4f7569b532f813bd + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - liblapacke =3.9.0=29*_openblas + - libcblas =3.9.0=29*_openblas + - blas =2.129=openblas + - liblapack =3.9.0=29*_openblas + license: BSD-3-Clause + purls: [] + size: 17046 + timestamp: 1739426231872 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-35_h51639a9_openblas.conda + build_number: 35 + sha256: 9eb9a0ba654824c10ae1246124a0ecaea9d6f8abd98d43ddfc5e36931191843d + md5: f6ff3c5ed6d55bdede368a8670c3ff99 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapack 3.9.0 35*_openblas + - liblapacke 3.9.0 35*_openblas + - mkl <2025 + - blas 2.135 openblas + - libcblas 3.9.0 35*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17354 + timestamp: 1757447500683 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda + build_number: 22 + sha256: 4faab445cbd9a13736a206b98fde962d0a9fa80dcbd38300951a8b2863e7c35c + md5: 65c56ecdeceffd6c32d3d54db7e02c6e + depends: + - mkl 2024.1.0 h66d3029_692 + constrains: + - liblapacke 3.9.0 22_win64_mkl + - blas * mkl + - libcblas 3.9.0 22_win64_mkl + - liblapack 3.9.0 22_win64_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5182602 + timestamp: 1712542984136 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-29_h576b46c_mkl.conda + build_number: 29 + sha256: 4027b6317b6f3d4b6f1b12600d8ca78057a3d2be2144bbc8aaeb3b0ad11b9bbd + md5: 2d25c162673da78c4329b963452bb0e1 + depends: + - mkl 2024.2.2 h66d3029_15 + constrains: + - liblapack =3.9.0=29*_mkl + - liblapacke =3.9.0=29*_mkl + - libcblas =3.9.0=29*_mkl + - blas =2.129=mkl + license: BSD-3-Clause + purls: [] + size: 3733634 + timestamp: 1739426273305 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-35_h5709861_mkl.conda + build_number: 35 + sha256: 4180e7ab27ed03ddf01d7e599002fcba1b32dcb68214ee25da823bac371ed362 + md5: 45d98af023f8b4a7640b1f713ce6b602 + depends: + - mkl >=2024.2.2,<2025.0a0 + constrains: + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - libcblas 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 66044 + timestamp: 1757003486248 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda + build_number: 22 + sha256: da1b2faa017663c8f5555c1c5518e96ac4cd8e0be2a673c1c9e2cb8507c8fe46 + md5: 4b31699e0ec5de64d5896e580389c9a1 + depends: + - libblas 3.9.0 22_linux64_openblas + constrains: + - liblapack 3.9.0 22_linux64_openblas + - blas * openblas + - liblapacke 3.9.0 22_linux64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14438 + timestamp: 1712542270166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda + build_number: 28 + sha256: de293e117db53e5d78b579136509c35a5e4ad11529c05f9af83cf89be4d30de1 + md5: 4e20a1c00b4e8a984aac0f6cce59e3ac + depends: + - libblas 3.9.0 28_h59b9bed_openblas + constrains: + - blas =2.128=openblas + - liblapack =3.9.0=28*_openblas + - liblapacke =3.9.0=28*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16539 + timestamp: 1738114043618 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda + build_number: 35 + sha256: fb77db75b0bd50856a1d53edcfd70c3314cde7e7c7d87479ee9d6b7fdbe824f1 + md5: 8aa3389d36791ecd31602a247b1f3641 + depends: + - libblas 3.9.0 35_h4a7cf45_openblas + constrains: + - liblapacke 3.9.0 35*_openblas + - blas 2.135 openblas + - liblapack 3.9.0 35*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17149 + timestamp: 1757446780072 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-29_hb3479ef_openblas.conda + build_number: 29 + sha256: 5fb812ca6b194a0d4ea6c780fba9afab87f7da7b8c4558cfe2954e27bb07a4a9 + md5: cc30b97c4a6bc1984781bf147daa015b + depends: + - libblas 3.9.0 29_h10e41b3_openblas + constrains: + - liblapack =3.9.0=29*_openblas + - blas =2.129=openblas + - liblapacke =3.9.0=29*_openblas + license: BSD-3-Clause + purls: [] + size: 16983 + timestamp: 1739426238799 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-35_hb0561ab_openblas.conda + build_number: 35 + sha256: 0697193d58b13ee71a2f43fb44654b3c07a07bbac8843bc5de3fa2996a49bd34 + md5: 917dc7f4359ede7649d52a6d07a39902 + depends: + - libblas 3.9.0 35_h51639a9_openblas + constrains: + - liblapack 3.9.0 35*_openblas + - liblapacke 3.9.0 35*_openblas + - blas 2.135 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17338 + timestamp: 1757447513089 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda + build_number: 22 + sha256: 5503273924650330dc03edd1eb01ec4020b9967b5a4cafc377ba20b976d15590 + md5: 336c93ab102846c6131cf68e722a68f1 + depends: + - libblas 3.9.0 22_win64_mkl + constrains: + - liblapacke 3.9.0 22_win64_mkl + - blas * mkl + - liblapack 3.9.0 22_win64_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5191513 + timestamp: 1712543043641 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-29_h7ad3364_mkl.conda + build_number: 29 + sha256: 983caad08c23475de33810d924a6818354dea2ece2c1a65ccc32e94ed5d29d14 + md5: 3d674200e7a1ee1561894501f81f821f + depends: + - libblas 3.9.0 29_h576b46c_mkl + - mkl >=2024.2.2,<2025.0a0 + constrains: + - liblapacke =3.9.0=29*_mkl + - liblapack =3.9.0=29*_mkl + - blas =2.129=mkl + license: BSD-3-Clause + purls: [] + size: 3735136 + timestamp: 1739426312628 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-35_h2a3cdd5_mkl.conda + build_number: 35 + sha256: 88939f6c1b5da75bd26ce663aa437e1224b26ee0dab5e60cecc77600975f397e + md5: 9639091d266e92438582d0cc4cfc8350 + depends: + - libblas 3.9.0 35_h5709861_mkl + constrains: + - blas 2.135 mkl + - liblapack 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 66398 + timestamp: 1757003514529 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.1-hf598326_0.conda + sha256: 6af03355967b7b097d5820dde05e0c709945fdb01f4bc56d11499d8bf7435239 + md5: d5790f3769fedeea4e021483272bdc53 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 568291 + timestamp: 1757525671408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 74811 + timestamp: 1752719572741 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 65971 + timestamp: 1752719657566 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda + sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845 + md5: 3608ffde260281fa641e70d6e34b1b96 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + purls: [] + size: 141322 + timestamp: 1752719767870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 53415 + timestamp: 1739260413716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 57433 + timestamp: 1743434498161 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 39839 + timestamp: 1743434670405 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_0.conda + sha256: 77922d8dd2faf88ac6accaeebf06409d1820486fde710cff6b554d12273e46be + md5: 31d5107f75b2f204937728417e2e39e5 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 40830 + timestamp: 1739260917585 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 44978 + timestamp: 1743435053850 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 848745 + timestamp: 1729027721139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda + sha256: 144e35c1c2840f2dc202f6915fc41879c19eddbb8fa524e3ca4aa0d14018b26f + md5: f406dcbb2e7bef90d793e50e79a2882b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_4 + - libgomp 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 824153 + timestamp: 1753903866511 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 264fbfba7fb20acf3b29cde153e345ce + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.1.0 h767d61c_5 + - libgcc-ng ==15.1.0=*_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 824191 + timestamp: 1757042543820 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54142 + timestamp: 1729027726517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda + sha256: 76ceac93ed98f208363d6e9c75011b0ff7b97b20f003f06461a619557e726637 + md5: 28771437ffcd9f3417c66012dc49a3be + depends: + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29249 + timestamp: 1753903872571 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: 069afdf8ea72504e48d23ae1171d951c + depends: + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29187 + timestamp: 1757042549554 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 + md5: f1fd30127802683586f768875127a987 + depends: + - libgfortran5 14.2.0 hd5240d6_1 + constrains: + - libgfortran-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53997 + timestamp: 1729027752995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda + sha256: 4c1a526198d0d62441549fdfd668cc8e18e77609da1e545bdcc771dd8dc6a990 + md5: 0c91408b3dec0b97e8a3c694845bd63b + depends: + - libgfortran5 15.1.0 hcea5267_5 + constrains: + - libgfortran-ng ==15.1.0=*_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29169 + timestamp: 1757042575979 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.1.0-hfdf1602_1.conda + sha256: 981e3fac416e80b007a2798d6c1d4357ebebeb72a039aca1fb3a7effe9dcae86 + md5: c98207b6e2b1a309abab696d229f163e + depends: + - libgfortran5 15.1.0 hb74de2c_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 134383 + timestamp: 1756239485494 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda + sha256: a588e69f96b8e0983a8cdfdbf1dc75eb48189f5420ec71150c8d8cdc0a811a9b + md5: 1b84f26d9f4f6026e179e7805d5a15cd + depends: + - libgfortran5 13.2.0 hca663fb_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 24314 + timestamp: 1715016272844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda + sha256: 754ab038115edce550fdccdc9ddf7dead2fa8346b8cdd4428c59ae1e83293978 + md5: c0bd771f09a326fdcd95a60b617795bf + depends: + - libgcc-ng >=13.2.0 + constrains: + - libgfortran-ng 13.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1441361 + timestamp: 1715016068766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + sha256: d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d + md5: 9822b874ea29af082e5d36098d25427d + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1462645 + timestamp: 1729027735353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda + sha256: 9d06adc6d8e8187ddc1cad87525c690bc8202d8cb06c13b76ab2fc80a35ed565 + md5: fbd4008644add05032b6764807ee2cba + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.1.0 + constrains: + - libgfortran 15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1564589 + timestamp: 1757042559498 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.1.0-hb74de2c_1.conda + sha256: 1f8f5b2fdd0d2559d0f3bade8da8f57e9ee9b54685bd6081c6d6d9a2b0239b41 + md5: 4281bd1c654cb4f5cab6392b3330451f + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 759679 + timestamp: 1756238772083 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 460992 + timestamp: 1729027639220 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda + sha256: e0487a8fec78802ac04da0ac1139c3510992bc58a58cde66619dde3b363c2933 + md5: 3baf8976c96134738bba224e9ef6b1e5 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 447289 + timestamp: 1753903801049 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + sha256: 125051d51a8c04694d0830f6343af78b556dd88cc249dfec5a97703ebfb1832d + md5: dcd5ff1940cd38f6df777cac86819d60 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 447215 + timestamp: 1757042483384 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda + sha256: e0d75da50e67a81e3cb37e2ee3b0d6ddc6543ec0f7b3828f884558552a1c4d93 + md5: ee944f0d41d9e2048f9d7492c1623ca3 + depends: + - libxml2 >=2.12.6,<3.0a0 + - pthreads-win32 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2376728 + timestamp: 1711491473761 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.11.2-default_ha69328c_1001.conda + sha256: 850e255997f538d5fb6ed651321141155a33bb781d43d326fc4ff62114dd2842 + md5: b87a0ac5ab6495d8225db5dc72dd21cd + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 >=2.13.4,<3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2390021 + timestamp: 1731375651179 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + sha256: 266dfe151066c34695dbdc824ba1246b99f016115ef79339cbcf005ac50527c1 + md5: b0cac6e5b06ca5eeb14b4f7cf908619f + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + purls: [] + size: 2414731 + timestamp: 1757624335056 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda + sha256: 5f844dd19b046d43174ad80c6ea75b5d504020e3b63cfbc4ace97b8730d35c7b + md5: e1eb10b1cca179f2baa3601e4efc8712 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-only + purls: [] + size: 636146 + timestamp: 1702682547199 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + purls: [] + size: 696926 + timestamp: 1754909290005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda + build_number: 22 + sha256: db246341d42f9100d45adeb1a7ba8b1ef5b51ceb9056fd643e98046a3259fde6 + md5: b083767b6c877e24ee597d93b87ab838 + depends: + - libblas 3.9.0 22_linux64_openblas + constrains: + - libcblas 3.9.0 22_linux64_openblas + - blas * openblas + - liblapacke 3.9.0 22_linux64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 14471 + timestamp: 1712542277696 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda + build_number: 28 + sha256: 9530e6840690b78360946390a1d29624734a6b624f02c26631fb451592cbb8ef + md5: 069f40bfbf1dc55c83ddb07fc6a6ef8d + depends: + - libblas 3.9.0 28_h59b9bed_openblas + constrains: + - libcblas =3.9.0=28*_openblas + - blas =2.128=openblas + - liblapacke =3.9.0=28*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16553 + timestamp: 1738114053556 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda + build_number: 35 + sha256: 5aceb67704af9185084ccdc8d841845df498a9af52783b858ceacd3e5b9e7dd8 + md5: aa0b36b71d44f74686f13b9bfabec891 + depends: + - libblas 3.9.0 35_h4a7cf45_openblas + constrains: + - liblapacke 3.9.0 35*_openblas + - blas 2.135 openblas + - libcblas 3.9.0 35*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17180 + timestamp: 1757446792311 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-29_hc9a63f6_openblas.conda + build_number: 29 + sha256: de23734b43bd3d788d87db223605961129df3f464f0fafabfb3bd9265766472f + md5: 523116f84153f74aa9541278faff40d8 + depends: + - libblas 3.9.0 29_h10e41b3_openblas + constrains: + - libcblas =3.9.0=29*_openblas + - blas =2.129=openblas + - liblapacke =3.9.0=29*_openblas + license: BSD-3-Clause + purls: [] + size: 16988 + timestamp: 1739426245773 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-35_hd9741b5_openblas.conda + build_number: 35 + sha256: dc7127de1aafcf77efc1b44b854bd648ba59113cd1f364e38b2fa868763913d0 + md5: 270789394f52de7ae5e5328dfe7e26c1 + depends: + - libblas 3.9.0 35_h51639a9_openblas + constrains: + - liblapacke 3.9.0 35*_openblas + - libcblas 3.9.0 35*_openblas + - blas 2.135 openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17374 + timestamp: 1757447527491 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda + build_number: 22 + sha256: 8b28b361a13819ed83a67d3bfdde750a13bc8b50b9af26d94fd61616d0f2d703 + md5: c752cc2af9f3d8d7b2fdebb915a33ef7 + depends: + - libblas 3.9.0 22_win64_mkl + constrains: + - liblapacke 3.9.0 22_win64_mkl + - blas * mkl + - libcblas 3.9.0 22_win64_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5182500 + timestamp: 1712543085027 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-29_hacfb0e4_mkl.conda + build_number: 29 + sha256: 0debb626a58560e99a5c20ec01109240c1ae97a1acc57217a82ad3649837c155 + md5: a362f444c68f33b2a4f62ef743ce12c4 + depends: + - libblas 3.9.0 29_h576b46c_mkl + - mkl >=2024.2.2,<2025.0a0 + constrains: + - liblapacke =3.9.0=29*_mkl + - libcblas =3.9.0=29*_mkl + - blas =2.129=mkl + license: BSD-3-Clause + purls: [] + size: 3735157 + timestamp: 1739426350747 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-35_hf9ab0e9_mkl.conda + build_number: 35 + sha256: 56e0992fb58eed8f0d5fa165b8621fa150b84aa9af1467ea0a7a9bb7e2fced4f + md5: 0c6ed9d722cecda18f50f17fb3c30002 + depends: + - libblas 3.9.0 35_h5709861_mkl + constrains: + - blas 2.135 mkl + - libcblas 3.9.0 35*_mkl + - liblapacke 3.9.0 35*_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 78485 + timestamp: 1757003541803 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + purls: [] + size: 104935 + timestamp: 1749230611612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda + sha256: 2ae7559aed0705deb3f716c7b247c74fd1b5e35b64e39834ce8b95f7564d4a3e + md5: a356024784da6dfd4683dc5ecf45b155 + depends: + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + constrains: + - openblas >=0.3.27,<0.3.28.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5598747 + timestamp: 1712364444346 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe + md5: 62857b389e42b36b686331bec0922050 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5578513 + timestamp: 1730772671118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda + sha256: 1b51d1f96e751dc945cc06f79caa91833b0c3326efe24e9b506bd64ef49fc9b0 + md5: dfc5aae7b043d9f56ba99514d5e60625 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5938936 + timestamp: 1755474342204 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + sha256: 62bb669c37a845129096f73d446cdb6bb170e4927f2fea2b661329680dbbc373 + md5: 40803a48d947c8639da6704e9a44d3ce + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4165774 + timestamp: 1730772154295 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_h60d53f8_2.conda + sha256: 7b8551a4d21cf0b19f9a162f1f283a201b17f1bd5a6579abbd0d004788c511fa + md5: d004259fd8d3d2798b16299d6ad6c9e9 + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4284696 + timestamp: 1755471861128 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 932581 + timestamp: 1753948484112 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda + sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 + md5: 1dcb0468f5146e38fae99aef9656034b + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + purls: [] + size: 902645 + timestamp: 1753948599139 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda + sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa + md5: ccb20d946040f86f0c05b644d5eadeca + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + purls: [] + size: 1288499 + timestamp: 1753948889360 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 + md5: 234a5554c53625688d51062645337328 + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3893695 + timestamp: 1729027746910 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda + sha256: b5b239e5fca53ff90669af1686c86282c970dd8204ebf477cf679872eb6d48ac + md5: 3c376af8888c386b9d3d1c2701e2f3ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3903453 + timestamp: 1753903894186 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 4e02a49aaa9d5190cb630fa43528fbe6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3896432 + timestamp: 1757042571458 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + sha256: 35f1e08be0a84810c9075f5bd008495ac94e6c5fe306dfe4b34546f11fed850f + md5: 53ebd4c833fa01cb2c6353e99f905406 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3837704 + timestamp: 1715016117360 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 + md5: 8371ac6457591af2cf6159439c1fd051 + depends: + - libstdcxx 14.2.0 hc0a3c3a_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54105 + timestamp: 1729027780628 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 8bba50c7f4679f08c861b597ad2bda6b + depends: + - libstdcxx 15.1.0 h8f9b012_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 29233 + timestamp: 1757042603319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda + sha256: 776e28735cee84b97e4d05dd5d67b95221a3e2c09b8b13e3d6dbe6494337d527 + md5: af930c65e9a79a3423d6d36e265cef65 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 37087 + timestamp: 1757334557450 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.50.0-hb9d3cd8_0.conda + sha256: b4a8890023902aef9f1f33e3e35603ad9c2f16c21fdb58e968fa6c1bd3e94c0b + md5: 771ee65e13bc599b0b62af5359d80169 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 891272 + timestamp: 1737016632446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b + md5: 0f03292cc56bf91a077a134ea8747118 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 895108 + timestamp: 1753948278280 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda + sha256: d13fb49d4c8262bf2c44ffb2c77bb2b5d0f85fc6de76bdb75208efeccb29fce6 + md5: 20717343fb30798ab7c23c2e92b748c1 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 418890 + timestamp: 1737016751326 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + sha256: 042c7488ad97a5629ec0a991a8b2a3345599401ecc75ad6a5af73b60e6db9689 + md5: c0d87c3c8e075daf1daf6c31b53e8083 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 421195 + timestamp: 1753948426421 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + sha256: 373f2973b8a358528b22be5e8d84322c165b4c5577d24d94fd67ad1bb0a0f261 + md5: 08bfa5da6e242025304b206d152479ef + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + purls: [] + size: 35794 + timestamp: 1737099561703 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.5-he286e8c_1.conda + sha256: 084dd4dde342f13c43ee418d153ac5b2610f95be029073a15fa9dda22b130d06 + md5: 77eaa84f90fc90643c5a0be0aa9bdd1b + depends: + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: [] + size: 1612294 + timestamp: 1733443909984 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.0-ha29bfb0_0.conda + sha256: c3c2c74bd917d83b26c102b18bde97759c23f24e0260beb962acf7385627fc38 + md5: 5262552eb2f0d0b443adcfa265d97f0a + depends: + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.0 h06f855e_0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 42985 + timestamp: 1757953736703 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.0-h06f855e_0.conda + sha256: 15337581264464842ff28f616422b786161bee0169610ff292e0ea75fa78dba8 + md5: a1071825a90769083fce8dbcefcccd65 + depends: + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libxml2 2.15.0 + license: MIT + license_family: MIT + purls: [] + size: 512772 + timestamp: 1757953703099 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d + md5: 57d7dc60e9325e3de37ff8dffd18e814 + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.3.1 *_1 + license: Zlib + license_family: Other + purls: [] + size: 61574 + timestamp: 1716874187109 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 55476 + timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.0-hbb9b287_0.conda + sha256: c6750073a128376a14bedacfa90caab4c17025c9687fcf6f96e863b28d543af4 + md5: e57d95fec6eaa747e583323cba6cfe5c + depends: + - __osx >=11.0 + constrains: + - intel-openmp <0.0a0 + - openmp 21.1.0|21.1.0.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 286039 + timestamp: 1756673290280 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-20.1.8-hfa2b4ca_2.conda + sha256: 8970b7f9057a1c2c18bfd743c6f5ce73b86197d7724423de4fa3d03911d5874b + md5: 2dc2edf349464c8b83a576175fc2ad42 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - intel-openmp <0.0a0 + - openmp 20.1.8|20.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 344490 + timestamp: 1756145011384 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda + sha256: abfdb5eb3a17af59a827ea49fcb4d2bf18e70b62498bf3720351962e636cb5b7 + md5: b43ec7ed045323edeff31e348eea8652 + depends: + - intel-openmp 2024.* + - tbb 2021.* + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + purls: [] + size: 109491063 + timestamp: 1712153746272 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h57928b3_16.conda + sha256: ce841e7c3898764154a9293c0f92283c1eb28cdacf7a164c94b632a6af675d91 + md5: 5cddc979c74b90cf5e5cda4f97d5d8bb + depends: + - llvm-openmp >=20.1.8 + - tbb 2021.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 103088799 + timestamp: 1753975600547 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda + sha256: 20e52b0389586d0b914a49cd286c5ccc9c47949bed60ca6df004d1d295f2edbd + md5: 302dff2807f2927b3e9e0d19d60121de + depends: + - intel-openmp 2024.* + - tbb 2021.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 103106385 + timestamp: 1730232843711 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + purls: [] + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 + md5: fcea371545eda051b6deafb24889fc69 + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 887465 + timestamp: 1715194722503 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + sha256: 1320306234552717149f36f825ddc7e27ea295f24829e9db4cc6ceaff0b032bd + md5: 2a75b296096adabbabadd5e9782e5fcc + depends: + - python 2.7|>=3.7 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + size: 34358 + timestamp: 1683893151613 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda + sha256: 85ee07342ab055dc081f3de8292c5e7195e43e046db9c5750f242f928f6bb8f2 + md5: dfe0528d0f1c16c1f7c528ea5536ab30 + depends: + - python 2.7|>=3.7 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + size: 34489 + timestamp: 1717585382642 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + sha256: 3636eec0e60466a00069b47ce94b6d88b01419b6577d8e393da44bb5bc8d3468 + md5: 7ba3f09fceae6a120d664217e58fe686 + depends: + - python >=3.9 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + size: 34574 + timestamp: 1734112236147 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.6.0-hc19f0b3_1.conda + sha256: a9f637e3ddb845350a1410caf2299caa2dddd201fd44a5ca0e075c17dbf99f91 + md5: 427b3cd460567009e317d10bc5390764 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.1,<4.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 21337290 + timestamp: 1723482049816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-24.4.1-heeeca48_0.conda + sha256: 1239ba36ea69eefcc55f107fe186810b59488923544667175f6976fa4903c8c9 + md5: d629b201c3fbc0c203ca0ad7b03f22ce + depends: + - libgcc >=14 + - __glibc >=2.28,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - libuv >=1.51.0,<2.0a0 + - icu >=75.1,<76.0a0 + - openssl >=3.5.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 25669735 + timestamp: 1752839464718 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.13.0-h02a13b7_0.conda + sha256: d390651526630468e385a74474bb3f17849861182257c161bbca8fca7734d578 + md5: 93cd91b998422ebf2dace6c13c1842ce + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libcxx >=18 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 15490642 + timestamp: 1737401388520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-24.4.1-hab9d20b_0.conda + sha256: c79d2c81f80a9adedc77362f2e8b10879ed0f9806deb6ba2464c1287a05f0b9b + md5: 463a537de602f8558604f27395b323d0 + depends: + - libcxx >=19 + - __osx >=11.0 + - openssl >=3.5.1,<4.0a0 + - libuv >=1.51.0,<2.0a0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 17949155 + timestamp: 1752839389217 +- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.13.0-hfeaa22a_0.conda + sha256: 2e72f510715960a0579a2a5452104d20044e8ba74742b87899e24c11cb72d578 + md5: bd7dde69cfd032aec6ba645297315aff + license: MIT + license_family: MIT + purls: [] + size: 26232097 + timestamp: 1737384238153 +- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-24.4.1-he453025_0.conda + sha256: 1bb0d9e370bb0ffa2071ccfdd0ef3cb90bd183b07c67b646d1aa5c743004d233 + md5: cde0d5793a73ab343b5764fa6c002771 + license: MIT + license_family: MIT + purls: [] + size: 29967122 + timestamp: 1752839409586 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.conda + sha256: 264528d6e73d5c902a0463d9d138607018d994b86e209df4a51945886233989d + md5: 3b0d0a2241770397d3146fdcab3b49f8 + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.11.* *_cp311 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + purls: + - pkg:pypi/numpy?source=compressed-mapping + size: 9416009 + timestamp: 1757505084571 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.3-py311h8685306_0.conda + sha256: f9e65b819f7252557113240e83a7f33426a2086cdcd0f80f4ef95794b5bafc0f + md5: 679c1e8963299dddcaf216588f765350 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - python 3.11.* *_cpython + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.11.* *_cp311 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + purls: + - pkg:pypi/numpy?source=compressed-mapping + size: 7275121 + timestamp: 1757504970437 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.3-py311h80b3fa1_0.conda + sha256: 0d74435730664aba7e5a9a3c1c5e4a835bc0f092a75e9c722180501eb5216e11 + md5: 8ffebb7dbab9234203223cc89838fb8c + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.11.* *_cp311 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 8016801 + timestamp: 1757504919213 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda + sha256: c9f54d4e8212f313be7b02eb962d0cb13a8dae015683a403d3accd4add3e520e + md5: ffffb341206dd0dab0c36053c048d621 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3128847 + timestamp: 1754465526100 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda + sha256: f6d1c87dbcf7b39fad24347570166dade1c533ae2d53c60a70fa4dc874ef0056 + md5: bcb0d87dfbc199d0a461d2c7ca30b3d8 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 3074848 + timestamp: 1754465710470 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.2-h725018a_0.conda + sha256: 2413f3b4606018aea23acfa2af3c4c46af786739ab4020422e9f0c2aec75321b + md5: 150d3920b420a27c0848acca158f94dc + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 9275175 + timestamp: 1754467904482 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + md5: 58335b26c38bf4a20f399384c33cbcf9 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 62477 + timestamp: 1745345660407 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py311h7db5c69_3.conda + sha256: 98cd49bfc4b803d950f9dbc4799793903aec1eaacd388c244a0b46d644159831 + md5: c9f8fe78840d5c04e61666474bd739b2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.11,<3.12.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.11.* *_cp311 + - pytz >=2020.1 + constrains: + - odfpy >=1.4.1 + - numba >=0.56.4 + - qtpy >=2.3.0 + - pyarrow >=10.0.1 + - matplotlib >=3.6.3 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - lxml >=4.9.2 + - bottleneck >=1.3.6 + - tabulate >=0.9.0 + - s3fs >=2022.11.0 + - zstandard >=0.19.0 + - sqlalchemy >=2.0.0 + - xlrd >=2.0.1 + - fastparquet >=2022.12.0 + - numexpr >=2.8.4 + - pyqt5 >=5.15.9 + - pytables >=3.8.0 + - pyreadstat >=1.2.0 + - fsspec >=2022.11.0 + - html5lib >=1.1 + - xarray >=2022.12.0 + - blosc >=1.21.3 + - openpyxl >=3.1.0 + - pandas-gbq >=0.19.0 + - tzdata >=2022.7 + - pyxlsb >=1.0.10 + - psycopg2 >=2.9.6 + - scipy >=1.10.0 + - python-calamine >=0.1.7 + - xlsxwriter >=3.0.5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15689443 + timestamp: 1744430942431 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py311hca32420_3.conda + sha256: 2fedf5cec20945d5ce1a5264f06a8adf23bc6b355cef365e92241a3f1f6a6d11 + md5: 29ae2c4e0ee3c65fa8520cafbf479ff7 + depends: + - __osx >=11.0 + - libcxx >=18 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.11.* *_cp311 + - pytz >=2020.1 + constrains: + - python-calamine >=0.1.7 + - pytables >=3.8.0 + - s3fs >=2022.11.0 + - openpyxl >=3.1.0 + - pyarrow >=10.0.1 + - tzdata >=2022.7 + - xarray >=2022.12.0 + - fastparquet >=2022.12.0 + - pyqt5 >=5.15.9 + - numba >=0.56.4 + - pyxlsb >=1.0.10 + - xlrd >=2.0.1 + - bottleneck >=1.3.6 + - matplotlib >=3.6.3 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - odfpy >=1.4.1 + - qtpy >=2.3.0 + - numexpr >=2.8.4 + - gcsfs >=2022.11.0 + - tabulate >=0.9.0 + - pyreadstat >=1.2.0 + - pandas-gbq >=0.19.0 + - blosc >=1.21.3 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - lxml >=4.9.2 + - html5lib >=1.1 + - fsspec >=2022.11.0 + - psycopg2 >=2.9.6 + - sqlalchemy >=2.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14820281 + timestamp: 1744430962289 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.3-py311hcf9f919_3.conda + sha256: 7aabb8d23a6817844a7f1b402e7e147e341cade5f470a908b8239f969c7b681c + md5: 84c8b4aab176baefd352cd34f7e69469 + depends: + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.11,<3.12.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.11.* *_cp311 + - pytz >=2020.1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - lxml >=4.9.2 + - pandas-gbq >=0.19.0 + - psycopg2 >=2.9.6 + - pyxlsb >=1.0.10 + - python-calamine >=0.1.7 + - html5lib >=1.1 + - sqlalchemy >=2.0.0 + - fastparquet >=2022.12.0 + - xarray >=2022.12.0 + - matplotlib >=3.6.3 + - numexpr >=2.8.4 + - pyqt5 >=5.15.9 + - openpyxl >=3.1.0 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - tabulate >=0.9.0 + - numba >=0.56.4 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - s3fs >=2022.11.0 + - gcsfs >=2022.11.0 + - qtpy >=2.3.0 + - odfpy >=1.4.1 + - pyreadstat >=1.2.0 + - xlrd >=2.0.1 + - pyarrow >=10.0.1 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - fsspec >=2022.11.0 + - pytables >=3.8.0 + - xlsxwriter >=3.0.5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 14530915 + timestamp: 1744431484551 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + sha256: 5718fef2954f016834058ae1d359e407ff8e2e847b35ab43d5d91bcf22d5578d + md5: d478a8a3044cdff1aa6e62f9269cefe0 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20248 + timestamp: 1713912912262 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda + sha256: adc59384cf0b2fc6dc7362840151e8cb076349197a38f7230278252698a88442 + md5: 6f6cf28bf8e021933869bae3f84b8fc9 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20572 + timestamp: 1715777739019 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda + sha256: dfe0fa6e351d2b0cef95ac1a1533d4f960d3992f9e0f82aeb5ec3623a699896b + md5: cc9d9a3929503785403dbfad9f707145 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=compressed-mapping + size: 23653 + timestamp: 1756227402815 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + sha256: a8eb555eef5063bbb7ba06a379fa7ea714f57d9741fe0efdb9442dbbc2cccbcc + md5: 7da7ccd349dbf6487a7778579d2bb971 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping + size: 24246 + timestamp: 1747339794916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda + sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 + md5: 846ba0877cda9c4f11e13720cacd1968 + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.9 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit?source=hash-mapping + size: 180574 + timestamp: 1711480432386 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda + sha256: 689c169ce6ed5d516d8524cc1e6ef2687dff19747c1ed1ee9b347a71f47ff12d + md5: 724bc4489c1174fc8e3233b0624fa51f + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.9 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit?source=hash-mapping + size: 179748 + timestamp: 1715432871404 +- conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 + sha256: 576a228630a72f25d255a5e345e5f10878e153221a96560f2498040cd6f54005 + md5: e2da8758d7d51ff6aa78a14dfb9dbed4 + depends: + - vc 14.* + license: LGPL 2 + purls: [] + size: 144301 + timestamp: 1537755684331 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser?source=hash-mapping + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 + md5: 844d9eb3b43095b031874477f7d70088 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser?source=hash-mapping + size: 105098 + timestamp: 1711811634025 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d + md5: c3946ed24acdb28db1b5d63321dbca7d + depends: + - typing-inspection >=0.4.2 + - typing_extensions >=4.14.1 + - python >=3.10 + - typing-extensions >=4.6.1 + - annotated-types >=0.6.0 + - pydantic-core ==2.41.5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic?source=hash-mapping + size: 340482 + timestamp: 1764434463101 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py311h902ca64_1.conda + sha256: da6e2060a91de065031214f9ca56e24906785ea412cd274d1f32128992dc0d43 + md5: 08d407f0331ff8e871db23bec7eef83c + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1938184 + timestamp: 1762988992467 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py311h71babbd_1.conda + sha256: 71076c9386d897f1eba2afe3b2968032c0808a726e2e86c19a8761605b7f9ca1 + md5: 1cde74932ed3f0472c89406f1b8df631 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - __osx >=11.0 + - python 3.11.* *_cpython + - python_abi 3.11.* *_cp311 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1786673 + timestamp: 1762989051883 +- conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py311hf51aa87_1.conda + sha256: bb8195087084a37d7cfca208aca6b519dc4917592dc867b8bbc6975a01b2d6e0 + md5: 6e9d7d8626b17cd232099a8dcd645b3c + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pydantic-core?source=hash-mapping + size: 1956970 + timestamp: 1762989037727 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + sha256: b3a612bc887f3dd0fb7c4199ad8e342bd148cf69a9b74fd9468a18cf2bef07b7 + md5: 56cd9fe388baac0e90c7149cfac95b60 + depends: + - __win + - python >=3.8 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 19348 + timestamp: 1661605138291 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca + md5: e2fd202833c4a981ce8a65974fe4abd1 + depends: + - __win + - python >=3.9 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21784 + timestamp: 1733217448189 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + md5: 2a7de29fb590ca14b5243c4c812c8025 + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 18981 + timestamp: 1661604969727 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.4-pyhd8ed1ab_0.conda + sha256: 8979721b7f86b183d21103f3ec2734783847d317c1b754f462f407efc7c60886 + md5: a9d145de8c5f064b5fa68fb34725d9f4 + depends: + - colorama + - exceptiongroup >=1.0.0rc8 + - iniconfig + - packaging + - pluggy >=0.12,<2.0 + - python >=3.7 + - tomli >=1.0.0 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 244564 + timestamp: 1704035308916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda + sha256: f07d3b44cabbed7843de654c4a6990a08475ce3b708bb735c7da9842614586f2 + md5: 06eb685a3a0b146347a58dda979485da + depends: + - coverage >=5.2.1 + - pytest >=4.6 + - python >=3.7 + - toml + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-cov?source=hash-mapping + size: 25436 + timestamp: 1684965001294 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda + sha256: 5455be7ec8d9f3d1d5d4c8962169f2aa4da97de4b61b4ded22f86081c59ba1e2 + md5: e0298baaeb970b93da8f01e7c275092a + depends: + - pytest >=6.2.5 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-mock?source=hash-mapping + size: 22785 + timestamp: 1757071019062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda + sha256: 9979a7d4621049388892489267139f1aa629b10c26601ba5dce96afc2b1551d4 + md5: 8c399445b6dc73eab839659e6c7b5ad1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 30629559 + timestamp: 1749050021812 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.13-hc22306f_0_cpython.conda + sha256: 2c966293ef9e97e66b55747c7a97bc95ba0311ac1cf0d04be4a51aafac60dcb1 + md5: 95facc4683b7b3b9cf8ae0ed10f30dce + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 14573820 + timestamp: 1749048947732 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda + sha256: 723dbca1384f30bd2070f77dd83eefd0e8d7e4dda96ac3332fbf8fe5573a8abb + md5: bedbb6f7bb654839719cd528f9b298ad + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + size: 18242669 + timestamp: 1749048351218 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: 2cf4264fffb9e6eff6031c5b6884d61c + depends: + - python >=3.7 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222742 + timestamp: 1709299922152 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.25.1-pyhd8ed1ab_0.conda + sha256: cebd04148756aed1ed1fabb6de217c6f017a34a47b4bcbd4a9e614b987b549d9 + md5: ed8e671cb3bfbd38d4da6c45e87a2e97 + depends: + - levenshtein 0.25.1 + - python >=3.7 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/python-levenshtein?source=hash-mapping + size: 15723 + timestamp: 1712529792500 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.26.1-pyhff2d567_1.conda + sha256: 4da6d55430b365b336552bba96121c833ab7d7802b44a593c6138830ccb77e97 + md5: 12f2b431f92542fba1c97ebb92d9aa19 + depends: + - levenshtein 0.26.1 + - python >=3.9 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/python-levenshtein?source=hash-mapping + size: 15867 + timestamp: 1734293104641 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-levenshtein-0.27.1-pyhff2d567_0.conda + sha256: 4fca6f1e119e3e747e79c05637b2f193cdac80a7a2e7b6c93eca1ce14c12b07e + md5: 8ca73b15366febeb47825375d901778c + depends: + - levenshtein 0.27.1 + - python >=3.9 + license: GPL-2.0-or-later + license_family: GPL + purls: + - pkg:pypi/python-levenshtein?source=hash-mapping + size: 15914 + timestamp: 1741044662301 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + sha256: 9da9a849d53705dee450b83507df1ca8ffea5f83bd21a215202221f1c492f8ad + md5: 98206ea9954216ee7540f0c773f2104d + depends: + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 144024 + timestamp: 1707747742930 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 143794 + timestamp: 1737541204030 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 + md5: 88476ae6ebd24f39261e0854ac244f33 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 144160 + timestamp: 1742745254292 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda + build_number: 8 + sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894 + md5: 8fcb6b0e2161850556231336dae58358 + constrains: + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 7003 + timestamp: 1752805919375 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + sha256: 8d2a8bf110cc1fc3df6904091dead158ba3e614d8402a83e51ed3a8aa93cdeb0 + md5: bc8e3267d44011051f2eb14d22fb0960 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 189015 + timestamp: 1742920947249 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda + sha256: d107ad62ed5c62764fba9400f2c423d89adf917d687c7f2e56c3bfed605fb5b3 + md5: 014417753f948da1f70d132b2de573be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 213136 + timestamp: 1737454846598 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py311h4921393_2.conda + sha256: 2af6006c9f692742181f4aa2e0656eb112981ccb0b420b899d3dd42c881bd72f + md5: 250b2ee8777221153fd2de9c279a7efa + depends: + - __osx >=11.0 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 196951 + timestamp: 1737454935552 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.2-py311h5082efb_2.conda + sha256: 6095e1d58c666f6a06c55338df09485eac34c76e43d92121d5786794e195aa4d + md5: e474ba674d780f0fa3b979ae9e81ba91 + depends: + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 187430 + timestamp: 1737454904007 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.1-py311h1ddb823_0.conda + sha256: 799d464c657e596c701c9ae60787dcd2efae2d8c51cf45e58ee865d28a92b9e9 + md5: 92bc8e8ec1a92b4da38e97f890b84bd3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rapidfuzz?source=hash-mapping + size: 2162398 + timestamp: 1757405494070 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rapidfuzz-3.14.1-py311h251fd82_0.conda + sha256: 4443ad9c411224768c622aa28a48c77e5dcaa5f670506c90d9380de87bfe871f + md5: 021c7f7677c855b3634b82e4acc007c3 + depends: + - __osx >=11.0 + - libcxx >=19 + - numpy + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rapidfuzz?source=hash-mapping + size: 713162 + timestamp: 1757405649638 +- conda: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.14.1-py311h3e6a449_0.conda + sha256: cb8b5f9ff8126de061fdea0c250ca973a36a8a5306f66c7df5d8804d4ee32324 + md5: dbfa7901e616f933ed2233a3e6dd1c5b + depends: + - numpy + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rapidfuzz?source=hash-mapping + size: 1025846 + timestamp: 1757405818854 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 250351 + timestamp: 1679532511311 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + md5: a30144e4156cdbb236f99ebb49828f8b + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.7 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + size: 56690 + timestamp: 1684774408600 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 + md5: 7462280d81f639363e6e63c81276bd9e + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 501790 + timestamp: 1713094963112 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + sha256: daa4638d288cfdf3b0ecea395d8efa25cafc4ebf4026464a36c797c84541d2be + md5: c8ddb4f34a208df4dd42509a0f6a1c89 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 483015 + timestamp: 1716368141661 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + sha256: e0778e4f276e9a81b51c56f51ec22a27b4d8fc955abc0be77ad09ca9bea06bb9 + md5: 8f28e299c11afdd79e0ec1e279dcdc52 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 775598 + timestamp: 1736512753595 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 + md5: 4de79c071274a53dcaf2a8c749d1499e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 748788 + timestamp: 1748804951958 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + md5: e5f25f8dbc060e9a8d912e432202afc2 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 14259 + timestamp: 1620240338595 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=compressed-mapping + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda + sha256: 621926aae93513408bdca3dd21c97e2aa8ba7dcd2c400dab804fb0ce7da1387b + md5: 21745fdd12f01b41178596143cbecffd + depends: + - libhwloc >=2.10.0,<2.10.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 161618 + timestamp: 1712960215111 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h18a62a1_3.conda + sha256: 30e82640a1ad9d9b5bee006da7e847566086f8fdb63d15b918794a7ef2df862c + md5: 72226638648e494aaafde8155d50dab2 + depends: + - libhwloc >=2.12.1,<2.12.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 150266 + timestamp: 1755776172092 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.13.0-h62715c5_1.conda + sha256: 03cc5442046485b03dd1120d0f49d35a7e522930a2ab82f275e938e17b07b302 + md5: 9190dd0a23d925f7602f9628b3aed511 + depends: + - libhwloc >=2.11.2,<2.11.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 151460 + timestamp: 1732982860332 +- conda: https://conda.anaconda.org/conda-forge/noarch/thefuzz-0.22.1-pyhd8ed1ab_0.conda + sha256: 431fafb2e4d9b1d240dcdab9c38442449659aec40f0676f16e4bf58d30ced4e3 + md5: b3e4c0039fcafa98afee9a794f1e5d58 + depends: + - python >=3.6 + - python-levenshtein >=0.12 + license: GPL-2.0-only + license_family: GPL + purls: + - pkg:pypi/thefuzz?source=hash-mapping + size: 14795 + timestamp: 1705695908725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3285204 + timestamp: 1748387766691 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e + md5: 7362396c170252e7b7b0c8fb37fe9c78 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3125538 + timestamp: 1748388189063 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda + sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896 + md5: ebd0e761de9aa879a51d22cc721bd095 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + purls: [] + size: 3466348 + timestamp: 1748388121356 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + purls: [] + size: 3503410 + timestamp: 1699202577803 +- conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 + md5: b0dd904de08b7db706167240bf37b164 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/toml?source=hash-mapping + size: 22132 + timestamp: 1734091907682 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda + sha256: 040a5a05c487647c089ad5e05ad5aff5942830db2a4e656f1e300d73436436f1 + md5: 30a0a26c8abccf4b7991d590fe17c699 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=compressed-mapping + size: 21238 + timestamp: 1753796677376 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda + sha256: 416d1d9318f3267325ad7e2b8a575df20ff9031197b30c0222c3d3b023877260 + md5: 2b8dfb969f984497f3f98409a9545776 + depends: + - colorama + - python >=3.7 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89567 + timestamp: 1707598746354 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda + sha256: 75342f40a69e434a1a23003c3e254a95dca695fb14955bc32f1819cd503964b2 + md5: e74cd796e70a4261f86699ee0a3a7a24 + depends: + - colorama + - python >=3.7 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89452 + timestamp: 1714855008479 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.6-pyhd8ed1ab_0.conda + sha256: 32c39424090a8cafe7994891a816580b3bd253eb4d4f5473bdefcf6a81ebc061 + md5: 92718e1f892e1e4623dcc59b9f9c4e55 + depends: + - colorama + - python >=3.7 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89367 + timestamp: 1730145312554 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c + md5: edd329d7d3a4ab45dcf905899a7a6115 + depends: + - typing_extensions ==4.15.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 91383 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda + sha256: 8aaf69b828c2b94d0784f18f70f11aa032950d304e57e88467120b45c18c24fd + md5: 399701494e731ce73fdd86c185a3d1b4 + depends: + - python >=3.10 + - typing_extensions >=4.12.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/typing-inspection?source=compressed-mapping + size: 18799 + timestamp: 1759301271883 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 + md5: 0caa1af407ecff61170c9437a808404d + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=compressed-mapping + size: 51692 + timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + purls: [] + size: 119815 + timestamp: 1706886945727 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 + license: LicenseRef-Public-Domain + purls: [] + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + purls: [] + size: 122968 + timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + purls: [] + size: 1283972 + timestamp: 1666630199266 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 559710 + timestamp: 1728377334097 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 694692 + timestamp: 1756385147981 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda + sha256: 4542cc3093f480c7fa3e104bfd9e5b7daeff32622121be6847f9e839341b0790 + md5: 4e8447ca8558a203ec0577b4730073f3 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=13 + - libstdcxx >=13 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13858 + timestamp: 1725784165345 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.0.1-py311h2c37856_5.conda + sha256: f48499c8f639265c53dc794ff2f2d0aa163845eb31841c226ec172f64861654d + md5: d5fe38d502e3d758c8f0fed8ba9ea652 + depends: + - __osx >=11.0 + - cffi + - libcxx >=17 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 13603 + timestamp: 1725784278728 +- conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py311h3257749_5.conda + sha256: 7624abb32c075e234dad59acb5b580006adfef348cd1aefcbe0be31546aa5b73 + md5: 938a78ac20d6ed625b8d76015c6be88d + depends: + - cffi + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + size: 17253 + timestamp: 1725784407361 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + sha256: d4009dcc9327684d6409706ce17656afbeae690d8522d3c9bc4df57649a352cd + md5: 08807a87fa7af10754d46f63b368e016 + depends: + - brotli-python >=1.0.9 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 94669 + timestamp: 1708239595549 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + sha256: 4fb9789154bd666ca74e428d973df81087a697dbb987775bc3198d2215f240f8 + md5: 436c165519e140cb08d246a4472a9d6a + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + size: 101735 + timestamp: 1750271478254 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18249 + timestamp: 1753739241465 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h5fd82a7_24.conda + sha256: 7ce178cf139ccea5079f9c353b3d8415d1d49b0a2f774662c355d3f89163d7b4 + md5: 00cf3a61562bd53bd5ea99e6888793d0 + depends: + - vc14_runtime >=14.40.33810 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17693 + timestamp: 1737627189024 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + md5: 20e1e652a4c740fa719002a8449994a2 + depends: + - vc14_runtime >=14.38.33130 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16977 + timestamp: 1702511255313 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 682424 + timestamp: 1753739239305 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 113963 + timestamp: 1753739198723 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda + sha256: d603f8608f353a7aaa794c00bd3df71aafd5b56bf53af3e9c3dfe135203a4f33 + md5: 4e1cd2faf006a6e62c148f95cef0cac2 + depends: + - distlib <1,>=0.3.7 + - filelock <4,>=3.12.2 + - platformdirs <5,>=3.9.1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=hash-mapping + size: 3459994 + timestamp: 1714439521015 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda + sha256: 1eefd180723fb2fd295352323b53777eeae5765b24d62ae75fc9f1e71b455f11 + md5: 7d36e7a485ea2f5829408813bdbbfb38 + depends: + - distlib <1,>=0.3.7 + - filelock <4,>=3.12.2 + - platformdirs <5,>=3.9.1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=hash-mapping + size: 3458445 + timestamp: 1715681264937 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda + sha256: c50a4ab0f5f1164230d42a29f12f61ece9c7b102f57ed1c607d2cd7c77e107b5 + md5: d8a3ee355d5ecc9ee2565cafba1d3573 + depends: + - distlib >=0.3.7,<1 + - filelock >=3.12.2,<4 + - platformdirs >=3.9.1,<5 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=hash-mapping + size: 3519478 + timestamp: 1739263533376 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda + sha256: 398f40090e80ec5084483bb798555d0c5be3d1bb30f8bb5e4702cd67cdb595ee + md5: 2bd6c0c96cfc4dbe9bde604a122e3e55 + depends: + - distlib >=0.3.7,<1 + - filelock >=3.12.2,<4 + - platformdirs >=3.9.1,<5 + - python >=3.9 + - typing_extensions >=4.13.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=compressed-mapping + size: 4381624 + timestamp: 1755111905876 +- pypi: https://files.pythonhosted.org/packages/aa/50/fc98c8754a5963399da16edbb82ea74d524d7fd6e732315cfcce6008e138/vladiate-0.0.26-py3-none-any.whl + name: vladiate + version: 0.0.26 + sha256: e32de383c891dcf343d838021683d2a5f20dbccebcadfde80c82f4df7abf61f7 + requires_dist: + - boto ; extra == 's3' +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_31.conda + sha256: 8b20152d00e1153ccb1ed377a160110482f286a6d85a82b57ffcd60517d523a7 + md5: d75abcfbc522ccd98082a8c603fce34c + depends: + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18249 + timestamp: 1753739241918 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f + md5: 46e441ba871f524e2b067929da3051c2 + depends: + - __win + - python >=3.9 + license: LicenseRef-Public-Domain + purls: + - pkg:pypi/win-inet-pton?source=hash-mapping + size: 9555 + timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + sha256: a11ae693a0645bf6c7b8a47bac030be9c0967d0b1924537b9ff7458e832c0511 + md5: 30878ecc4bd36e8deeea1e3c151b2e0b + depends: + - __win + - python >=3.6 + license: PUBLIC-DOMAIN + purls: + - pkg:pypi/win-inet-pton?source=hash-mapping + size: 8191 + timestamp: 1667051294134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + size: 85189 + timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + license: MIT + license_family: MIT + purls: [] + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + size: 83386 + timestamp: 1753484079473 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 + md5: 433699cba6602098ae8957a323da2664 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + purls: [] + size: 63944 + timestamp: 1753484092156 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + sha256: 4e2246383003acbad9682c7c63178e2e715ad0eb84f03a8df1fbfba455dfedc5 + md5: adbfb9f45d1004a26763652246a33764 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + purls: [] + size: 63274 + timestamp: 1641347623319 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + license: Zlib + license_family: Other + purls: [] + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_0.conda + sha256: ed149760ea78e038e6424d8a327ea95da351727536c0e9abedccf5a61fc19932 + md5: 0fd242142b0691eb9311dc32c1d4ab76 + depends: + - python + - cffi >=1.11 + - zstd >=1.5.7,<1.5.8.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.11.* *_cp311 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 466651 + timestamp: 1757930101225 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py311h5bb9006_0.conda + sha256: fb1443a1479a6d709b4af7a2cdcea3ef2a5e859378de19814086fa86ca6f934e + md5: c7e0f1b714bd12d39899a4f0c296dd86 + depends: + - python + - cffi >=1.11 + - zstd >=1.5.7,<1.5.8.0a0 + - __osx >=11.0 + - python 3.11.* *_cpython + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 390089 + timestamp: 1757930124840 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py311hf893f09_0.conda + sha256: 3b66d3cb738a9993e8432d1a03402d207128166c4ef0c928e712958e51aff325 + md5: d26077d20b4bba54f4c718ed1313805f + depends: + - python + - cffi >=1.11 + - zstd >=1.5.7,<1.5.8.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zstd >=1.5.7,<1.6.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 375866 + timestamp: 1757930134099 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 567578 + timestamp: 1742433379869 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 + md5: e6f69c7bcccdefa417f056fa593b40f0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 399979 + timestamp: 1742433432699 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 + md5: 21f56217d6125fb30c3c3f10c786d751 + depends: + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 354697 + timestamp: 1742433568506 diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 00000000000..b9f9c121e4d --- /dev/null +++ b/pixi.toml @@ -0,0 +1,65 @@ +[workspace] +name = "python-deadlines" +version = "0.1.0" +description = "Python deadlines is a Python package to parse and manage deadlines from various sources." +authors = ["Jesper Dramsch "] +channels = ["conda-forge"] +platforms = ["win-64", "osx-arm64", "linux-64"] + +[tasks] +sort = 'python ./utils/sort_yaml.py --skip_links' +links = 'python ./utils/sort_yaml.py' +merge = 'python ./utils/main.py' +serve = "bundler exec jekyll serve" +serve-dev = "bundler exec jekyll serve --config _config.yml,_config.dev.yml" +serve-fast = "bundler exec jekyll serve --config _config.yml,_config.dev.yml --incremental --skip-initial-build" +serve-minimal = "bundler exec jekyll serve --config _config.yml,_config.minimal.yml --incremental" +build-dev = "bundler exec jekyll build --config _config.yml,_config.dev.yml" +build-minimal = "bundler exec jekyll build --config _config.yml,_config.minimal.yml" +profile = "bundler exec jekyll build --profile" +next = "python ./utils/newsletter.py" +git = "python utils/git_parser.py" +newsletter = { depends-on = ["git", "next"] } +setup-hooks = "pre-commit install" +test = "pytest tests/ -v" +test-cov = "pytest tests/ -v --cov=utils --cov-report=term-missing" +test-fast = "pytest tests/ -v -x" +pre = "pre-commit run --all-files" + +[dependencies] +python = ">=3.10,<3.12" +thefuzz = ">=0.22.1,<0.23" +pandas = ">=2.2.2,<2.3" +iso3166 = ">=2.1.1,<2.2" +icalendar = ">=5.0.12,<5.1" +yaml = ">=0.2.5,<0.3" +pyyaml = ">=6.0.1,<6.1" +tqdm = ">=4.66.2,<4.67" +requests = ">=2.31.0,<2.32" +pre-commit = ">=3.1.1,<3.8" +pydantic = ">=2.12.5,<3" + +[feature.all-contrib.dependencies] +nodejs = "*" + +[feature.tests.dependencies] +nodejs = "*" +pytest = ">=7.4.0,<8.0" +pytest-cov = ">=4.1.0,<5.0" +pytest-mock = ">=3.11.0,<4.0" + + +[feature.all-contrib.tasks] +install = "npm install -g all-contributors-cli" +check = "all-contributors check" +add = "all-contributors add" + +[feature.tests.tasks] +test = "pytest tests/ -v; npm test" + +[environments] +all-contrib = ["all-contrib"] +tests = ["tests"] + +[pypi-dependencies] +vladiate = ">=0.0.26, <0.0.27" diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 00000000000..d0a3de162b3 --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,147 @@ +/** + * Playwright E2E test configuration + */ + +import { defineConfig, devices } from '@playwright/test'; + +const PORT = process.env.PORT || 4000; +const BASE_URL = process.env.BASE_URL || `http://localhost:${PORT}`; + +export default defineConfig({ + // Test directory + testDir: './tests/e2e', + + // Test file patterns + testMatch: /.*\.(spec|test)\.(js|ts)$/, + + // Maximum time one test can run + timeout: 30 * 1000, + + // Maximum time to wait for page to load + expect: { + timeout: 10 * 1000, + }, + + // Run tests in parallel + fullyParallel: true, + + // Fail the build on CI if you accidentally left test.only in the source code + forbidOnly: !!process.env.CI, + + // Retry on CI only + retries: process.env.CI ? 2 : 0, + + // Limit parallel workers on CI + workers: process.env.CI ? 2 : undefined, + + // Reporter configuration + reporter: [ + ['html', { outputFolder: 'playwright-report', open: 'never' }], + ['json', { outputFile: 'test-results/results.json' }], + ['junit', { outputFile: 'test-results/junit.xml' }], + ['list'], + ], + + // Global test settings + use: { + // Base URL for all tests + baseURL: BASE_URL, + + // Collect trace when retrying the failed test + trace: 'on-first-retry', + + // Screenshot on failure + screenshot: 'only-on-failure', + + // Video on failure + video: 'retain-on-failure', + + // Action timeout + actionTimeout: 10 * 1000, + + // Navigation timeout + navigationTimeout: 30 * 1000, + + // Emulate timezone for consistent testing + timezoneId: 'UTC', + + // Locale for consistent testing + locale: 'en-US', + + // Permissions to grant + permissions: ['notifications'], + + // Viewport size + viewport: { width: 1280, height: 720 }, + }, + + // Configure projects for different browsers + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + // Custom launch options for Chromium + launchOptions: { + args: ['--disable-dev-shm-usage'], + }, + }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + // Mobile viewports + { + name: 'mobile-chrome', + use: { ...devices['Pixel 5'] }, + }, + + { + name: 'mobile-safari', + use: { ...devices['iPhone 12'] }, + }, + + // Test with different timezones + { + name: 'timezone-ny', + use: { + ...devices['Desktop Chrome'], + timezoneId: 'America/New_York', + }, + }, + + { + name: 'timezone-berlin', + use: { + ...devices['Desktop Chrome'], + timezoneId: 'Europe/Berlin', + }, + }, + ], + + // Run local dev server before starting tests (optional) + webServer: process.env.CI ? undefined : { + // Use optimized test server for fastest startup + command: 'bundle exec jekyll serve --config _config.yml,_config.test.yml --incremental', + port: PORT, + timeout: 30 * 1000, // Very fast with test config + reuseExistingServer: true, + stdout: 'pipe', + stderr: 'pipe', + }, + + // Output folder for test artifacts + outputDir: 'test-results/', + + // Global setup and teardown + globalSetup: './tests/e2e/global-setup.js', + globalTeardown: './tests/e2e/global-teardown.js', +}); diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 00000000000..3eaec3c656c --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +markers = + smoke: smoke tests for production health checks + network: tests that require network access diff --git a/python-conferences.ics b/python-conferences.ics new file mode 100644 index 00000000000..afeeb5eeb9f --- /dev/null +++ b/python-conferences.ics @@ -0,0 +1,3 @@ +--- +layout: calendar-conferences +--- diff --git a/python-deadlines.ics b/python-deadlines.ics index d75db02d7c2..3e5dd430d55 100644 --- a/python-deadlines.ics +++ b/python-deadlines.ics @@ -1,3 +1,3 @@ --- -layout: calendar ---- \ No newline at end of file +layout: calendar-deadlines +--- diff --git a/python-events-export.xml b/python-events-export.xml new file mode 100644 index 00000000000..d2f7be2ec24 --- /dev/null +++ b/python-events-export.xml @@ -0,0 +1,26 @@ +--- +--- + + + + + Newsfeed for Python Events Calendar from {{ site.title | xml_escape }} + {% if site.description %}{{ site.description | xml_escape }}{% endif %} + https://{{ site.domain }}/feed.xml + {{ site.time | date_to_rfc822 }} + {% for conf in site.data.conferences limit:23 %} + + {{ conf.conference | xml_escape }} {{ conf.year }} Conference Deadline + * type of event: Conference
    * focus on Python: Yes
    * approximate number of attendees: Unknown
    * location (incl. country): {{conf.place | xml_escape }}
    * dates/times/recurrence (incl. time zone): {%- translate_file dates/pretty_dates.html start=conf.start end=conf.end -%}
    * HTML link : {{ conf.conference | xml_escape }} {{ conf.year }}]]>
    + {{ conf.start | date_to_rfc822 }} + https://{{ site.domain }}/conference/{{conf.conference | slugify: "latin"}}-{{conf.year}}/ + {{conf.conference | slugify: "latin"}}-{{conf.year}} + {{ conf.sub }} +
    + {% endfor %} +
    +
    diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 00000000000..f96ca32da2d --- /dev/null +++ b/ruff.toml @@ -0,0 +1,64 @@ +line-length = 120 +target-version = "py310" +preview = true + +[lint] +select = [ + "A", # flake8 builtins + "B", # flake8-bugbear + "D", # pydocstyle + "E", # pycodestyle error + "W", # pycodestyle warning + "F", # flake8 error + "UP", # Pyupgrade + "SIM", # flake8-simplify + "N", # pep8 naming + "YTT", # flake8-2020 + "S", # bandit + "COM", # Commas + "C4", # Comprehensions + "DTZ", # Datetimes + "ISC", # Implicit string concatenation + "ICN", # Import conventions + "LOG", # Logging + "PIE", # Misc lints + "PT", # Pytest + "Q", # Quotes + "RSE", # Raises + "TID", # Tidy imports + "PTH", # Use Pathlib + "PGH", # Pygrep hooks + "R", # Refactor + "FLY", # Fstrings + "PERF", # Perfomance linting + "FURB", # Modernising code + "RUF", # Ruff specific + "NPY", # Numpys + # "PL", # Pylint + # "TD", # Todos + # "FBT", # Boolean traps + # "CPY", # Copyright +] +ignore = [ + "E203", + "D100", + "D101", + "D102", + "D103", + "D104", + "D105", + "D401", + "S101", + "B028", + "B018", + "PT018", + "RET504", + +] + +[lint.per-file-ignores] +# S603: subprocess with validated URL input for lynx text extraction +"utils/enrich_tba.py" = ["S603"] + +[lint.pydocstyle] +convention = "numpy" diff --git a/static/css/about.css b/static/css/about.css new file mode 100644 index 00000000000..de34b584dc5 --- /dev/null +++ b/static/css/about.css @@ -0,0 +1,463 @@ +/* Base styles - working with Bootstrap */ +:root { + --primary-color: #4584b6; + --secondary-color: #ffde57; + --text-color: #333; + --bg-color: #f8f9fa; + --white: #fff; + --shadow-light: 0 2px 10px rgba(0, 0, 0, 0.05); + --shadow-medium: 0 4px 20px rgba(0, 0, 0, 0.1); + --border-radius: 8px; + --transition-normal: all 0.3s ease; +} + +body { + color: var(--text-color); + background-color: var(--bg-color); + transition: var(--transition-normal); +} + +nav { + line-height: normal !important; +} + +a { + color: var(--primary-color); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* Presentation controls */ +.presentation-mode-btn { + position: fixed; + top: 5rem; + right: 1rem; + font-size: 1.5rem; + background-color: rgba(255, 255, 255, 0.8); + border: none; + border-radius: 50%; + width: 50px; + height: 50px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + z-index: 1000; + box-shadow: var(--shadow-light); + transition: background-color 0.2s ease; +} + +.presentation-mode-btn:hover { + background-color: var(--white); +} + +.slide-navigation { + display: none; /* Hidden by default, shown in presentation mode */ + position: fixed; + bottom: 1rem; + left: 50%; + transform: translateX(-50%); + background-color: rgba(0, 0, 0, 0.5); + padding: 0.5rem 1rem; + border-radius: 2rem; + z-index: 1000; + color: var(--white); + align-items: center; + gap: 1rem; +} + +.nav-btn { + background: none; + border: none; + color: var(--white); + font-size: 1.2rem; + cursor: pointer; + padding: 0.5rem; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.2s ease; +} + +.nav-btn:hover { + background-color: rgba(255, 255, 255, 0.2); +} + +.slide-indicator { + font-size: 1rem; + font-weight: 500; +} + +/* Slides */ +.slide { + margin-bottom: 5rem; + transition: opacity 0.3s ease, transform 0.3s ease; +} + +/* Hero Section */ +.hero-section { + background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%); + border-radius: var(--border-radius); + color: var(--white); + box-shadow: var(--shadow-medium); + display: flex; + flex-direction: column; + justify-content: center; +} + +.logo { + font-size: 2.5rem; + font-weight: 800; + margin-bottom: 1rem; + letter-spacing: -0.03em; +} + +.tagline { + font-size: 2rem; + margin-bottom: 1.5rem; + font-weight: 700; +} + +.hero-description { + font-size: 1.2rem; + max-width: 700px; + margin-bottom: 2rem; + opacity: 0.9; +} + +/* Problem-solution section - now using Bootstrap grid */ +.problem, +.solution { + background-color: var(--white); + box-shadow: var(--shadow-light); +} + +.problem h2, +.solution h2 { + color: var(--primary-color); + margin-top: 0; +} + +.section-title { + text-align: center; + margin: 3rem 0 2rem; + color: var(--text-color); + font-size: 2rem; + position: relative; +} + +.section-title::after { + content: ''; + display: block; + width: 80px; + height: 4px; + background: var(--secondary-color); + margin: 0.5rem auto 0; +} + +/* Features - using Bootstrap row/col */ +.feature { + background: var(--white); + transition: transform 0.3s ease, box-shadow 0.3s ease, opacity 0.5s ease; + opacity: 0; + transform: translateY(20px); +} + +.feature:hover { + transform: translateY(-5px); + box-shadow: var(--shadow-medium); +} + +.feature.visible { + opacity: 1; + transform: translateY(0); +} + +.feature-icon { + font-size: 2.5rem; + margin-bottom: 1rem; +} + +.feature h3 { + color: var(--primary-color); +} + +/* Conference types section */ +.conference-types-container { + background-color: var(--white); + box-shadow: var(--shadow-light); +} + +.conf-type { + transition: transform 0.2s ease; + display: flex; + align-items: center; +} + +.conf-type:hover { + transform: scale(1.03); +} + +.conf-type-icon { + margin-right: 0.5rem; + font-size: 1.2rem; +} + +/* Stats section - Using Bootstrap row/col */ +.stat { + background-color: var(--white); + text-align: center; + box-shadow: var(--shadow-light); + transition: transform 0.3s ease, opacity 0.5s ease; + opacity: 0; + transform: translateY(20px); +} + +.stat.visible { + opacity: 1; + transform: translateY(0); +} + +.stat:hover { + transform: translateY(-5px); + box-shadow: var(--shadow-medium); +} + +.stat-number { + font-size: 3rem; + font-weight: 700; + color: var(--primary-color); + margin-bottom: 0.5rem; +} + +.stat-label { + font-size: 1.2rem; + font-weight: 600; + margin-bottom: 0.5rem; +} + +.stat-description { + font-size: 0.9rem; + color: #666; +} + +/* Testimonials - using Bootstrap row/col */ +.testimonial { + background-color: var(--white); + box-shadow: var(--shadow-light); + position: relative; + transition: opacity 0.5s ease, transform 0.3s ease; + opacity: 0; + transform: translateY(20px); +} + +.testimonial.visible { + opacity: 1; + transform: translateY(0); +} + +.testimonial::before { + content: '"'; + position: absolute; + top: 0; + left: 1.5rem; + font-size: 5rem; + color: var(--secondary-color); + line-height: 1; + opacity: 0.5; +} + +.quote { + margin-top: 1.5rem; + font-style: italic; +} + +.author { + text-align: right; + font-weight: 500; + color: var(--primary-color); +} + +/* Use cases - using Bootstrap row/col */ +.use-case { + background-color: var(--white); + box-shadow: var(--shadow-light); + transition: opacity 0.5s ease, transform 0.3s ease; + opacity: 0; + transform: translateY(20px); +} + +.use-case.visible { + opacity: 1; + transform: translateY(0); +} + +.use-case h3 { + color: var(--primary-color); + margin-top: 0; +} + +/* CTA section */ +.cta-section { + background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%); + box-shadow: var(--shadow-medium); +} + +.qr-code { + max-width: 200px; +} + +/* Presentation mode specific styles */ +body.presentation-mode { + overflow: hidden; + background-color: var(--bg-color); + font-size: 1.6rem; +} + +body.presentation-mode .container { + max-width: none; + width: 100vw; + height: 100vh; + padding: 0; + margin: 0; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + +body.presentation-mode .slide { + margin: 0; + width: 100vw; + height: 100vh; + position: absolute; + top: 0; + left: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 4rem; + opacity: 0; + pointer-events: none; + transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out; + transform: translateY(40px); + overflow: hidden; +} + +body.presentation-mode .slide.active { + padding: 3rem; + opacity: 1; + pointer-events: auto; + transform: translateY(0); +} + +body.presentation-mode .slide-content { + min-width: 50%; + min-height: 50%; + max-width: 90%; + max-height: 90vh; + overflow: auto; + padding: 2rem; +} + +body.presentation-mode h1 { + font-size: 3.5rem; +} + +body.presentation-mode h2 { + font-size: 2.8rem; +} + +body.presentation-mode h3 { + font-size: 2.2rem; +} + +body.presentation-mode .feature-icon { + font-size: 3rem; +} + +body.presentation-mode .stat-number { + font-size: 4rem; +} + +body.presentation-mode p, +body.presentation-mode .quote, +body.presentation-mode .stat-description, +body.presentation-mode .conf-type-name, +body.presentation-mode .author { + font-size: 1.8rem; + font-weight: 500; + line-height: 1.5; +} + +body.presentation-mode h1, +body.presentation-mode h2, +body.presentation-mode h3, +body.presentation-mode .stat-number { + font-weight: 700; + line-height: 1.3; +} + +body.presentation-mode nav, +body.presentation-mode footer { + display: none; +} + +/* Progress indicator */ +body.presentation-mode::after { + content: ''; + position: fixed; + bottom: 0; + left: 0; + height: 5px; + background-color: var(--primary-color); + transition: width 0.3s ease; +} + +body.presentation-mode[data-slide='1']::after { + width: calc(100% / 8 * 1); +} +body.presentation-mode[data-slide='2']::after { + width: calc(100% / 8 * 2); +} +body.presentation-mode[data-slide='3']::after { + width: calc(100% / 8 * 3); +} +body.presentation-mode[data-slide='4']::after { + width: calc(100% / 8 * 4); +} +body.presentation-mode[data-slide='5']::after { + width: calc(100% / 8 * 5); +} +body.presentation-mode[data-slide='6']::after { + width: calc(100% / 8 * 6); +} +body.presentation-mode[data-slide='7']::after { + width: calc(100% / 8 * 7); +} +body.presentation-mode[data-slide='8']::after { + width: calc(100% / 8 * 8); +} + +/* Custom scrollbar */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: #f1f1f1; +} + +::-webkit-scrollbar-thumb { + background: #888; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #555; +} diff --git a/static/css/action-bar-minimal.css b/static/css/action-bar-minimal.css new file mode 100644 index 00000000000..f959f33ec11 --- /dev/null +++ b/static/css/action-bar-minimal.css @@ -0,0 +1,511 @@ +/* Minimal Action Bar Design - Progressive Disclosure */ + +:root { + --action-line-width: 3px; + --action-line-expanded: 24px; + --action-color-default: #e0e0e0; + --action-color-saved: #3776ab; + --action-color-series: #ffd43b; + --action-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Conference Item with Action Indicator */ +.ConfItem { + position: relative; + padding-left: 30px; /* More space for the action line */ + transition: padding-left 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* The Minimal Action Line */ +.action-indicator { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: var(--action-line-width); + background: var(--action-color-default); + transition: var(--action-transition); + cursor: pointer; + overflow: hidden; +} + +/* States for the action line */ +.action-indicator.saved { + background: var(--action-color-saved); +} + +.action-indicator.series { + background: linear-gradient( + to bottom, + var(--action-color-saved) 0%, + var(--action-color-saved) 70%, + var(--action-color-series) 70%, + var(--action-color-series) 100% + ); +} + +/* Hover State - Line Expands */ +.ConfItem:hover .action-indicator, +.action-indicator:hover, +.action-indicator.active { + width: var(--action-line-expanded); +} + +/* Subtle parallax effect on hover */ +.ConfItem:hover { + padding-left: 35px; /* Subtle movement, not as far as the bar */ +} + +/* Action Icon - Hidden by Default */ +.action-icon { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + opacity: 0; + transition: opacity 0.3s ease; + color: white; + font-size: 14px; + pointer-events: none; +} + +.action-indicator.saved .action-icon { + color: white; +} + +/* Show icon on hover */ +.ConfItem:hover .action-icon, +.action-indicator:hover .action-icon, +.action-indicator.active .action-icon { + opacity: 1; + transition-delay: 0.1s; +} + +/* Popover for Additional Actions */ +.action-popover { + position: absolute; + left: calc(var(--action-line-expanded) + 5px); + top: 50%; + transform: translateY(-50%); + background: white; + border: 1px solid #dee2e6; + border-radius: 6px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + padding: 8px; + display: none; + z-index: 1000; + min-width: 160px; +} + +.action-popover.show { + display: block; + animation: popoverSlide 0.2s ease; +} + +@keyframes popoverSlide { + from { + opacity: 0; + transform: translateY(-50%) translateX(-10px); + } + to { + opacity: 1; + transform: translateY(-50%) translateX(0); + } +} + +.action-popover-item { + display: flex; + align-items: center; + padding: 8px 12px; + border-radius: 4px; + cursor: pointer; + transition: background 0.2s ease; + color: #333; + text-decoration: none; + font-size: 14px; +} + +.action-popover-item:hover { + background: #f8f9fa; +} + +.action-popover-item i { + width: 20px; + margin-right: 8px; + color: #495057; /* Better contrast */ +} + +.action-popover-item.active i { + color: var(--action-color-saved); +} + +/* Calendar Dropdown Styles */ +.action-popover-calendar { + position: relative; +} + +.calendar-arrow { + margin-left: auto; + font-size: 10px; + color: #495057; /* Better contrast */ + transition: transform 0.2s ease; +} + +.action-popover-calendar:hover .calendar-arrow { + transform: translateX(2px); +} + +.calendar-dropdown { + position: absolute; + left: 100%; + top: 0; + margin-left: 8px; + background: white; + border: 1px solid #dee2e6; + border-radius: 6px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + padding: 4px; + min-width: 180px; + display: none; + z-index: 1001; +} + +.action-popover-calendar:hover .calendar-dropdown { + display: block; + animation: calendarSlide 0.2s ease; +} + +@keyframes calendarSlide { + from { + opacity: 0; + transform: translateX(-10px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.calendar-option { + display: flex; + align-items: center; + padding: 8px 12px; + border-radius: 4px; + cursor: pointer; + transition: background 0.2s ease; + color: #333; + text-decoration: none; + font-size: 13px; + white-space: nowrap; +} + +.calendar-option:hover { + background: #f8f9fa; +} + +.calendar-option i { + width: 20px; + margin-right: 8px; + font-size: 14px; + color: #495057; /* Better contrast */ +} + +.calendar-option:hover i { + color: var(--action-color-saved); +} + +/* External Links in Title Row */ +.conf-title-row { + display: flex; + align-items: center; + gap: 8px; +} + +.conf-external-links { + display: inline-flex; + gap: 6px; + margin-left: 8px; +} + +.conf-external-links a { + display: inline-flex; + align-items: center; + justify-content: center; + width: 18px; + height: 18px; + opacity: 0.7; /* Better initial visibility */ + transition: opacity 0.2s ease; + border: none; +} + +.conf-external-links a:hover { + opacity: 1; +} + +.conf-external-links img { + width: 14px; + height: 14px; +} + +/* Mobile Styles */ +@media (max-width: 768px) { + .ConfItem { + padding-left: 15px; + padding-right: 45px; /* Space for mobile bookmark */ + transition: none; /* No transition on mobile */ + } + + /* Disable parallax effect on mobile */ + .ConfItem:hover { + padding-left: 15px; /* Keep same padding, no movement */ + } + + .action-indicator { + display: none; /* Hide the line on mobile */ + } + + /* Mobile Bookmark Icon */ + .mobile-action-bookmark { + position: absolute; + top: 15px; + right: 15px; + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + background: transparent; + border: 1px solid #dee2e6; + border-radius: 6px; + color: #495057; /* Better contrast */ + font-size: 16px; + cursor: pointer; + transition: all 0.2s ease; + } + + .mobile-action-bookmark.saved { + background: var(--action-color-saved); + border-color: var(--action-color-saved); + color: white; + } + + .mobile-action-bookmark:active { + transform: scale(0.95); + } + + /* Mobile Action Sheet */ + .mobile-action-sheet { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: white; + border-radius: 16px 16px 0 0; + box-shadow: 0 -2px 16px rgba(0, 0, 0, 0.1); + padding: 20px; + transform: translateY(100%); + transition: transform 0.3s ease; + z-index: 2000; + } + + .mobile-action-sheet.show { + transform: translateY(0); + } + + .mobile-action-sheet-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 12px; + border-bottom: 1px solid #dee2e6; + } + + .mobile-action-sheet-title { + font-size: 18px; + font-weight: 500; + } + + .mobile-action-sheet-close { + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + background: #f8f9fa; + border: none; + border-radius: 15px; + color: #495057; /* Better contrast */ + cursor: pointer; + } + + .mobile-action-sheet-item { + display: flex; + align-items: center; + padding: 14px 0; + color: #333; + text-decoration: none; + font-size: 16px; + } + + .mobile-action-sheet-item i { + width: 24px; + margin-right: 12px; + font-size: 18px; + color: #495057; /* Better contrast */ + } + + .mobile-action-sheet-item.active i { + color: var(--action-color-saved); + } + + .mobile-action-sheet-back { + display: flex; + align-items: center; + padding: 14px 0; + margin-bottom: 12px; + border-bottom: 1px solid #dee2e6; + color: var(--action-color-saved); + cursor: pointer; + font-weight: 500; + } + + .mobile-action-sheet-back i { + width: 24px; + margin-right: 12px; + font-size: 16px; + } +} + +/* Desktop Only */ +@media (min-width: 769px) { + .mobile-action-bookmark, + .mobile-action-sheet { + display: none !important; + } +} + +/* Dark Mode Support */ +@media (prefers-color-scheme: dark) { + .action-popover { + background: #2a2a2a; + border-color: #444; + color: #e0e0e0; + } + + .action-popover-item { + color: #e0e0e0; + } + + .action-popover-item:hover { + background: #333; + } + + .mobile-action-sheet { + background: #2a2a2a; + color: #e0e0e0; + } + + .mobile-action-sheet-header { + border-bottom-color: #444; + } + + .mobile-action-sheet-close { + background: #333; + color: #999; + } + + .mobile-action-sheet-item { + color: #e0e0e0; + } +} + +/* Subtype Tags - Ensure they're visible */ +.conf-sub { + position: relative; + z-index: 10; /* Higher z-index to ensure visibility */ + display: inline-block !important; /* Force display */ + margin-right: 4px; + opacity: 1 !important; /* Ensure full opacity */ + visibility: visible !important; /* Force visibility */ +} + +/* Ensure badge styling is preserved */ +.badge { + position: relative; + z-index: 10; + display: inline-block !important; +} + +/* Ensure tags row is visible */ +.row:has(.conf-sub) { + position: relative; + z-index: 5; + min-height: 24px; /* Ensure space for tags */ +} + +/* Smooth Transitions */ +* { + -webkit-tap-highlight-color: transparent; +} + +/* Accessibility */ +.action-indicator:focus, +.mobile-action-bookmark:focus { + outline: 2px solid var(--action-color-saved); + outline-offset: 2px; +} + +.action-indicator[role="button"], +.mobile-action-bookmark[role="button"] { + cursor: pointer; +} + +/* Loading State */ +.action-indicator.loading, +.mobile-action-bookmark.loading { + opacity: 0.6; + pointer-events: none; +} + +.action-indicator.loading::after, +.mobile-action-bookmark.loading::after { + content: ''; + position: absolute; + width: 16px; + height: 16px; + top: 50%; + left: 50%; + margin: -8px 0 0 -8px; + border: 2px solid white; + border-right-color: transparent; + border-radius: 50%; + animation: spin 0.6s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* Notification animations */ +@keyframes slideIn { + from { + opacity: 0; + transform: translateX(100%); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes slideOut { + from { + opacity: 1; + transform: translateX(0); + } + to { + opacity: 0; + transform: translateX(100%); + } +} diff --git a/static/css/bootstrap.min.css b/static/css/bootstrap.min.css index ef399d21ce7..282380667eb 100644 --- a/static/css/bootstrap.min.css +++ b/static/css/bootstrap.min.css @@ -4,4 +4,4 @@ * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/static/css/calendar.css b/static/css/calendar.css index 4755ffccefb..88b72909b0b 100644 --- a/static/css/calendar.css +++ b/static/css/calendar.css @@ -16,4 +16,4 @@ display: inline; } -} \ No newline at end of file +} diff --git a/static/css/conference-detail-actions.css b/static/css/conference-detail-actions.css new file mode 100644 index 00000000000..828524700fa --- /dev/null +++ b/static/css/conference-detail-actions.css @@ -0,0 +1,332 @@ +/* Conference Detail Page Action Buttons */ + +:root { + --btn-action-primary: #3776ab; + --btn-action-primary-hover: #2a5a87; + --btn-action-secondary: #f8f9fa; + --btn-action-secondary-hover: #e9ecef; + --btn-action-text: #212529; + --btn-action-border: #dee2e6; + --btn-action-shadow: rgba(0, 0, 0, 0.1); + --btn-action-radius: 8px; + --btn-action-transition: all 0.2s ease; +} + +/* Action Buttons Container */ +.conference-actions { + display: flex; + gap: 12px; + align-items: center; + padding: 24px 0; + margin-bottom: 20px; + flex-wrap: wrap; +} + +/* Base Button Style */ +.btn-action { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + border: 1px solid var(--btn-action-border); + border-radius: var(--btn-action-radius); + font-size: 16px; + font-weight: 500; + cursor: pointer; + transition: var(--btn-action-transition); + text-decoration: none; + background: var(--btn-action-secondary); + color: var(--btn-action-text); + box-shadow: 0 2px 4px var(--btn-action-shadow); +} + +.btn-action:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px var(--btn-action-shadow); + text-decoration: none; +} + +.btn-action:active { + transform: translateY(0); + box-shadow: 0 1px 2px var(--btn-action-shadow); +} + +.btn-action i { + font-size: 18px; +} + +/* Primary Button (Follow Series) */ +.btn-action-primary { + background: var(--btn-action-primary); + color: white; + border-color: var(--btn-action-primary); +} + +.btn-action-primary:hover { + background: var(--btn-action-primary-hover); + border-color: var(--btn-action-primary-hover); + color: white; +} + +.btn-action-primary.active { + background: #ffd43b; + border-color: #ffd43b; + color: #333; +} + +.btn-action-primary.active i { + color: #333; +} + +/* Secondary Buttons (Save, Calendar) */ +.btn-action-secondary { + background: var(--btn-action-secondary); + color: var(--btn-action-text); +} + +.btn-action-secondary:hover { + background: var(--btn-action-secondary-hover); + color: var(--btn-action-text); +} + +.btn-action-secondary.active { + background: var(--btn-action-primary); + color: white; + border-color: var(--btn-action-primary); +} + +/* Calendar Dropdown Wrapper */ +.btn-action-calendar-wrapper { + position: relative; + display: inline-block; +} + +.calendar-dropdown-arrow { + font-size: 12px; + margin-left: 4px; + transition: transform 0.2s ease; +} + +.btn-action-calendar-wrapper:hover .calendar-dropdown-arrow, +.btn-action-calendar-wrapper:focus-within .calendar-dropdown-arrow { + transform: rotate(180deg); +} + +/* Calendar Dropdown Menu */ +.calendar-dropdown-menu { + position: absolute; + top: calc(100% + 8px); + left: 0; + min-width: 200px; + background: white; + border: 1px solid var(--btn-action-border); + border-radius: var(--btn-action-radius); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + padding: 8px; + display: none; + z-index: 1000; + animation: dropdownSlide 0.2s ease; +} + +@keyframes dropdownSlide { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.btn-action-calendar-wrapper:hover .calendar-dropdown-menu, +.btn-action-calendar-wrapper:focus-within .calendar-dropdown-menu { + display: block; +} + +.calendar-option { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 12px; + border-radius: 6px; + cursor: pointer; + transition: background 0.2s ease; + color: var(--btn-action-text); + text-decoration: none; + font-size: 14px; +} + +.calendar-option:hover { + background: var(--btn-action-secondary-hover); + color: var(--btn-action-text); + text-decoration: none; +} + +.calendar-option i { + width: 20px; + font-size: 16px; + color: #6c757d; +} + +.calendar-option:hover i { + color: var(--btn-action-primary); +} + +/* Active/Saved States */ +.btn-save-conference.active i { + color: white; +} + +.btn-follow-series.active { + background: #ffd43b; + border-color: #ffd43b; + color: #333; +} + +.btn-follow-series.active i { + color: #333; + animation: bell-ring 0.5s ease; +} + +@keyframes bell-ring { + 0%, 100% { transform: rotate(0deg); } + 25% { transform: rotate(-15deg); } + 75% { transform: rotate(15deg); } +} + +/* Mobile Responsive */ +@media (max-width: 768px) { + .conference-actions { + flex-direction: column; + gap: 10px; + padding: 16px 0; + } + + .btn-action { + width: 100%; + justify-content: center; + padding: 14px 20px; + font-size: 15px; + } + + .btn-text { + display: inline; + } + + .calendar-dropdown-menu { + left: 0; + right: 0; + width: 100%; + } +} + +/* Small Mobile */ +@media (max-width: 480px) { + .btn-action { + padding: 12px 16px; + font-size: 14px; + } + + .btn-action i { + font-size: 16px; + } + + .btn-text { + font-size: 14px; + } +} + +/* Loading State */ +.btn-action.loading { + opacity: 0.6; + pointer-events: none; +} + +.btn-action.loading::after { + content: ''; + width: 14px; + height: 14px; + border: 2px solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spin 0.6s linear infinite; + margin-left: 8px; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* Dark Mode Support */ +@media (prefers-color-scheme: dark) { + :root { + --btn-action-secondary: #2a2a2a; + --btn-action-secondary-hover: #3a3a3a; + --btn-action-text: #e0e0e0; + --btn-action-border: #444; + --btn-action-shadow: rgba(0, 0, 0, 0.3); + } + + .calendar-dropdown-menu { + background: #2a2a2a; + border-color: #444; + } + + .calendar-option { + color: #e0e0e0; + } + + .calendar-option:hover { + background: #3a3a3a; + color: #e0e0e0; + } +} + +/* Notification Toasts */ +.conf-notification { + position: fixed; + top: 20px; + right: 20px; + color: white; + padding: 12px 24px; + border-radius: 6px; + z-index: 9999; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + animation: dropdownSlide 0.3s ease; +} + +.conf-notification-success { + background: var(--btn-action-primary); +} + +.conf-notification-info { + background: #17a2b8; +} + +.conf-notification-warning { + background: #ffc107; + color: #333; +} + +/* Accessibility */ +.btn-action:focus { + outline: 2px solid var(--btn-action-primary); + outline-offset: 2px; +} + +.btn-action:focus:not(:focus-visible) { + outline: none; +} + +/* High contrast mode */ +@media (prefers-contrast: high) { + .btn-action { + border-width: 2px; + } + + .btn-action-primary { + background: #000; + color: #fff; + } +} diff --git a/static/css/dashboard.css b/static/css/dashboard.css new file mode 100644 index 00000000000..546d410e56f --- /dev/null +++ b/static/css/dashboard.css @@ -0,0 +1,539 @@ +/** + * Dashboard Styles for Python Deadlines + * Personal conference dashboard styling + */ + +/* Dashboard Layout */ +.dashboard-header { + border-bottom: 2px solid #e9ecef; + padding-bottom: 1rem; + margin-bottom: 2rem; +} + +/* Filter Panel */ +.filter-panel { + position: sticky; + top: 20px; + max-height: calc(100vh - 40px); + overflow-y: auto; + border: 1px solid #dee2e6; + box-shadow: 0 2px 4px rgba(0,0,0,0.05); + z-index: 10; /* Ensure filter panel stays above series panel during scroll */ + background: white; /* Solid background prevents visual bleed-through */ +} + +.filter-panel .card-header { + background-color: #f8f9fa; + font-weight: 600; + border-bottom: 2px solid #dee2e6; +} + +.filter-group { + border-bottom: 1px solid #e9ecef; + padding-bottom: 1rem; +} + +.filter-group:last-child { + border-bottom: none; + padding-bottom: 0; +} + +.filter-group h6 { + font-size: 0.9rem; + font-weight: 600; + color: #495057; + margin-bottom: 0.5rem; +} + +.form-check-label { + font-size: 0.9rem; + cursor: pointer; +} + +/* Favorite and Series Button Styles */ +.favorite-btn, .series-btn { + transition: all 0.2s ease; + border: none; + background: none; + padding: 0 5px; + opacity: 0.7; +} + +.favorite-btn:hover, .series-btn:hover { + opacity: 1; + transform: scale(1.1); +} + +/* Favorite button (bookmark/star) */ +.favorite-btn { + color: #ccc; +} + +.favorite-btn.favorited { + color: #ffd700 !important; /* Gold for favorited */ + opacity: 1; +} + +.favorite-btn.favorited i { + text-shadow: 0 0 3px rgba(255, 215, 0, 0.5); +} + +/* Series button (bell) */ +.series-btn { + color: #6c757d; +} + +.series-btn.following { + color: #17a2b8 !important; /* Info blue for followed series */ + opacity: 1; +} + +.series-btn.following i { + animation: bellRing 0.5s ease; +} + +@keyframes bellRing { + 0% { transform: rotate(0); } + 25% { transform: rotate(-15deg); } + 50% { transform: rotate(15deg); } + 75% { transform: rotate(-10deg); } + 100% { transform: rotate(0); } +} + +/* Tooltip styles for buttons */ +.favorite-btn::after, .series-btn::after { + content: attr(title); + position: absolute; + bottom: 100%; + left: 50%; + transform: translateX(-50%); + background: #333; + color: white; + padding: 5px 10px; + border-radius: 4px; + font-size: 12px; + white-space: nowrap; + opacity: 0; + pointer-events: none; + transition: opacity 0.2s; +} + +.favorite-btn:hover::after, .series-btn:hover::after { + opacity: 1; +} + +/* Series Panel */ +.series-panel { + /* Aligned with filter panel */ + border: 1px solid #dee2e6; + box-shadow: 0 2px 4px rgba(0,0,0,0.05); + position: relative; /* Create stacking context */ + z-index: 5; /* Lower than filter panel to prevent overlap issues */ + background: white; /* Solid background */ +} + +.series-panel .card-header { + background-color: #e3f2fd; + border-bottom: 2px solid #dee2e6; + font-weight: 600; +} + +.series-item { + padding: 0.5rem; + border: 1px solid #e9ecef; + border-radius: 0.25rem; + background-color: #f8f9fa; +} + +.series-item:hover { + background-color: #e9ecef; +} + +.series-item a { + color: inherit; + text-decoration: none; + transition: color 0.2s ease; +} + +.series-item a:hover { + color: #007bff; + text-decoration: none; +} + +/* Conference Cards */ +.conference-card { + transition: transform 0.2s, box-shadow 0.2s; + height: 100%; +} + +.conference-card:hover { + transform: translateY(-4px); + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); +} + +.conference-card .card-title { + font-size: 1.1rem; + font-weight: 600; + color: #343a40; +} + +.conference-card .card-title a { + color: inherit; + text-decoration: none; + transition: color 0.2s ease; +} + +.conference-card .card-title a:hover { + color: #007bff; + text-decoration: none; +} + +.conference-card .deadline-info { + padding: 0.5rem; + background-color: #f8f9fa; + border-radius: 0.25rem; +} + +/* View Modes */ +.view-grid .conference-cards { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1rem; +} + +.view-list .conference-card { + margin-bottom: 1rem; +} + +/* Favorite and Series Buttons */ +.favorite-btn, +.series-btn { + background: none; + border: none; + padding: 0 5px; + font-size: 1.2em; + cursor: pointer; + transition: color 0.2s, transform 0.2s; +} + +.favorite-btn:hover, +.series-btn:hover { + transform: scale(1.2); +} + +.favorite-btn.favorited { + color: #ffd700 !important; +} + +.series-btn.subscribed { + color: #007bff !important; +} + +/* Quick Subscribe Buttons */ +.quick-subscribe { + text-align: left; + margin-bottom: 0.25rem; +} + +.quick-subscribe.subscribed { + font-weight: 600; +} + +/* Notification Prompt */ +#notification-prompt { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; +} + +#notification-prompt .btn-primary { + background-color: white; + color: #667eea; + border: none; +} + +#notification-prompt .btn-primary:hover { + background-color: #f8f9fa; +} + +/* Toast Notifications */ +#toast-container { + position: fixed; + top: 80px; + right: 20px; + z-index: 9999; + max-width: 350px; +} + +.toast { + margin-bottom: 0.5rem; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +.toast-header { + font-weight: 600; +} + +/* Deadline Status Colors */ +.deadline-passed { + color: #dc3545; + text-decoration: line-through; +} + +.deadline-urgent { + color: #dc3545; + font-weight: bold; + animation: pulse 1.5s infinite; +} + +.deadline-soon { + color: #ffc107; +} + +.deadline-upcoming { + color: #28a745; +} + +@keyframes pulse { + 0% { + opacity: 1; + } + 50% { + opacity: 0.7; + } + 100% { + opacity: 1; + } +} + +/* Empty State */ +#empty-state { + padding: 3rem; + text-align: center; + background-color: #f8f9fa; + border-radius: 0.5rem; +} + +#empty-state i { + color: #dee2e6; +} + +/* Loading State */ +#loading-state { + padding: 3rem; + text-align: center; +} + +.spinner-border { + width: 3rem; + height: 3rem; +} + +/* Badge Styles */ +.badge { + font-weight: 500; + padding: 0.35em 0.65em; + color: white !important; /* Ensure white text on colored backgrounds */ +} + +#filter-count-badge { + font-size: 0.8rem; +} + +/* Predictions Section */ +#series-predictions { + border-top: 2px solid #e9ecef; + padding-top: 2rem; +} + +#predictions-container .alert { + border-left: 4px solid #17a2b8; +} + +/* Mobile Responsive */ +@media (max-width: 768px) { + .filter-panel { + position: relative; + top: 0; + max-height: none; + margin-bottom: 2rem; + } + + .dashboard-header .btn-group { + width: 100%; + margin-top: 1rem; + } + + .dashboard-header .btn { + width: 100%; + margin-bottom: 0.5rem; + } + + .view-grid .conference-cards { + grid-template-columns: 1fr; + } + + .conference-card { + margin-bottom: 1rem; + } + + #toast-container { + left: 10px; + right: 10px; + top: 60px; + } +} + +/* Dark Mode Support */ +@media (prefers-color-scheme: dark) { + .filter-panel, + .series-panel, + .conference-card { + background-color: #212529; + color: #f8f9fa; + border-color: #495057; + } + + .filter-panel .card-header, + .series-panel .card-header { + background-color: #343a40; + color: #f8f9fa; + border-bottom-color: #495057; + } + + .filter-panel .card-body, + .series-panel .card-body { + background-color: #212529; + } + + .form-check-label, + .filter-group h6 { + color: #dee2e6; + } + + .series-item { + background-color: #343a40 !important; + color: #f8f9fa !important; + border-color: #495057 !important; + } + + .series-item:hover { + background-color: #495057 !important; + } + + .conference-card .deadline-info { + background-color: #343a40; + } + + #empty-state { + background-color: #343a40; + color: #f8f9fa; + } + + /* Button adjustments for dark mode */ + .btn-outline-primary { + color: #6ea8fe; + border-color: #6ea8fe; + } + + .btn-outline-primary:hover { + background-color: #6ea8fe; + color: #000; + } + + .btn-outline-secondary { + color: #adb5bd; + border-color: #6c757d; + } + + .btn-outline-secondary:hover { + background-color: #6c757d; + color: #fff; + } + + /* Alert adjustments */ + .alert-info { + background-color: #031633; + border-color: #055160; + color: #6edff6; + } + + /* Badge colors should remain readable */ + .badge { + filter: brightness(1.2); + } + + /* Fix checkbox visibility */ + .form-check-input { + background-color: #343a40; + border-color: #6c757d; + } + + .form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; + } +} + +/* Accessibility */ +.favorite-btn:focus, +.series-btn:focus, +.btn:focus { + outline: 2px solid #007bff; + outline-offset: 2px; +} + +.form-check-input:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +/* Print Styles */ +@media print { + .filter-panel, + .series-panel, + .dashboard-header .btn-group, + #notification-prompt, + #toast-container { + display: none !important; + } + + .conference-card { + page-break-inside: avoid; + border: 1px solid #dee2e6; + margin-bottom: 1rem; + } +} + +/* Animations */ +.conference-card { + animation: fadeIn 0.3s ease-in; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Filter Panel Scrollbar */ +.filter-panel::-webkit-scrollbar { + width: 6px; +} + +.filter-panel::-webkit-scrollbar-track { + background: #f1f1f1; +} + +.filter-panel::-webkit-scrollbar-thumb { + background: #888; + border-radius: 3px; +} + +.filter-panel::-webkit-scrollbar-thumb:hover { + background: #555; +} diff --git a/static/css/deadlines.css b/static/css/deadlines.css index 79cd1a143fe..e564be2961d 100644 --- a/static/css/deadlines.css +++ b/static/css/deadlines.css @@ -1,306 +1,658 @@ body { - font-size: 16px; - line-height: 23px; - font-weight: 300; - -webkit-font-smoothing: subpixel-antialiased; + font-size: 16px; + line-height: 23px; + font-weight: 300; + -webkit-font-smoothing: subpixel-antialiased; } body *::selection { - background: #e74c3c; - color: #fff; + background: #e74c3c; + color: #fff; } .container { - max-width: 980px; + max-width: 980px; } .top-strip { - background-color: #333; - height: 0.25em; - width: 100%; + background-color: #333; + height: 0.25em; + width: 100%; } h1, h2, h3 { - /* font-weight: 300; */ + /* font-weight: 300; */ } h1 { - margin: 0 0 10px; - font-size: 30px; - line-height: 35px; + margin: 0 0 10px; + font-size: 30px; + line-height: 35px; } h2 { - margin: 0 0 10px; - font-size: 25px; - line-height: 30px; + margin: 0 0 10px; + font-size: 25px; + line-height: 30px; } h3 { - margin: 0; - font-size: 20px; - line-height: 25px; + margin: 0; + font-size: 20px; + line-height: 25px; } .page-header { - margin-top: 20px; - margin-bottom: 20px; + margin-top: 0px; + margin-bottom: 20px; + background-color: #f8f9fa; + padding: 20px 0; +} +.display-4 { + font-size: 2.5rem; +} +.lead { + font-size: 1.25rem; + font-weight: 300; } #conf-title.page-header { - border-bottom: none; + border-bottom: none; } #conf-full-name { - margin-bottom: 5px; + margin-bottom: 5px; } p.authors { - margin-bottom: 5px; - color: #808080; - font-size: 20px; + margin-bottom: 5px; + color: #808080; + font-size: 20px; } p.authors a { - border-color: #dedede; + border-color: #dedede; } img { - max-width: 100%; + max-width: 100%; } p { - text-align: justify; + text-align: justify; } a { - text-decoration: none; - border-bottom: 1px solid #ccc; - color: inherit; + text-decoration: none; + border-bottom: 1px solid #ccc; + color: inherit; } p.lead.authors a { - border-bottom: none; + border-bottom: none; } a:hover, a:focus { - color: inherit; - text-decoration: none; + color: inherit; + text-decoration: none; } .thumb { - margin: 20px 0; - border: 1px solid #808080; + margin: 20px 0; + border: 1px solid #808080; } pre { - color: #333; - font-size: 12px; - line-height: 17px; + color: #333; + font-size: 12px; + line-height: 17px; } footer { - font-size: 13px; + text-align: center; + margin-top: 3rem; + padding-top: 1rem; + color: #6c757d; + background: #343a40; + color: white; +} + +footer a { + color: #ffde57; +} + +footer a:hover { + color: #0097e6; +} + +footer .row { + padding: 0.5rem; +} + +footer .row * { + text-align: center !important; +} + +.social-links { + display: flex; + justify-content: center; + gap: 1.5rem; + margin: 1rem auto; } .conf-row { - margin-bottom: 5px; + margin-bottom: 5px; } .conf-title, .conf-title-small, .conf-title-icon { - font-size: 20px; - font-weight: 400; - + font-size: 20px; + font-weight: 400; } .conf-title-small { - display: none; + display: none; } .conf-title-icon { - white-space: nowrap; - font-size: 20px; + white-space: nowrap; + font-size: 20px; } .deadline, .meta { - font-size: 13px; + font-size: 13px; } .note { - font-size: 13px; - margin-bottom: 5px; + font-size: 13px; + margin-bottom: 5px; } .timer, .timer-small { - font-size: 20px; - font-weight: 400; + font-size: 20px; + font-weight: 400; } #confs { - margin-top: 20px; + margin-top: 20px; } .timer-small { - display: none; + display: none; } .conf-timer { - font-size: 72px; - color: #444; - margin-top: 40px; - margin-bottom: 0.5em; + font-size: 72px; + color: #444; + margin-top: 40px; + margin-bottom: 0.5em; +} + +#conf-key-facts, +#conf-deadlines, +#conf-share-links { + margin-bottom: 1em; +} + +#conf-share-links { + font-size: 12px; +} + +#conf-deadline-timer #cfp-timer.conf-timer { + margin-top: 15px; + line-height: 100%; + margin-bottom: 10px; +} + +/* Countdown urgency states */ +.countdown-display[data-urgency="medium"] { + color: #b8860b; } -#conf-key-facts { - margin-bottom: 10px; +.countdown-display[data-urgency="high"] { + color: #e67e22; +} + +.countdown-display[data-urgency="critical"] { + color: #e74c3c; + font-weight: 500; +} + +.countdown-display.deadline-passed { + color: #999; +} + +@media (prefers-color-scheme: dark) { + .countdown-display[data-urgency="medium"] { + color: #f0c040; + } + + .countdown-display[data-urgency="high"] { + color: #f39c12; + } + + .countdown-display[data-urgency="critical"] { + color: #ff6b6b; + } } .conf-sub { - cursor: pointer; + cursor: pointer; } .conf-sub::selection { - background: #0097e6; + background: #0097e6; } -#conf-sort-order-checkbox, +#conf-sort-order-checkbox, #cfp-sort-order-checkbox { - text-align: right; - font-size: 14px; - padding-top: 5px; + text-align: right; + font-size: 14px; + padding-top: 5px; } -#conf-sort-order-checkbox input[type="checkbox"]:checked:after, -#cfp-sort-order-checkbox input[type="checkbox"]:checked:after { - background-color: #0097e6; - border-color: #0097e6; - } - -#cfp-sort-order-checkbox input[type="checkbox"]:after, -#cfp-sort-order-checkbox input[type="checkbox"]:focus:after, -#conf-sort-order-checkbox input[type="checkbox"]:after, -#conf-sort-order-checkbox input[type="checkbox"]:focus:after { - border-color: #0097e6; +#conf-sort-order-checkbox input[type='checkbox']:checked:after, +#cfp-sort-order-checkbox input[type='checkbox']:checked:after { + background-color: #0097e6; + border-color: #0097e6; } -.filter-label { - text-align: right; +#cfp-sort-order-checkbox input[type='checkbox']:after, +#cfp-sort-order-checkbox input[type='checkbox']:focus:after, +#conf-sort-order-checkbox input[type='checkbox']:after, +#conf-sort-order-checkbox input[type='checkbox']:focus:after { + border-color: #0097e6; } - -.pwc-link { - text-decoration: none; - border: none; - vertical-align: middle; +.filter-label { + text-align: right; } -.pwc-link:hover { - border-bottom: 1px solid #1198b2; +.brand-link { + text-decoration: none; + border: none; + vertical-align: middle; } -.icon-inner { - width: .95em; - height: .95em; - display: inline-block; - vertical-align: middle; - position: relative; - fill: currentColor; +.brand-link:hover { + border-bottom: 1px solid #1198b2; } -.twitter-github-icons { - line-height: 16px; +.icon-inner { + width: 0.95em; + height: 0.95em; + display: inline-block; + vertical-align: middle; + position: relative; + fill: currentColor; } -#past-events-title, #past-cfps-title { - padding-bottom: 15px; - border-bottom: 2px solid #bb2d3b; +#past-events-title, +#past-cfps-title { + padding-bottom: 15px; + border-bottom: 2px solid #bb2d3b; } .badge-link { - vertical-align: middle; - margin-bottom: 3px; - margin-left: 2px; - margin-right: 2px; + vertical-align: middle; + margin-bottom: 3px; + margin-left: 2px; + margin-right: 2px; } - .badge-danger { - background-color: #bb2d3b; + background-color: #bb2d3b; } @media only screen and (max-width: 768px) { - .conf-timer { - font-size: 64px; - } - .calendar { - margin-bottom: 10px; - } - .filter-label { - text-align: left; - } + .conf-timer { + font-size: 64px; + } + .calendar { + margin-bottom: 10px; + } + .filter-label { + text-align: left; + } } @media only screen and (max-width: 576px) { - .conf-timer { - font-size: 36px; - } - .conf-place { - display: none; - } - .conf-date { - display: none; - } - .note { - display: none; - } - .conf-row { - margin-bottom: 7px; - } - .timer { - display: none; - } - .timer-small { - text-align: right; - display: grid; - } - .conf-title { - display: none; - } - .conf-title-small { - display: inline; - } - + .conf-timer { + font-size: 36px; + } + .conf-place { + display: none; + } + .conf-date { + display: none; + } + .note { + display: none; + } + .conf-row { + margin-bottom: 7px; + } + .timer { + display: none; + } + .timer-small { + text-align: right; + display: grid; + } + .conf-title { + display: none; + } + .conf-title-small { + display: inline; + } } @media only screen and (max-width: 375px) { - .conf-timer { - font-size: 28px; - } + .conf-timer { + font-size: 28px; + } } .checkbox { - font-size: 12px; + font-size: 12px; } .calendar { - font-size: 12px; - margin-top: 3px; + font-size: 12px; + margin-top: 3px; } .calendar img { - margin-right: 5px; + margin-right: 5px; } .ind-cal { - margin: 0 5px; + margin: 0 5px; } .calendar img { - height: 20px; + height: 20px; +} + +#breadcrumbs ol { + list-style: none; + padding: 0; + margin: 0; + display: inline; +} + +#breadcrumbs li { + display: inline; +} + +#breadcrumbs li + li::before { + content: " / "; + color: #808080; +} + +#breadcrumbs a { + margin-top: 1rem; + text-decoration: none; + font-size: 0.7rem; + color: #808080; +} + +#breadcrumbs a:hover { + text-decoration: dashed; + color: #fff; +} + +.social-icon { + display: inline-block; + margin: 0; + font-size: 2rem; + color: #666; + transition: color 0.3s ease; +} + +.social-icon:hover { + color: #333; +} + +/* Mastodon specific color */ +.fa-mastodon:hover { + color: #6364ff; +} + +/* Bluesky specific styling */ +.fa-bluesky:hover { + color: #0085ff; +} + +#left-snek { + right: 15rem; + z-index: 1000; + transform: scale(5) translateY(0.5rem); + transition: bottom ease 0.5s; +} + +#left-snek:hover { + bottom: 0em; +} + +#left-snek.annoyed { + animation: runAway 3s ease-in-out; + transition: opacity 1s ease-out; + transition-delay: 2s; + opacity: 0; +} + +#right-snek.annoyed { + transition: transform 1s ease-out; + transition-delay: 2s; + transform: scale(5.5, 5.5); +} + +#right-snek { + right: 4rem; + z-index: 1001; + transform: scale(-5.5, 5.5); + transition: bottom ease 0.5s; +} + +#right-snek:hover { + bottom: 0em; +} + +#smol-snek-body { + z-index: 1003; + position: absolute; + bottom: 0; + right: 0; + transform: scale(-3.5, 3.5) translateY(0.5rem); +} + +#smol-snek-tongue { + z-index: 1002; + position: absolute; + bottom: 2.7rem; + right: -0.8rem; + transform: scale(0.7); +} + +#smol-snek-all { + z-index: 1003; + right: 3rem; + transition: bottom ease 0.5s; +} + +#smol-snek-all:hover { + bottom: 0.5em; +} + +.location-pin { + position: fixed; + opacity: 0; + bottom: -5rem; + transition: bottom 5.5s ease-out; + filter: drop-shadow(1px 1px 1px rgba(0, 0, 0, 0.3)); +} + +.location-pin.visible { + opacity: 1; + bottom: 1rem; +} + +.snek-speech-bubble { + position: fixed; + right: 2rem; + bottom: 5.5rem; + max-width: 220px; + padding: 0.6rem 1.75rem 0.6rem 0.9rem; + background: #fff; + color: #333; + border: 2px solid #646464; + border-radius: 0.9rem; + box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.25); + font-size: 0.85rem; + line-height: 1.3; + z-index: 1004; + opacity: 0; + transform: translateY(0.5rem); + transition: opacity 0.4s ease-out, transform 0.4s ease-out; +} + +.snek-speech-bubble.visible { + opacity: 1; + transform: translateY(0); +} + +.snek-speech-bubble::after { + content: ''; + position: absolute; + bottom: -12px; + right: 24px; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 12px solid #646464; +} + +.snek-speech-bubble::before { + content: ''; + position: absolute; + bottom: -8px; + right: 26px; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 10px solid #fff; + z-index: 1; +} + +.snek-speech-link { + color: inherit; + text-decoration: none; +} + +.snek-speech-link:hover, +.snek-speech-link:focus { + color: #4584b6; + text-decoration: underline; +} + +.snek-speech-close { + position: absolute; + top: 1px; + right: 6px; + background: none; + border: none; + font-size: 1.1rem; + line-height: 1; + cursor: pointer; + color: #888; + padding: 0 0.25rem; +} + +.snek-speech-close:hover, +.snek-speech-close:focus { + color: #333; +} + +#right-snek.wiggle { + bottom: 2rem; +} + +#smol-snek-all.wiggle { + bottom: 1.5rem; +} + +@keyframes runAway { + 0% { + transform: scale(5) translateX(0) rotate(0deg); + } + 20% { + transform: scale(5) translateX(-20px) rotate(-5deg); + } + 40% { + transform: scale(5) translateX(-40px) rotate(5deg); + } + 100% { + transform: scale(5) translateX(-100vw) rotate(-10deg); + } +} + +/* Only show on medium screens and up (≥768px) */ +@media (max-width: 767.98px) { + .location-pin, + .snek-speech-bubble { + display: none !important; + } +} + +/* Print styles */ +@media print { + .location-pin, + .snek-speech-bubble, + .skip-nav, + .navbar, + .conference-actions, + .action-indicator, + .action-popover, + .mobile-action-bookmark, + .calendar, + #conf-share-links, + #twitter-widget, + .mastodon-feed, + footer { + display: none !important; + } + + body { + font-size: 12pt; + color: #000; + background: #fff; + } + + a { + color: #000; + text-decoration: underline; + } + + a[href]::after { + content: " (" attr(href) ")"; + font-size: 0.8em; + color: #555; + } + + a[href^="#"]::after, + a[href^="javascript:"]::after { + content: ""; + } + + .conf-timer { + font-size: 24pt; + } + + .container { + max-width: 100%; + } } diff --git a/static/css/js-year-calendar.min.css b/static/css/js-year-calendar.min.css index efae7b44a11..58538187d11 100644 --- a/static/css/js-year-calendar.min.css +++ b/static/css/js-year-calendar.min.css @@ -1 +1 @@ -.calendar{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr;overflow-x:hidden;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.calendar:after{clear:both;content:"";display:block}.calendar .calendar-rtl{direction:rtl}.calendar .calendar-rtl .calendar-rtl table tr td span{float:right}.calendar table{margin:auto;border-spacing:0}.calendar table td,.calendar table th{text-align:center;width:20px;height:20px;border:none;padding:4px 5px;font-size:12px}.calendar .calendar-header{width:100%;margin-bottom:20px;border:1px solid #ddd}.calendar .calendar-header table{width:100%}.calendar .calendar-header table th{font-size:22px;padding:5px 10px;cursor:pointer}.calendar .calendar-header table th:hover{background:#eee}.calendar .calendar-header table th.disabled,.calendar .calendar-header table th.disabled:hover{background:0 0;cursor:default;color:#fff}.calendar .calendar-header table th.next,.calendar .calendar-header table th.prev{width:20px}.calendar .calendar-header .year-title{font-weight:700;text-align:center;height:20px;width:auto}.calendar .calendar-header .year-neighbor{opacity:.4}@media (max-width:991px){.calendar .calendar-header .year-neighbor{display:none}}.calendar .calendar-header .year-neighbor2{opacity:.2}@media (max-width:767px){.calendar .calendar-header .year-neighbor2{display:none}}.calendar .months-container{width:100%;display:none;flex-wrap:wrap}.calendar .months-container .month-container{float:left;text-align:center;padding:0}.calendar .months-container .month-container.month-2{width:16.66666667%}.calendar .months-container .month-container.month-3{width:25%}.calendar .months-container .month-container.month-4{width:33.33333333%}.calendar .months-container .month-container.month-6{width:50%}.calendar .months-container .month-container.month-12{width:100%}.calendar table.month th.month-title{font-size:16px;padding-bottom:5px}.calendar table.month th.day-header{font-size:14px}.calendar table.month tr td,.calendar table.month tr th{padding:0}.calendar table.month tr td.hidden,.calendar table.month tr th.hidden{display:none}.calendar table.month td.week-number{cursor:default;font-weight:700;border-right:1px solid #eee;padding:5px}.calendar table.month td.day.round-left{-webkit-border-radius:8px 0 0 8px;-moz-border-radius:8px 0 0 8px;border-radius:8px 0 0 8px}.calendar table.month td.day.round-right{webkit-border-radius:0 8px 8px 0;-moz-border-radius:0 8px 8px 0;border-radius:0 8px 8px 0}.calendar table.month td.day .day-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:5px 6px}.calendar table.month td.new,.calendar table.month td.new:hover,.calendar table.month td.old,.calendar table.month td.old:hover{background:0 0;cursor:default}.calendar table.month td.disabled,.calendar table.month td.disabled:hover{color:#ddd}.calendar table.month td.disabled .day-content:hover,.calendar table.month td.disabled:hover .day-content:hover{background:0 0;cursor:default}.calendar table.month td.range .day-content{background:rgba(0,0,0,.2);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.calendar table.month td.range.range-start .day-content{border-top-left-radius:4px;border-bottom-left-radius:4px}.calendar table.month td.range.range-end .day-content{border-top-right-radius:4px;border-bottom-right-radius:4px}.calendar .calendar-loading-container{position:relative;text-align:center;min-height:200px}.calendar .calendar-loading-container .calendar-loading{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)}.calendar .calendar-spinner{margin:20px auto;width:80px;text-align:center}.calendar .calendar-spinner>div{width:16px;height:16px;margin:5px;background-color:#333;border-radius:100%;display:inline-block;-webkit-animation:sk-bouncedelay 1s infinite ease-in-out both;animation:sk-bouncedelay 1s infinite ease-in-out both}.calendar .calendar-spinner>div.bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.calendar .calendar-spinner>div.bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}.calendar-context-menu,.calendar-context-menu .submenu{border:1px solid #ddd;background-color:#fff;box-shadow:2px 2px 5px rgba(0,0,0,.2);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,.2);position:absolute;display:none}.calendar-context-menu .item{position:relative}.calendar-context-menu .item .content{padding:5px 10px;cursor:pointer;display:table;width:100%;white-space:nowrap;box-sizing:border-box}.calendar-context-menu .item .content:hover{background:#eee}.calendar-context-menu .item .content .text{display:table-cell}.calendar-context-menu .item .content .arrow{display:table-cell;padding-left:10px;text-align:right}.calendar-context-menu .item .submenu{top:-1px}.calendar-context-menu .item .submenu:not(.open-left){left:100%}.calendar-context-menu .item .submenu.open-left{right:100%}.calendar-context-menu .item:hover>.submenu{display:block}.table-striped .calendar table.month tr td,.table-striped .calendar table.month tr th{background-color:transparent}table.month td.day .day-content:hover{background:rgba(0,0,0,.2);cursor:pointer}@-webkit-keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}} \ No newline at end of file +.calendar{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr;overflow-x:hidden;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.calendar:after{clear:both;content:"";display:block}.calendar .calendar-rtl{direction:rtl}.calendar .calendar-rtl .calendar-rtl table tr td span{float:right}.calendar table{margin:auto;border-spacing:0}.calendar table td,.calendar table th{text-align:center;width:20px;height:20px;border:none;padding:4px 5px;font-size:12px}.calendar .calendar-header{width:100%;margin-bottom:20px;border:1px solid #ddd}.calendar .calendar-header table{width:100%}.calendar .calendar-header table th{font-size:22px;padding:5px 10px;cursor:pointer}.calendar .calendar-header table th:hover{background:#eee}.calendar .calendar-header table th.disabled,.calendar .calendar-header table th.disabled:hover{background:0 0;cursor:default;color:#fff}.calendar .calendar-header table th.next,.calendar .calendar-header table th.prev{width:20px}.calendar .calendar-header .year-title{font-weight:700;text-align:center;height:20px;width:auto}.calendar .calendar-header .year-neighbor{opacity:.4}@media (max-width:991px){.calendar .calendar-header .year-neighbor{display:none}}.calendar .calendar-header .year-neighbor2{opacity:.2}@media (max-width:767px){.calendar .calendar-header .year-neighbor2{display:none}}.calendar .months-container{width:100%;display:none;flex-wrap:wrap}.calendar .months-container .month-container{float:left;text-align:center;padding:0}.calendar .months-container .month-container.month-2{width:16.66666667%}.calendar .months-container .month-container.month-3{width:25%}.calendar .months-container .month-container.month-4{width:33.33333333%}.calendar .months-container .month-container.month-6{width:50%}.calendar .months-container .month-container.month-12{width:100%}.calendar table.month th.month-title{font-size:16px;padding-bottom:5px}.calendar table.month th.day-header{font-size:14px}.calendar table.month tr td,.calendar table.month tr th{padding:0}.calendar table.month tr td.hidden,.calendar table.month tr th.hidden{display:none}.calendar table.month td.week-number{cursor:default;font-weight:700;border-right:1px solid #eee;padding:5px}.calendar table.month td.day.round-left{-webkit-border-radius:8px 0 0 8px;-moz-border-radius:8px 0 0 8px;border-radius:8px 0 0 8px}.calendar table.month td.day.round-right{webkit-border-radius:0 8px 8px 0;-moz-border-radius:0 8px 8px 0;border-radius:0 8px 8px 0}.calendar table.month td.day .day-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:5px 6px}.calendar table.month td.new,.calendar table.month td.new:hover,.calendar table.month td.old,.calendar table.month td.old:hover{background:0 0;cursor:default}.calendar table.month td.disabled,.calendar table.month td.disabled:hover{color:#ddd}.calendar table.month td.disabled .day-content:hover,.calendar table.month td.disabled:hover .day-content:hover{background:0 0;cursor:default}.calendar table.month td.range .day-content{background:rgba(0,0,0,.2);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.calendar table.month td.range.range-start .day-content{border-top-left-radius:4px;border-bottom-left-radius:4px}.calendar table.month td.range.range-end .day-content{border-top-right-radius:4px;border-bottom-right-radius:4px}.calendar .calendar-loading-container{position:relative;text-align:center;min-height:200px}.calendar .calendar-loading-container .calendar-loading{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)}.calendar .calendar-spinner{margin:20px auto;width:80px;text-align:center}.calendar .calendar-spinner>div{width:16px;height:16px;margin:5px;background-color:#333;border-radius:100%;display:inline-block;-webkit-animation:sk-bouncedelay 1s infinite ease-in-out both;animation:sk-bouncedelay 1s infinite ease-in-out both}.calendar .calendar-spinner>div.bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.calendar .calendar-spinner>div.bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}.calendar-context-menu,.calendar-context-menu .submenu{border:1px solid #ddd;background-color:#fff;box-shadow:2px 2px 5px rgba(0,0,0,.2);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,.2);position:absolute;display:none}.calendar-context-menu .item{position:relative}.calendar-context-menu .item .content{padding:5px 10px;cursor:pointer;display:table;width:100%;white-space:nowrap;box-sizing:border-box}.calendar-context-menu .item .content:hover{background:#eee}.calendar-context-menu .item .content .text{display:table-cell}.calendar-context-menu .item .content .arrow{display:table-cell;padding-left:10px;text-align:right}.calendar-context-menu .item .submenu{top:-1px}.calendar-context-menu .item .submenu:not(.open-left){left:100%}.calendar-context-menu .item .submenu.open-left{right:100%}.calendar-context-menu .item:hover>.submenu{display:block}.table-striped .calendar table.month tr td,.table-striped .calendar table.month tr th{background-color:transparent}table.month td.day .day-content:hover{background:rgba(0,0,0,.2);cursor:pointer}@-webkit-keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}} diff --git a/static/css/mastodon.css b/static/css/mastodon.css new file mode 100644 index 00000000000..9a5968f47be --- /dev/null +++ b/static/css/mastodon.css @@ -0,0 +1,20 @@ +.mastodon-feed { + font-family: Arial, sans-serif; +} + +.mastodon-feed-link { + display: inline-block; + margin: 0.35rem 0; +} + +.timeline-item { + position: relative; + margin-bottom: 20px; + } + +@media only screen and (min-width: 992px) { + .mastodon-feed { + max-height: 72vh; + overflow-y: auto; + } +} diff --git a/static/css/mobile-fixes.css b/static/css/mobile-fixes.css new file mode 100644 index 00000000000..a0e6ef0348c --- /dev/null +++ b/static/css/mobile-fixes.css @@ -0,0 +1,347 @@ +/* Mobile Responsiveness Fixes for Python Deadlines */ + +/* ================================================================= + 1. NAVBAR COLLAPSE FIX + ================================================================= */ + +/* Ensure navbar toggle button is visible and properly styled */ +.navbar-toggler { + border: 1px solid rgba(255, 255, 255, 0.3); + padding: 0.25rem 0.5rem; +} + +.navbar-toggler:focus { + outline: none; + box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.25); +} + +/* Fix navbar collapse animation */ +.navbar-collapse { + transition: height 0.35s ease; +} + +.navbar-collapse.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} + +/* Ensure mobile menu items stack properly */ +@media (max-width: 991px) { + .navbar-collapse { + background-color: #343a40; + padding: 1rem; + margin-top: 0.5rem; + border-radius: 0.25rem; + } + + .navbar-nav { + margin-bottom: 1rem; + } + + .navbar-nav .nav-link { + padding: 0.5rem 0; + border-bottom: 1px solid rgba(255, 255, 255, 0.1) !important; + } + + .navbar-nav .dropdown-menu { + position: static; + float: none; + width: 100%; + margin-top: 0.125rem; + background-color: rgba(52, 58, 64, 0.95); + } + + /* Search form in mobile menu */ + .navbar-collapse .form-inline { + flex-direction: column; + align-items: stretch; + } + + .navbar-collapse .form-inline input { + margin-bottom: 0.5rem; + width: 100%; + } + + .navbar-collapse .form-inline button { + width: 100%; + } + + /* Language selector in mobile */ + .navbar-nav.ml-auto { + margin-left: 0 !important; + border-top: 1px solid rgba(255, 255, 255, 0.1); + padding-top: 1rem; + } +} + +/* ================================================================= + 2. CONFERENCE TIMER DISPLAY FIX + ================================================================= */ + +/* Fix timer overflow on mobile */ +@media (max-width: 768px) { + .conf-timer { + font-size: 48px !important; + word-break: break-word; + line-height: 1.2; + } + + .timer, .timer-small { + font-size: 16px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + /* Ensure timer doesn't overlap with other elements */ + #cfp-timer { + padding: 0 15px; + margin-bottom: 20px; + } +} + +@media (max-width: 576px) { + .conf-timer { + font-size: 32px !important; + } + + .timer-small { + font-size: 14px; + text-align: left; + display: block; + } + + /* Stack timer elements vertically on very small screens */ + .deadline .timer, + .deadline .timer-small { + display: block; + margin-top: 5px; + } +} + +@media (max-width: 375px) { + .conf-timer { + font-size: 24px !important; + } +} + +/* ================================================================= + 3. MULTISELECT DROPDOWN OVERFLOW FIX + ================================================================= */ + +/* Fix multiselect dropdown overflow on mobile */ +.multiselect-container { + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; +} + +@media (max-width: 768px) { + .multiselect-container { + position: fixed !important; + left: 50% !important; + transform: translateX(-50%); + width: 90vw !important; + max-width: 350px; + z-index: 1050; + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + } + + .multiselect.dropdown-toggle { + width: 100%; + text-align: left; + } + + .multiselect-container .checkbox { + padding: 0.5rem 1rem; + } + + .multiselect-container .checkbox label { + display: flex; + align-items: center; + width: 100%; + } + + .multiselect-container .checkbox input[type="checkbox"] { + margin-right: 0.5rem; + } +} + +/* ================================================================= + 4. CONFERENCE CARDS MOBILE LAYOUT + ================================================================= */ + +@media (max-width: 576px) { + /* Stack conference info vertically */ + .conf-row { + flex-direction: column; + } + + .conf-row .col-6 { + width: 100%; + max-width: 100%; + flex: 0 0 100%; + } + + /* Improve spacing between elements */ + .ConfItem { + padding: 15px 10px; + border-bottom: 1px solid #dee2e6; + } + + .ConfItem hr { + display: none; + } + + /* Make conference title more prominent on mobile */ + .conf-title-small { + font-size: 18px; + font-weight: 500; + margin-bottom: 10px; + line-height: 1.3; + } + + /* Better badge layout on mobile */ + .conf-sub { + margin: 2px; + padding: 0.25rem 0.5rem; + font-size: 0.75rem; + } + + /* Calendar buttons on mobile */ + .calendar { + display: flex; + flex-wrap: wrap; + gap: 5px; + margin-top: 10px; + } + + .calendar a { + flex: 1; + min-width: 80px; + text-align: center; + padding: 5px; + background: #f8f9fa; + border-radius: 3px; + } +} + +/* ================================================================= + 5. GENERAL MOBILE IMPROVEMENTS + ================================================================= */ + +/* Improve touch targets for mobile */ +@media (pointer: coarse) { + a, button, .btn, .conf-sub, .dropdown-item { + min-height: 44px; + min-width: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + } + + .conf-sub { + padding: 0.5rem 0.75rem; + } +} + +/* Fix horizontal scrolling issues */ +@media (max-width: 768px) { + body { + overflow-x: hidden; + } + + .container { + padding-left: 15px; + padding-right: 15px; + } + + .row { + margin-left: -15px; + margin-right: -15px; + } +} + +/* Improve readability on small screens */ +@media (max-width: 576px) { + body { + font-size: 14px; + line-height: 1.6; + } + + h1 { + font-size: 24px; + line-height: 1.3; + } + + h2 { + font-size: 20px; + line-height: 1.3; + } + + h3 { + font-size: 18px; + line-height: 1.3; + } + + .meta, .deadline { + font-size: 12px; + } +} + +/* ================================================================= + 6. ACCESSIBILITY IMPROVEMENTS + ================================================================= */ + +/* Skip navigation link for screen readers */ +.skip-nav { + position: absolute; + top: -40px; + left: 0; + background: #343a40; + color: white; + padding: 8px; + text-decoration: none; + z-index: 100; +} + +.skip-nav:focus { + top: 0; +} + +/* Focus styles for better keyboard navigation */ +a:focus, +button:focus, +input:focus, +select:focus, +textarea:focus, +.conf-sub:focus { + outline: 2px solid #0097e6; + outline-offset: 2px; +} + +/* High contrast mode support */ +@media (prefers-contrast: high) { + .conf-sub { + border: 1px solid currentColor; + } + + .timer { + font-weight: bold; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } + + .navbar-collapse { + transition: none; + } +} diff --git a/static/css/search.css b/static/css/search.css new file mode 100644 index 00000000000..cef473253c8 --- /dev/null +++ b/static/css/search.css @@ -0,0 +1,12 @@ +#search-box { + width: 6em; + transition: width 0.5s ease; +} +#search-box:focus { + width: 15em; +} +@media (prefers-reduced-motion: reduce) { + #search-box { + transition: none; + } +} diff --git a/static/css/theme-variables.css b/static/css/theme-variables.css new file mode 100644 index 00000000000..5e94fcc619f --- /dev/null +++ b/static/css/theme-variables.css @@ -0,0 +1,325 @@ +/** + * Theme Variables for Python Deadlines + * Supports light and dark modes with CSS custom properties + */ + +/* ================================================================= + ROOT VARIABLES - LIGHT MODE (DEFAULT) + ================================================================= */ +:root { + /* Primary Colors */ + --color-primary: #0097e6; + --color-primary-hover: #0077b6; + --color-secondary: #e74c3c; + --color-success: #10ac84; + --color-warning: #ff9f43; + --color-danger: #bb2d3b; + --color-info: #3498db; + + /* Background Colors */ + --bg-primary: #ffffff; + --bg-secondary: #f8f9fa; + --bg-tertiary: #e9ecef; + --bg-dark: #343a40; + --bg-navbar: #343a40; + --bg-footer: #343a40; + --bg-card: #ffffff; + --bg-hover: #f8f9fa; + + /* Text Colors */ + --text-primary: #212529; + --text-secondary: #6c757d; + --text-muted: #808080; + --text-light: #f8f9fa; + --text-dark: #212529; + --text-on-dark: #ffffff; + --text-link: inherit; + --text-link-hover: #0097e6; + + /* Border Colors */ + --border-primary: #dee2e6; + --border-secondary: #ced4da; + --border-light: #e9ecef; + --border-dark: #495057; + + /* Conference Type Colors */ + --conf-py: #4B8BBE; + --conf-scipy: #70163C; + --conf-data: #341f97; + --conf-web: #ee5253; + --conf-biz: #ff9f43; + --conf-geo: #310c0c; + --conf-camp: #511868; + --conf-day: #10ac84; + + /* Timer Colors */ + --timer-text: #444444; + --timer-expired: #bb2d3b; + + /* Shadow and Overlay */ + --shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --overlay: rgba(0, 0, 0, 0.5); + + /* Transitions */ + --transition-speed: 0.3s; + --transition-function: ease-in-out; +} + +/* ================================================================= + DARK MODE VARIABLES + ================================================================= */ +[data-theme="dark"] { + /* Primary Colors */ + --color-primary: #52c7ff; + --color-primary-hover: #2eb8ff; + --color-secondary: #ff6b6b; + --color-success: #51cf66; + --color-warning: #ffa94d; + --color-danger: #ff6b6b; + --color-info: #74c0fc; + + /* Background Colors */ + --bg-primary: #1a1a1a; + --bg-secondary: #2d2d2d; + --bg-tertiary: #3a3a3a; + --bg-dark: #0d0d0d; + --bg-navbar: #0d0d0d; + --bg-footer: #0d0d0d; + --bg-card: #2d2d2d; + --bg-hover: #3a3a3a; + + /* Text Colors */ + --text-primary: #e9ecef; + --text-secondary: #adb5bd; + --text-muted: #868e96; + --text-light: #e9ecef; + --text-dark: #e9ecef; + --text-on-dark: #e9ecef; + --text-link: #74c0fc; + --text-link-hover: #52c7ff; + + /* Border Colors */ + --border-primary: #495057; + --border-secondary: #343a40; + --border-light: #495057; + --border-dark: #212529; + + /* Conference Type Colors (adjusted for dark mode) */ + --conf-py: #6fa9dc; + --conf-scipy: #b85c7a; + --conf-data: #6b5fbf; + --conf-web: #ff7979; + --conf-biz: #ffb26b; + --conf-geo: #8b5a5a; + --conf-camp: #9b6fb8; + --conf-day: #52d3aa; + + /* Timer Colors */ + --timer-text: #e9ecef; + --timer-expired: #ff6b6b; + + /* Shadow and Overlay */ + --shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.3); + --shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.4); + --shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.5); + --overlay: rgba(0, 0, 0, 0.7); +} + +/* ================================================================= + SYSTEM PREFERENCE SUPPORT + ================================================================= */ +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) { + /* Copy dark mode variables here for system preference */ + --color-primary: #52c7ff; + --color-primary-hover: #2eb8ff; + --color-secondary: #ff6b6b; + --color-success: #51cf66; + --color-warning: #ffa94d; + --color-danger: #ff6b6b; + --color-info: #74c0fc; + + --bg-primary: #1a1a1a; + --bg-secondary: #2d2d2d; + --bg-tertiary: #3a3a3a; + --bg-dark: #0d0d0d; + --bg-navbar: #0d0d0d; + --bg-footer: #0d0d0d; + --bg-card: #2d2d2d; + --bg-hover: #3a3a3a; + + --text-primary: #e9ecef; + --text-secondary: #adb5bd; + --text-muted: #868e96; + --text-light: #e9ecef; + --text-dark: #e9ecef; + --text-on-dark: #e9ecef; + --text-link: #74c0fc; + --text-link-hover: #52c7ff; + + --border-primary: #495057; + --border-secondary: #343a40; + --border-light: #495057; + --border-dark: #212529; + + --conf-py: #6fa9dc; + --conf-scipy: #b85c7a; + --conf-data: #6b5fbf; + --conf-web: #ff7979; + --conf-biz: #ffb26b; + --conf-geo: #8b5a5a; + --conf-camp: #9b6fb8; + --conf-day: #52d3aa; + + --timer-text: #e9ecef; + --timer-expired: #ff6b6b; + + --shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.3); + --shadow-md: 0 0.5rem 1rem rgba(0, 0, 0, 0.4); + --shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.5); + --overlay: rgba(0, 0, 0, 0.7); + } +} + +/* ================================================================= + APPLY VARIABLES TO ELEMENTS + ================================================================= */ + +/* Body and Main Elements */ +body { + background-color: var(--bg-primary); + color: var(--text-primary); + transition: background-color var(--transition-speed) var(--transition-function), + color var(--transition-speed) var(--transition-function); +} + +/* Navigation */ +.navbar-dark { + background-color: var(--bg-navbar) !important; +} + +.navbar-dark .navbar-nav .nav-link { + color: var(--text-on-dark); +} + +.navbar-dark .navbar-nav .nav-link:hover { + color: var(--color-primary); +} + +/* Cards and Containers */ +.container { + background-color: transparent; +} + +.card, .ConfItem { + background-color: var(--bg-card); + border-color: var(--border-primary); +} + +.ConfItem:hover { + background-color: var(--bg-hover); +} + +/* Page Header */ +.page-header { + background-color: var(--bg-secondary); + color: var(--text-primary); +} + +/* Footer */ +footer { + background-color: var(--bg-footer); + color: var(--text-on-dark); +} + +footer a { + color: var(--color-primary); +} + +footer a:hover { + color: var(--color-primary-hover); +} + +/* Links */ +a { + color: var(--text-link); + border-bottom-color: var(--border-secondary); +} + +a:hover { + color: var(--text-link-hover); +} + +/* Timers */ +.timer, .timer-small, .conf-timer { + color: var(--timer-text); +} + +.deadline-passed, .timer.expired { + color: var(--timer-expired); +} + +/* Badges */ +.badge-light { + background-color: var(--bg-tertiary); + color: var(--text-primary); + border: 1px solid var(--border-primary); +} + +/* Conference Type Colors */ +.PY-tag { color: var(--conf-py) !important; } +.SCIPY-tag { color: var(--conf-scipy) !important; } +.DATA-tag { color: var(--conf-data) !important; } +.WEB-tag { color: var(--conf-web) !important; } +.BIZ-tag { color: var(--conf-biz) !important; } +.GEO-tag { color: var(--conf-geo) !important; } +.CAMP-tag { color: var(--conf-camp) !important; } +.DAY-tag { color: var(--conf-day) !important; } + +/* Forms */ +.form-control { + background-color: var(--bg-secondary); + color: var(--text-primary); + border-color: var(--border-primary); +} + +.form-control:focus { + background-color: var(--bg-primary); + color: var(--text-primary); + border-color: var(--color-primary); +} + +/* Buttons */ +.btn-outline-dark { + color: var(--text-primary); + border-color: var(--border-primary); +} + +.btn-outline-dark:hover { + background-color: var(--bg-hover); + border-color: var(--color-primary); +} + +/* Dropdown Menus */ +.dropdown-menu { + background-color: var(--bg-card); + border-color: var(--border-primary); +} + +.dropdown-item { + color: var(--text-primary); +} + +.dropdown-item:hover { + background-color: var(--bg-hover); + color: var(--text-primary); +} + +/* Transitions for smooth theme switching */ +* { + transition: background-color var(--transition-speed) var(--transition-function), + color var(--transition-speed) var(--transition-function), + border-color var(--transition-speed) var(--transition-function); +} diff --git a/static/img/002-home2.svg b/static/img/002-home2.svg new file mode 100644 index 00000000000..4e352e9e5c2 --- /dev/null +++ b/static/img/002-home2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/035-file-text.svg b/static/img/035-file-text.svg new file mode 100644 index 00000000000..8ff40ec789e --- /dev/null +++ b/static/img/035-file-text.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/060-coin-dollar.svg b/static/img/060-coin-dollar.svg new file mode 100644 index 00000000000..7ee73f17191 --- /dev/null +++ b/static/img/060-coin-dollar.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/066-lifebuoy.svg b/static/img/066-lifebuoy.svg new file mode 100644 index 00000000000..7fc2f8ba00a --- /dev/null +++ b/static/img/066-lifebuoy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/407-mastodon.svg b/static/img/407-mastodon.svg new file mode 100644 index 00000000000..67063c5c3ee --- /dev/null +++ b/static/img/407-mastodon.svg @@ -0,0 +1 @@ + diff --git a/static/img/407-twitter.svg b/static/img/407-twitter.svg new file mode 100644 index 00000000000..17811dc7930 --- /dev/null +++ b/static/img/407-twitter.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/domain.svg b/static/img/domain.svg new file mode 100644 index 00000000000..48669288387 --- /dev/null +++ b/static/img/domain.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/python-deadlines-social-preview.png b/static/img/python-deadlines-social-preview.png new file mode 100644 index 00000000000..d62a0591001 Binary files /dev/null and b/static/img/python-deadlines-social-preview.png differ diff --git a/static/img/pythondeadlines-edit.gif b/static/img/pythondeadlines-edit.gif new file mode 100644 index 00000000000..527dafcbc27 Binary files /dev/null and b/static/img/pythondeadlines-edit.gif differ diff --git a/static/js/about.js b/static/js/about.js new file mode 100644 index 00000000000..25b2464fd42 --- /dev/null +++ b/static/js/about.js @@ -0,0 +1,182 @@ +// Constants and variables +const TOTAL_SLIDES = 8; +let currentSlide = 1; +let isPresentation = false; + +// DOM elements +const body = document.body; +const slides = document.querySelectorAll('.slide'); +const prevBtn = document.getElementById('prev-slide'); +const nextBtn = document.getElementById('next-slide'); +const slideIndicator = document.getElementById('slide-indicator'); +const presentationToggle = document.getElementById('presentation-toggle'); +const slideNavigation = document.querySelector('.slide-navigation'); +const footer = document.querySelector('footer'); + +// Initialize +document.addEventListener('DOMContentLoaded', () => { + // Check URL params for presentation mode + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.get('presentation') === 'true') { + enterPresentationMode(); + } else { + // For normal viewing, show all slides + slides.forEach((slide) => (slide.style.display = 'block')); + + // Animate elements when they enter viewport + animateOnScroll(); + window.addEventListener('scroll', animateOnScroll); + } + + // Setup event listeners + presentationToggle.addEventListener('click', toggleFullScreen); + prevBtn.addEventListener('click', prevSlide); + nextBtn.addEventListener('click', nextSlide); + document.addEventListener('keydown', handleKeyPress); +}); + +// Toggle fullscreen +function toggleFullScreen() { + if (!document.fullscreenElement) { + document.documentElement + .requestFullscreen() + .then(() => enterPresentationMode()) + .catch(() => {}); + } else { + if (document.exitFullscreen) { + document + .exitFullscreen() + .then(() => exitPresentationMode()) + .catch(() => {}); + } + } +} + +// Enter presentation mode +function enterPresentationMode() { + isPresentation = true; + body.classList.add('presentation-mode'); + body.setAttribute('data-slide', currentSlide); + slideNavigation.style.display = 'flex'; + footer.style.display = 'none'; + + // Hide all slides first + slides.forEach((slide) => { + slide.style.display = 'flex'; + slide.classList.remove('active'); + }); + + // Show only current slide + showSlide(currentSlide); + + // Make all interactive elements visible immediately + document.querySelectorAll('.feature, .stat, .testimonial, .use-case').forEach((el) => { + el.classList.add('visible'); + }); +} + +// Exit presentation mode +function exitPresentationMode() { + isPresentation = false; + body.classList.remove('presentation-mode'); + slideNavigation.style.display = 'none'; + footer.style.display = 'block'; + + // Show all slides + slides.forEach((slide) => { + slide.style.display = 'block'; + slide.classList.remove('active'); + }); + + // Reset scroll position + window.scrollTo(0, 0); + + // Re-enable scroll animation + animateOnScroll(); +} + +// Show a specific slide +function showSlide(number) { + if (number < 1) number = 1; + if (number > TOTAL_SLIDES) number = TOTAL_SLIDES; + + currentSlide = number; + + if (isPresentation) { + // Update body attribute for progress bar + body.setAttribute('data-slide', currentSlide); + + // Update all slides + slides.forEach((slide, index) => { + if (index + 1 === currentSlide) { + slide.classList.add('active'); + } else { + slide.classList.remove('active'); + } + }); + + // Update slide indicator + slideIndicator.textContent = `${currentSlide}/${TOTAL_SLIDES}`; + } +} + +// Navigation functions +function nextSlide() { + if (currentSlide < TOTAL_SLIDES) { + showSlide(currentSlide + 1); + } +} + +function prevSlide() { + if (currentSlide > 1) { + showSlide(currentSlide - 1); + } +} + +// Keyboard navigation +function handleKeyPress(e) { + if (isPresentation) { + switch (e.key) { + case 'ArrowRight': + case 'ArrowDown': + case ' ': + case 'Enter': + if (currentSlide === TOTAL_SLIDES) { + exitPresentationMode(); + toggleFullScreen(); + } else { + nextSlide(); + } + break; + case 'ArrowLeft': + case 'ArrowUp': + prevSlide(); + break; + case 'Home': + showSlide(1); + break; + case 'End': + showSlide(TOTAL_SLIDES); + break; + case 'Escape': + exitPresentationMode(); + toggleFullScreen(); + break; + } + } +} + +// Animate elements when scrolling +function animateOnScroll() { + const elements = document.querySelectorAll('.feature, .stat, .testimonial, .use-case'); + + elements.forEach((element) => { + const rect = element.getBoundingClientRect(); + const windowHeight = window.innerHeight; + + // Add visible class when element is in viewport + if (rect.top < windowHeight * 0.85) { + element.classList.add('visible'); + } + }); +} diff --git a/static/js/action-bar.js b/static/js/action-bar.js new file mode 100644 index 00000000000..4e92e6cefde --- /dev/null +++ b/static/js/action-bar.js @@ -0,0 +1,612 @@ +/** + * Minimal Action Bar Handler + * Progressive disclosure design with colored line indicator + */ +(function() { + 'use strict'; + + const STORAGE_KEY = 'pythondeadlines-favorites'; // Legacy storage key for backward compatibility + const SERIES_KEY = 'pythondeadlines-series-subscriptions'; + const SAVED_CONFERENCES_KEY = 'pythondeadlines-saved-conferences'; + let currentPopover = null; + let isMobile = window.innerWidth <= 768; + + // Load saved preferences from ConferenceStateManager + function getPrefs() { + try { + // Use ConferenceStateManager if available + if (window.confManager) { + const savedEvents = window.confManager.getSavedEvents(); + const prefs = {}; + + savedEvents.forEach(conf => { + const confId = conf.id; + prefs[confId] = { saved: true }; + + // Check if series is followed + if (window.confManager.isSeriesFollowed(conf.conference)) { + prefs[confId].series = true; + } + }); + + return prefs; + } + + // Fallback to legacy storage if ConferenceStateManager not available yet + const favorites = store.get(STORAGE_KEY) || []; + const savedConferences = store.get(SAVED_CONFERENCES_KEY) || {}; + const series = store.get(SERIES_KEY) || {}; + + // Convert to our format + const prefs = {}; + favorites.forEach(confId => { + prefs[confId] = { saved: true }; + // Check if this conference's series is subscribed + const conf = savedConferences[confId]; + if (conf && conf.conference) { + const seriesName = conf.conference.toLowerCase(); + if (series[seriesName]) { + prefs[confId].series = true; + } + } + }); + + return prefs; + } catch(e) { + return {}; + } + } + + // Save preferences using ConferenceStateManager + function savePrefs(prefs) { + try { + // Use ConferenceStateManager if available + if (window.confManager) { + // Get current saved events for comparison + const currentSaved = new Set(window.confManager.getSavedEvents().map(c => c.id)); + + Object.keys(prefs).forEach(confId => { + const isSaved = prefs[confId].saved; + const wasSaved = currentSaved.has(confId); + + // Handle save/unsave through ConferenceStateManager + if (isSaved && !wasSaved) { + window.confManager.saveEvent(confId); + } else if (!isSaved && wasSaved) { + window.confManager.removeSavedEvent(confId); + } + + // Handle series following + const conf = window.confManager.getConference(confId); + if (conf) { + const isSeriesFollowed = window.confManager.isSeriesFollowed(conf.conference); + if (prefs[confId].series && !isSeriesFollowed) { + window.confManager.followSeries(conf.conference); + } else if (!prefs[confId].series && isSeriesFollowed) { + window.confManager.unfollowSeries(conf.conference); + } + } + }); + + // ConferenceStateManager will fire its own events + return; + } + + // Fallback to legacy storage if ConferenceStateManager not available + const favorites = []; + const savedConferences = store.get(SAVED_CONFERENCES_KEY) || {}; + + Object.keys(prefs).forEach(confId => { + if (prefs[confId].saved) { + favorites.push(confId); + + // Get conference data from page if not already saved + if (!savedConferences[confId]) { + const indicator = document.querySelector(`.action-indicator[data-conf-id="${confId}"]`); + if (indicator) { + savedConferences[confId] = { + id: confId, + name: indicator.dataset.confName || confId, + cfp: indicator.dataset.confCfp, + place: indicator.dataset.confPlace, + savedAt: new Date().toISOString() + }; + } + } + } + }); + + // Save using existing storage keys + store.set(STORAGE_KEY, favorites); + store.set(SAVED_CONFERENCES_KEY, savedConferences); + + // Fire events for other components + window.dispatchEvent(new CustomEvent('favoritesUpdated', { + detail: { favorites, savedConferences } + })); + } catch(e) { + // Silently handle save error + } + } + + // Initialize action indicators + function initializeIndicators() { + const prefs = getPrefs(); + + document.querySelectorAll('.action-indicator').forEach(indicator => { + const confId = indicator.dataset.confId; + if (!confId) return; + + const conf = prefs[confId] || {}; + + // Update indicator state + if (conf.saved && conf.series) { + indicator.classList.add('series'); + indicator.classList.remove('saved'); + } else if (conf.saved) { + indicator.classList.add('saved'); + indicator.classList.remove('series'); + } else { + indicator.classList.remove('saved', 'series'); + } + + // Update icon + const icon = indicator.querySelector('.action-icon'); + if (icon && conf.saved) { + icon.className = 'fas fa-bookmark action-icon'; + } + }); + + // Initialize mobile bookmarks + document.querySelectorAll('.mobile-action-bookmark').forEach(btn => { + const confId = btn.dataset.confId; + if (!confId) return; + + const conf = prefs[confId] || {}; + if (conf.saved) { + btn.classList.add('saved'); + btn.querySelector('i').className = 'fas fa-bookmark'; + } + }); + } + + // Handle action indicator clicks (desktop) + document.addEventListener('click', function(e) { + // Close popover when clicking outside + if (currentPopover && !e.target.closest('.action-indicator') && !e.target.closest('.action-popover')) { + currentPopover.classList.remove('show'); + currentPopover = null; + return; + } + + // Handle indicator click + const indicator = e.target.closest('.action-indicator'); + if (indicator) { + e.preventDefault(); + e.stopPropagation(); + + const confId = indicator.dataset.confId; + const popover = document.querySelector(`.action-popover[data-conf-id="${confId}"]`); + + if (popover) { + // Close any open popover + if (currentPopover && currentPopover !== popover) { + currentPopover.classList.remove('show'); + } + + // Toggle this popover + popover.classList.toggle('show'); + currentPopover = popover.classList.contains('show') ? popover : null; + + // Update popover items state + updatePopoverState(popover, confId); + } + } + + // Handle popover item clicks + const popoverItem = e.target.closest('.action-popover-item'); + if (popoverItem && !popoverItem.classList.contains('action-popover-calendar')) { + e.preventDefault(); + handleAction(popoverItem); + } + + // Handle calendar option clicks + const calendarOption = e.target.closest('.calendar-option'); + if (calendarOption) { + e.preventDefault(); + const calendarType = calendarOption.dataset.calendar; + const popover = calendarOption.closest('.action-popover'); + const confId = popover.dataset.confId; + const indicator = document.querySelector(`.action-indicator[data-conf-id="${confId}"]`); + generateCalendarLinks(null, indicator, calendarType); + + // Close popover after selection + popover.classList.remove('show'); + currentPopover = null; + } + + // Handle mobile bookmark click + const mobileBookmark = e.target.closest('.mobile-action-bookmark'); + if (mobileBookmark) { + e.preventDefault(); + handleMobileBookmark(mobileBookmark); + } + }); + + // Update popover state based on saved preferences + function updatePopoverState(popover, confId) { + const prefs = getPrefs(); + const conf = prefs[confId] || {}; + + popover.querySelectorAll('.action-popover-item').forEach(item => { + const action = item.dataset.action; + const icon = item.querySelector('i'); + + if (action === 'save' && conf.saved) { + item.classList.add('active'); + if (icon) icon.className = 'fas fa-bookmark'; + } else if (action === 'series' && conf.series) { + item.classList.add('active'); + if (icon) icon.className = 'fas fa-bell'; + } else if (icon) { + item.classList.remove('active'); + if (action === 'save') icon.className = 'far fa-bookmark'; + if (action === 'series') icon.className = 'far fa-bell'; + } + }); + } + + // Handle action from popover + function handleAction(item) { + const action = item.dataset.action; + const popover = item.closest('.action-popover'); + const confId = popover.dataset.confId; + const indicator = document.querySelector(`.action-indicator[data-conf-id="${confId}"]`); + + const prefs = getPrefs(); + if (!prefs[confId]) prefs[confId] = {}; + + if (action === 'save') { + prefs[confId].saved = !prefs[confId].saved; + + // Update indicator + if (prefs[confId].saved) { + indicator.classList.add('saved'); + item.classList.add('active'); + item.querySelector('i').className = 'fas fa-bookmark'; + } else { + indicator.classList.remove('saved', 'series'); + item.classList.remove('active'); + item.querySelector('i').className = 'far fa-bookmark'; + // If unsaving, also remove series + prefs[confId].series = false; + } + } else if (action === 'series') { + prefs[confId].series = !prefs[confId].series; + + // Series requires saved + if (prefs[confId].series) { + prefs[confId].saved = true; + indicator.classList.add('series'); + indicator.classList.remove('saved'); + item.classList.add('active'); + item.querySelector('i').className = 'fas fa-bell'; + + // Also update save button + const saveItem = popover.querySelector('[data-action="save"]'); + if (saveItem) { + saveItem.classList.add('active'); + saveItem.querySelector('i').className = 'fas fa-bookmark'; + } + } else { + indicator.classList.remove('series'); + if (prefs[confId].saved) { + indicator.classList.add('saved'); + } + item.classList.remove('active'); + item.querySelector('i').className = 'far fa-bell'; + } + } + + savePrefs(prefs); + + // Fire event for other components using existing event names + window.dispatchEvent(new CustomEvent('favoritesUpdated', { + detail: { confId, action, value: prefs[confId][action] } + })); + } + + // Handle mobile bookmark + function handleMobileBookmark(btn) { + const confId = btn.dataset.confId; + const prefs = getPrefs(); + + if (!prefs[confId]) prefs[confId] = {}; + prefs[confId].saved = !prefs[confId].saved; + + if (prefs[confId].saved) { + btn.classList.add('saved'); + btn.querySelector('i').className = 'fas fa-bookmark'; + } else { + btn.classList.remove('saved'); + btn.querySelector('i').className = 'far fa-bookmark'; + prefs[confId].series = false; // Unsaving removes series too + } + + savePrefs(prefs); + + // Show mobile action sheet for more options if saving + if (prefs[confId].saved && isMobile) { + showMobileActionSheet(confId); + } + } + + // Show mobile action sheet + function showMobileActionSheet(confId) { + // Create sheet if it doesn't exist + let sheet = document.querySelector('.mobile-action-sheet'); + if (!sheet) { + sheet = document.createElement('div'); + sheet.className = 'mobile-action-sheet'; + sheet.innerHTML = ` +
    +

    Conference Actions

    + +
    +
    + `; + document.body.appendChild(sheet); + + // Bind close button + sheet.querySelector('.mobile-action-sheet-close').addEventListener('click', () => { + sheet.classList.remove('show'); + }); + } + + // Update items + const prefs = getPrefs(); + const conf = prefs[confId] || {}; + const itemsContainer = sheet.querySelector('.mobile-action-sheet-items'); + + itemsContainer.innerHTML = ` + + + Save to Favorites + + + + Follow Series + + + + Add to Calendar + + `; + + // Show sheet + setTimeout(() => sheet.classList.add('show'), 10); + } + + // Handle mobile action sheet clicks + document.addEventListener('click', function(e) { + const item = e.target.closest('.mobile-action-sheet-item'); + if (item) { + e.preventDefault(); + const action = item.dataset.action; + const confId = item.dataset.confId; + + if (action === 'calendar') { + // For mobile, show calendar options in action sheet + showMobileCalendarOptions(confId); + } else { + // Toggle action + const prefs = getPrefs(); + if (!prefs[confId]) prefs[confId] = {}; + + if (action === 'save') { + prefs[confId].saved = !prefs[confId].saved; + } else if (action === 'series') { + prefs[confId].series = !prefs[confId].series; + if (prefs[confId].series) prefs[confId].saved = true; + } + + savePrefs(prefs); + + // Update UI + initializeIndicators(); + + // Update sheet items + const sheet = document.querySelector('.mobile-action-sheet'); + if (sheet) { + showMobileActionSheet(confId); + } + } + } + }); + + // Generate calendar links based on calendar type + function generateCalendarLinks(element, indicator, calendarType) { + const confId = indicator ? indicator.dataset.confId : element.dataset.confId; + const confName = indicator ? indicator.dataset.confName : 'Conference'; + const cfpDate = indicator ? indicator.dataset.confCfp : null; + const confPlace = indicator ? indicator.dataset.confPlace : ''; + + // Format the date for calendar + const eventDate = cfpDate ? new Date(cfpDate) : new Date(); + const startDate = eventDate.toISOString().replace(/-|:|\.\d\d\d/g, ''); + + // Create event details + const eventDetails = { + title: `${confName} - CFP Deadline`, + details: `Call for Proposals deadline for ${confName}`, + location: confPlace, + startDate: startDate, + endDate: startDate + }; + + let calendarUrl = ''; + + switch(calendarType) { + case 'google': + calendarUrl = `https://calendar.google.com/calendar/render?action=TEMPLATE&text=${encodeURIComponent(eventDetails.title)}&details=${encodeURIComponent(eventDetails.details)}&location=${encodeURIComponent(eventDetails.location)}&dates=${startDate}/${eventDetails.endDate}`; + window.open(calendarUrl, '_blank'); + break; + + case 'outlook': + calendarUrl = `https://outlook.live.com/calendar/0/deeplink/compose?subject=${encodeURIComponent(eventDetails.title)}&body=${encodeURIComponent(eventDetails.details)}&location=${encodeURIComponent(eventDetails.location)}&startdt=${startDate}&enddt=${eventDetails.endDate}`; + window.open(calendarUrl, '_blank'); + break; + + case 'apple': + // For Apple Calendar, we'll download an ICS file + generateICSFile(eventDetails); + break; + + case 'ics': + generateICSFile(eventDetails); + break; + } + + // Show success message + showNotification('Calendar event created!', 'success'); + } + + // Generate ICS file for download + function generateICSFile(eventDetails) { + const icsContent = `BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//PythonDeadlines//Conference CFP//EN +BEGIN:VEVENT +UID:${Date.now()}@pythondeadlin.es +DTSTAMP:${new Date().toISOString().replace(/-|:|\.\d\d\d/g, '')} +DTSTART:${eventDetails.startDate} +DTEND:${eventDetails.endDate} +SUMMARY:${eventDetails.title} +DESCRIPTION:${eventDetails.details} +LOCATION:${eventDetails.location} +END:VEVENT +END:VCALENDAR`; + + const blob = new Blob([icsContent], { type: 'text/calendar' }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${eventDetails.title.replace(/[^a-z0-9]/gi, '_')}.ics`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + } + + // Show notification message + function showNotification(text, type = 'info') { + const message = document.createElement('div'); + message.textContent = text; + const bgColor = type === 'success' ? '#28a745' : '#17a2b8'; + message.style.cssText = `position: fixed; top: 20px; right: 20px; background: ${bgColor}; color: white; padding: 10px 20px; border-radius: 4px; z-index: 9999; animation: slideIn 0.3s ease;`; + document.body.appendChild(message); + setTimeout(() => { + message.style.animation = 'slideOut 0.3s ease'; + setTimeout(() => message.remove(), 300); + }, 2000); + } + + // Show mobile calendar options + function showMobileCalendarOptions(confId) { + const sheet = document.querySelector('.mobile-action-sheet'); + if (!sheet) return; + + const itemsContainer = sheet.querySelector('.mobile-action-sheet-items'); + const indicator = document.querySelector(`.action-indicator[data-conf-id="${confId}"]`); + + itemsContainer.innerHTML = ` +
    + + Back +
    + + + Google Calendar + + + + Outlook + + + + Apple Calendar + + + + Download .ics + + `; + + // Handle back button + const backBtn = itemsContainer.querySelector('.mobile-action-sheet-back'); + backBtn.addEventListener('click', (e) => { + e.preventDefault(); + showMobileActionSheet(confId); + }); + + // Handle calendar option clicks + itemsContainer.querySelectorAll('[data-action^="calendar-"]').forEach(option => { + option.addEventListener('click', (e) => { + e.preventDefault(); + const calendarType = option.dataset.action.replace('calendar-', ''); + generateCalendarLinks(null, indicator, calendarType); + sheet.classList.remove('show'); + }); + }); + } + + // Handle keyboard navigation + document.addEventListener('keydown', function(e) { + const indicator = document.activeElement.closest('.action-indicator'); + if (indicator && (e.key === 'Enter' || e.key === ' ')) { + e.preventDefault(); + indicator.click(); + } + }); + + // Handle window resize + let resizeTimeout; + window.addEventListener('resize', function() { + clearTimeout(resizeTimeout); + resizeTimeout = setTimeout(() => { + isMobile = window.innerWidth <= 768; + }, 100); + }); + + // Initialize on DOM ready (only enhance existing HTML) + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initializeIndicators); + } else { + initializeIndicators(); + } + + // Listen for ConferenceStateManager updates + window.addEventListener('conferenceStateUpdate', function(e) { + // Re-initialize indicators when state changes + initializeIndicators(); + }); + + // Also listen for ConferenceStateManager to become ready + window.addEventListener('conferenceManagerReady', function(e) { + // Re-initialize with ConferenceStateManager data + initializeIndicators(); + }); + + // Export API for other components + window.minimalActionAPI = { + getPrefs: getPrefs, + isConferenceSaved: function(confId) { + const prefs = getPrefs(); + return prefs[confId]?.saved || false; + }, + getSeriesFollowed: function() { + const prefs = getPrefs(); + return Object.keys(prefs).filter(id => prefs[id].series); + } + }; +})(); diff --git a/static/js/bootstrap-multiselect.min.js b/static/js/bootstrap-multiselect.min.js index 4cb89f27008..f106afdda2b 100644 --- a/static/js/bootstrap-multiselect.min.js +++ b/static/js/bootstrap-multiselect.min.js @@ -1 +1 @@ -!function(root,factory){"function"==typeof define&&define.amd&&"function"==typeof require&&"function"==typeof require.specified&&require.specified("knockout")?define(["jquery","knockout"],factory):factory(root.jQuery,root.ko)}(this,(function($,ko){"use strict";function forEach(array,callback){for(var index=0;index').after(this.$container),this.options.onInitialized(this.$select,this.$container)}void 0!==ko&&ko.bindingHandlers&&!ko.bindingHandlers.multiselect&&(ko.bindingHandlers.multiselect={after:["options","value","selectedOptions","enable","disable"],init:function(element,valueAccessor,allBindings,viewModel,bindingContext){var $element=$(element),config=ko.toJS(valueAccessor());if($element.multiselect(config),allBindings.has("options")){var options=allBindings.get("options");ko.isObservable(options)&&ko.computed({read:function(){options(),setTimeout((function(){var ms=$element.data("multiselect");ms&&ms.updateOriginalOptions(),$element.multiselect("rebuild")}),1)},disposeWhenNodeIsRemoved:element})}if(allBindings.has("value")){var value=allBindings.get("value");ko.isObservable(value)&&ko.computed({read:function(){value(),setTimeout((function(){$element.multiselect("refresh")}),1)},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0})}if(allBindings.has("selectedOptions")){var selectedOptions=allBindings.get("selectedOptions");ko.isObservable(selectedOptions)&&ko.computed({read:function(){selectedOptions(),setTimeout((function(){$element.multiselect("refresh")}),1)},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0})}var setEnabled=function(enable){setTimeout((function(){enable?$element.multiselect("enable"):$element.multiselect("disable")}))};if(allBindings.has("enable")){var enable=allBindings.get("enable");ko.isObservable(enable)?ko.computed({read:function(){setEnabled(enable())},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0}):setEnabled(enable)}if(allBindings.has("disable")){var disable=allBindings.get("disable");ko.isObservable(disable)?ko.computed({read:function(){setEnabled(!disable())},disposeWhenNodeIsRemoved:element}).extend({rateLimit:100,notifyWhenChangesStop:!0}):setEnabled(!disable)}ko.utils.domNodeDisposal.addDisposeCallback(element,(function(){$element.multiselect("destroy")}))},update:function(element,valueAccessor,allBindings,viewModel,bindingContext){var $element=$(element),config=ko.toJS(valueAccessor());$element.multiselect("setOptions",config),$element.multiselect("rebuild")}}),Multiselect.prototype={defaults:{buttonText:function(options,select){if(this.disabledText.length>0&&(select.prop("disabled")||0==options.length&&this.disableIfEmpty))return this.disabledText;if(0===options.length)return this.nonSelectedText;if(this.allSelectedText&&options.length===$("option",$(select)).length&&1!==$("option",$(select)).length&&this.multiple)return this.selectAllNumber?this.allSelectedText+" ("+options.length+")":this.allSelectedText;if(0!=this.numberDisplayed&&options.length>this.numberDisplayed)return options.length+" "+this.nSelectedText;var selected="",delimiter=this.delimiterText;return options.each((function(){var label=void 0!==$(this).attr("label")?$(this).attr("label"):$(this).text();selected+=label+delimiter})),selected.substr(0,selected.length-this.delimiterText.length)},buttonTitle:function(options,select){if(0===options.length)return this.nonSelectedText;var selected="",delimiter=this.delimiterText;return options.each((function(){var label=void 0!==$(this).attr("label")?$(this).attr("label"):$(this).text();selected+=label+delimiter})),selected.substr(0,selected.length-this.delimiterText.length)},checkboxName:function(option){return!1},optionLabel:function(element){return $(element).attr("label")||$(element).text()},optionClass:function(element){return $(element).attr("class")||""},onChange:function(option,checked){},onDropdownShow:function(event){},onDropdownHide:function(event){},onDropdownShown:function(event){},onDropdownHidden:function(event){},onSelectAll:function(){},onDeselectAll:function(){},onInitialized:function($select,$container){},onFiltering:function($filter){},enableHTML:!1,buttonClass:"custom-select",inheritClass:!1,buttonWidth:"auto",buttonContainer:'
    ',dropRight:!1,dropUp:!1,selectedClass:"active",maxHeight:!1,includeSelectAllOption:!1,includeSelectAllIfMoreThan:0,selectAllText:" Select all",selectAllValue:"multiselect-all",selectAllName:!1,selectAllNumber:!0,selectAllJustVisible:!0,enableFiltering:!1,enableCaseInsensitiveFiltering:!1,enableFullValueFiltering:!1,enableClickableOptGroups:!1,enableCollapsibleOptGroups:!1,collapseOptGroupsByDefault:!1,filterPlaceholder:"Search",filterBehavior:"text",includeFilterClearBtn:!0,preventInputChangeEvent:!1,nonSelectedText:"None selected",nSelectedText:"selected",allSelectedText:"All selected",numberDisplayed:3,disableIfEmpty:!1,disabledText:"",delimiterText:", ",includeResetOption:!1,includeResetDivider:!1,resetText:"Reset",templates:{button:'',popupContainer:'',filter:'
    ',filterClearBtn:'
    ',option:'',divider:'',optionGroup:'',resetButton:'
    '}},constructor:Multiselect,buildContainer:function(){this.$container=$(this.options.buttonContainer),this.$container.on("show.bs.dropdown",this.options.onDropdownShow),this.$container.on("hide.bs.dropdown",this.options.onDropdownHide),this.$container.on("shown.bs.dropdown",this.options.onDropdownShown),this.$container.on("hidden.bs.dropdown",this.options.onDropdownHidden)},buildButton:function(){this.$button=$(this.options.templates.button).addClass(this.options.buttonClass),this.$select.attr("class")&&this.options.inheritClass&&this.$button.addClass(this.$select.attr("class")),this.$select.prop("disabled")?this.disable():this.enable(),this.options.buttonWidth&&"auto"!==this.options.buttonWidth&&(this.$button.css({width:"100%",overflow:"hidden","text-overflow":"ellipsis"}),this.$container.css({width:this.options.buttonWidth}));var tabindex=this.$select.attr("tabindex");tabindex&&this.$button.attr("tabindex",tabindex),this.$container.prepend(this.$button)},buildDropdown:function(){this.$popupContainer=$(this.options.templates.popupContainer),this.options.dropRight?this.$container.addClass("dropright"):this.options.dropUp&&this.$container.addClass("dropup"),this.options.maxHeight&&this.$popupContainer.css({"max-height":this.options.maxHeight+"px","overflow-y":"auto","overflow-x":"hidden"}),this.$popupContainer.on("touchstart click",(function(e){e.stopPropagation()})),this.$container.append(this.$popupContainer)},buildDropdownOptions:function(){this.$select.children().each($.proxy((function(index,element){var $element=$(element),tag=$element.prop("tagName").toLowerCase();$element.prop("value")!==this.options.selectAllValue&&("optgroup"===tag?this.createOptgroup(element):"option"===tag&&("divider"===$element.data("role")?this.createDivider():this.createOptionValue(element)))}),this)),$(this.$popupContainer).off("change",'> *:not(.multiselect-group) input[type="checkbox"], > *:not(.multiselect-group) input[type="radio"]'),$(this.$popupContainer).on("change",'> *:not(.multiselect-group) input[type="checkbox"], > *:not(.multiselect-group) input[type="radio"]',$.proxy((function(event){var $target=$(event.target),checked=$target.prop("checked")||!1,isSelectAllOption=$target.val()===this.options.selectAllValue;this.options.selectedClass&&(checked?$target.closest(".multiselect-option").addClass(this.options.selectedClass):$target.closest(".multiselect-option").removeClass(this.options.selectedClass));var value=$target.val(),$option=this.getOptionByValue(value),$optionsNotThis=$("option",this.$select).not($option),$checkboxesNotThis=$("input",this.$container).not($target);if(isSelectAllOption?checked?this.selectAll(this.options.selectAllJustVisible,!0):this.deselectAll(this.options.selectAllJustVisible,!0):(checked?($option.prop("selected",!0),this.options.multiple?$option.prop("selected",!0):(this.options.selectedClass&&$($checkboxesNotThis).closest(".dropdown-item").removeClass(this.options.selectedClass),$($checkboxesNotThis).prop("checked",!1),$optionsNotThis.prop("selected",!1),this.$button.click()),"active"===this.options.selectedClass&&$optionsNotThis.closest(".dropdown-item").css("outline","")):$option.prop("selected",!1),this.options.onChange($option,checked),this.updateSelectAll(),this.options.enableClickableOptGroups&&this.options.multiple&&this.updateOptGroups()),this.$select.change(),this.updateButtonText(),this.options.preventInputChangeEvent)return!1}),this)),$(".multiselect-option",this.$popupContainer).off("mousedown"),$(".multiselect-option",this.$popupContainer).on("mousedown",(function(e){if(e.shiftKey)return!1})),$(this.$popupContainer).off("touchstart click",".multiselect-option, .multiselect-all, .multiselect-group"),$(this.$popupContainer).on("touchstart click",".multiselect-option, .multiselect-all, .multiselect-group",$.proxy((function(event){event.stopPropagation();var $target=$(event.target),$input;if(event.shiftKey&&this.options.multiple){$target.is("input")||(event.preventDefault(),($target=$target.closest(".multiselect-option").find("input")).prop("checked",!$target.prop("checked")));var checked=$target.prop("checked")||!1;if(null!==this.lastToggledInput&&this.lastToggledInput!==$target){var from=this.$popupContainer.find(".multiselect-option:visible").index($target.closest(".multiselect-option")),to=this.$popupContainer.find(".multiselect-option:visible").index(this.lastToggledInput.closest(".multiselect-option"));if(from>to){var tmp=to;to=from,from=tmp}++to;var range=this.$popupContainer.find(".multiselect-option:not(.multiselect-filter-hidden)").slice(from,to).find("input");range.prop("checked",checked),this.options.selectedClass&&range.closest(".multiselect-option").toggleClass(this.options.selectedClass,checked);for(var i=0,j=range.length;i0)$checkbox.prop("checked",!$checkbox.prop("checked")),$checkbox.change();else if(this.options.enableClickableOptGroups&&this.options.multiple&&!$target.hasClass("caret-container")){var groupItem=$target;groupItem.hasClass("multiselect-group")||(groupItem=$target.closest(".multiselect-group")),($checkbox=groupItem.find(".form-check-input")).length>0&&($checkbox.prop("checked",!$checkbox.prop("checked")),$checkbox.change())}event.preventDefault()}$target.closest(".multiselect-option").find("input[type='checkbox'], input[type='radio']").length>0?this.lastToggledInput=$target:this.lastToggledInput=null,$target.blur()}),this)),this.$container.off("keydown.multiselect").on("keydown.multiselect",$.proxy((function(event){if(!$('input[type="text"]',this.$container).is(":focus"))if(9===event.keyCode&&this.$container.hasClass("show"))this.$button.click();else{var $items=$(this.$container).find(".multiselect-option:not(.disabled), .multiselect-group:not(.disabled), .multiselect-all").filter(":visible");if(!$items.length)return;var index=$items.index($items.filter(":focus")),$current=$items.eq(index);if(32===event.keyCode){var $checkbox=$current.find("input");$checkbox.prop("checked",!$checkbox.prop("checked")),$checkbox.change(),event.preventDefault()}13===event.keyCode&&setTimeout((function(){$current.focus()}),0)}}),this)),this.options.enableClickableOptGroups&&this.options.multiple&&($(".multiselect-group input",this.$popupContainer).off("change"),$(".multiselect-group input",this.$popupContainer).on("change",$.proxy((function(event){event.stopPropagation();var $target,checked=$(event.target).prop("checked")||!1,$item=$(event.target).closest(".dropdown-item"),$group,$inputs=$item.nextUntil(".multiselect-group").not(".multiselect-filter-hidden").not(".disabled").find("input"),$options=[];this.options.selectedClass&&(checked?$item.addClass(this.options.selectedClass):$item.removeClass(this.options.selectedClass)),$.each($inputs,$.proxy((function(index,input){var $input=$(input),value=$input.val(),$option=this.getOptionByValue(value);checked?($input.prop("checked",!0),$input.closest(".dropdown-item").addClass(this.options.selectedClass),$option.prop("selected",!0)):($input.prop("checked",!1),$input.closest(".dropdown-item").removeClass(this.options.selectedClass),$option.prop("selected",!1)),$options.push(this.getOptionByValue(value))}),this)),this.options.onChange($options,checked),this.$select.change(),this.updateButtonText(),this.updateSelectAll()}),this))),this.options.enableCollapsibleOptGroups&&this.options.multiple&&($(".multiselect-group .caret-container",this.$popupContainer).off("click"),$(".multiselect-group .caret-container",this.$popupContainer).on("click",$.proxy((function(event){var $group,$inputs=$(event.target).closest(".multiselect-group").nextUntil(".multiselect-group").not(".multiselect-filter-hidden"),visible=!0;$inputs.each((function(){visible=visible&&!$(this).hasClass("multiselect-collapsible-hidden")})),visible?$inputs.hide().addClass("multiselect-collapsible-hidden"):$inputs.show().removeClass("multiselect-collapsible-hidden")}),this)))},createCheckbox:function($item,label,name,value,title,inputType){var $wrapper=$("");if($wrapper.addClass("form-check"),this.options.enableHTML&&$(label).length>0)$wrapper.append($(label));else{var $checkboxLabel=$('