Changeset - a2f38653fb02
conservancy/blog/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Entry, EntryTag
 

	
 

	
 
@admin.register(EntryTag)
 
class EntryTagAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {'slug': ('label',)}
 

	
 

	
 

	
 
@admin.register(Entry)
 
class EntryAdmin(admin.ModelAdmin):
 
    list_display = ('pub_date', 'headline', 'author')
 
    list_filter = ['pub_date']
 
    date_hierarchy = 'pub_date'
 
    search_fields = ['headline', 'summary', 'body']
 
    prepopulated_fields = {'slug': ("headline",)}
 
    filter_horizontal = ('tags',)
 

	
 

	
conservancy/content/projects/policies/publish-policy.py
Show inline comments
 
#!/usr/bin/env python3
 

	
 
import argparse
 
import contextlib
 
import functools
 
import locale
 
import os
 
import pathlib
 
import shutil
 
import subprocess
 
import sys
 
import tempfile
 

	
 
try:
 
    import markdown
 
    from markdown.extensions import sane_lists as mdx_sane_lists
 
    from markdown.extensions import smarty as mdx_smarty
 
    from markdown.extensions import tables as mdx_tables
 
    from markdown.extensions import toc as mdx_toc
 
    markdown_import_success = True
 
except ImportError:
 
    if __name__ != '__main__':
 
        raise
 
    markdown_import_success = False
 

	
 
TEMPLATE_HEADER = """{% extends "base_projects.html" %}
 
{% block subtitle %}{% endblock %}
 
{% block submenuselection %}Policies{% endblock %}
 
{% block content %}
 

	
 
"""
 

	
 
TEMPLATE_FOOTER = """
 

	
 
{% endblock %}
 
"""
 

	
 
@contextlib.contextmanager
 
def run(cmd, encoding=None, ok_exitcodes=frozenset([0]), **kwargs):
 
    kwargs.setdefault('stdout', subprocess.PIPE)
 
    if encoding is None:
 
        mode = 'rb'
 
        no_data = b''
 
    else:
 
        mode = 'r'
 
        no_data = ''
 
    with contextlib.ExitStack() as exit_stack:
 
        proc = exit_stack.enter_context(subprocess.Popen(cmd, **kwargs))
 
        pipes = [
 
            exit_stack.enter_context(open(
 
                getattr(proc, name).fileno(), mode, encoding=encoding, closefd=False))
 
            for name in ['stdout', 'stderr']
 
            if kwargs.get(name) is subprocess.PIPE
 
        ]
 
        if pipes:
 
            yield (proc, *pipes)
 
        else:
 
            yield proc
 
        for pipe in pipes:
 
            for _ in iter(lambda: pipe.read(4096), no_data):
 
                pass
 
    if proc.returncode not in ok_exitcodes:
 
        raise subprocess.CalledProcessError(proc.returncode, cmd)
 

	
 
class GitPath:
 
    GIT_BIN = shutil.which('git')
 
    CLEAN_ENV = {k: v for k, v in os.environ.items() if not k.startswith('GIT_')}
 
    ANY_EXITCODE = range(-256, 257)
 
    IGNORE_ERRORS = {
 
        'ok_exitcodes': ANY_EXITCODE,
 
        'stderr': subprocess.DEVNULL,
 
    }
 
    STATUS_CLEAN_OR_UNMANAGED = frozenset(' ?')
 

	
 
    def __init__(self, path, encoding, env=None):
 
        self.path = path
 
        self.dir_path = path if path.is_dir() else path.parent
 
        self.encoding = encoding
 
        self.run_defaults = {
 
            'cwd': str(self.dir_path),
 
            'env': env,
 
        }
 

	
 
    @classmethod
 
    def can_run(cls):
 
        return cls.GIT_BIN is not None
 

	
 
    def _run(self, cmd, encoding=None, ok_exitcodes=frozenset([0]), **kwargs):
 
        return run(cmd, encoding, ok_exitcodes, **self.run_defaults, **kwargs)
 

	
 
    def _cache(orig_func):
 
        attr_name = '_cached_' + orig_func.__name__
 

	
 
        @functools.wraps(orig_func)
 
        def cache_wrapper(self):
 
            try:
 
                return getattr(self, attr_name)
 
            except AttributeError:
 
                setattr(self, attr_name, orig_func(self))
 
                return getattr(self, attr_name)
 
        return cache_wrapper
 

	
 
    @_cache
 
    def is_work_tree(self):
 
        with self._run([self.GIT_BIN, 'rev-parse', '--is-inside-work-tree'],
 
                       self.encoding, **self.IGNORE_ERRORS) as (_, stdout):
 
            return stdout.readline() == 'true\n'
 

	
 
    @_cache
 
    def status_lines(self):
 
        with self._run([self.GIT_BIN, 'status', '-z'],
 
                       self.encoding) as (_, stdout):
 
            return stdout.read().split('\0')
 

	
 
    @_cache
 
    def has_managed_modifications(self):
 
        return any(line and line[1] not in self.STATUS_CLEAN_OR_UNMANAGED
 
                   for line in self.status_lines())
 

	
 
    @_cache
 
    def has_staged_changes(self):
 
        return any(line and line[0] not in self.STATUS_CLEAN_OR_UNMANAGED
 
                   for line in self.status_lines())
 

	
 
    def commit_at(self, revision):
 
        with self._run([self.GIT_BIN, 'rev-parse', revision],
 
                       self.encoding) as (_, stdout):
 
            return stdout.readline().rstrip('\n') or None
 

	
 
    @_cache
 
    def upstream_commit(self):
 
        return self.commit_at('@{upstream}')
 

	
 
    @_cache
 
    def head_commit(self):
 
        return self.commit_at('HEAD')
 

	
 
    def in_sync_with_upstream(self):
 
        return self.upstream_commit() == self.head_commit()
 

	
 
    @_cache
 
    def last_commit(self):
 
        with self._run([self.GIT_BIN, 'log', '-n1', '--format=format:%H', self.path.name],
 
                       self.encoding, **self.IGNORE_ERRORS) as (_, stdout):
 
            return stdout.readline().rstrip('\n') or None
 

	
 
    def operate(self, subcmd, ok_exitcodes=frozenset([0])):
 
        with self._run([self.GIT_BIN, *subcmd], None, ok_exitcodes, stdout=None):
 
            pass
 

	
 

	
 
def add_parser_flag(argparser, dest, **kwargs):
 
    kwargs.update(dest=dest, default=None)
 
    switch_root = dest.replace('_', '-')
 
    switch = '--' + switch_root
 
    argparser.add_argument(switch, **kwargs, action='store_true')
 
    kwargs['help'] = "Do not do {}".format(switch)
 
    argparser.add_argument('--no-' + switch_root, **kwargs, action='store_false')
 

	
 
def parse_arguments(arglist):
 
    parser = argparse.ArgumentParser(
 
        epilog="""By default, the program will pull from Git if the output path
 
is a Git checkout with a tracking branch, and will commit and push if
 
that checkout is in sync with the tracking branch without any staged changes.
 
Setting any flag will always override the default behavior.
 
""",
 
    )
 

	
 
    parser.add_argument(
 
        '--encoding', '-E',
 
        default=locale.getpreferredencoding(),
 
        help="Encoding to use for all I/O. "
 
        "Default is your locale's encoding.",
 
    )
 
    parser.add_argument(
 
        '--revision', '-r',
 
        help="Revision string to version the published page. "
 
        "Default determined from the revision of the source file.",
 
    )
 
    add_parser_flag(
 
        parser, 'pull',
 
        help="Try to pull the remote tracking branch to make the checkout "
 
        "up-to-date before making changes"
 
    )
 
    add_parser_flag(
 
        parser, 'commit',
 
        help="Commit changes to the website repository",
 
    )
 
    parser.add_argument(
 
        '-m', dest='commit_message',
 
        default="Publish {filename} revision {revision}.",
 
        help="Message for any commit",
 
    )
 
    add_parser_flag(
 
        parser, 'push',
 
        help="Push to the remote tracking branch after committing changes",
 
    )
 
    parser.add_argument(
 
        'input_path', type=pathlib.Path,
 
        help="Path to the Conservancy policy Markdown source",
 
    )
 
    parser.add_argument(
 
        'output_path', type=pathlib.Path,
 
        nargs='?', default=pathlib.Path(__file__).parent,
 
        help="Path to the directory to write output files",
 
    )
 

	
 
    if not markdown_import_success:
 
        parser.error("""markdown module is not installed.
 
Try `apt install python3-markdown` or `python3 -m pip install --user Markdown`.""")
 

	
 
    args = parser.parse_args(arglist)
 
    args.git_output = GitPath(args.output_path, args.encoding)
 
    if args.pull or args.commit or args.push:
 
        if not args.git_output.can_run():
 
            parser.error("Git operation requested but `git` not found in PATH")
 
        elif not args.git_output.is_work_tree():
 
            parser.error("Git operation requested but {} is not a working path".format(
 
                args.output_path.as_posix()))
 
    if args.revision is None:
 
        try:
 
            args.revision = GitPath(args.input_path, args.encoding, GitPath.CLEAN_ENV).last_commit()
 
        except subprocess.CalledProcessError:
 
            pass
 
        if args.revision is None:
 
            parser.error("no --revision specified and not found from input path")
 
    args.output_link_path = args.git_output.dir_path / args.input_path.with_suffix('.html').name
 
    args.output_file_path = args.output_link_path.with_suffix('.{}.html'.format(args.revision))
 
    return args
 

	
 
class GitOperation:
 
    def __init__(self, args):
 
        self.args = args
 
        self.git_path = args.git_output
 
        self.exitcode = None
 
        self.on_work_tree = self.git_path.can_run() and self.git_path.is_work_tree()
 

	
 
    def run(self):
 
        arg_state = getattr(self.args, self.NAME)
 
        if arg_state is None:
 
            arg_state = self.should_run()
 
        if not arg_state:
 
            return
 
        try:
 
            self.exitcode = self.run_git() or 0
 
        except subprocess.CalledProcessError as error:
 
            self.exitcode = error.returncode
 

	
 

	
 
class GitPull(GitOperation):
 
    NAME = 'pull'
 

	
 
    def should_run(self):
 
        return self.on_work_tree and not self.git_path.has_staged_changes()
 

	
 
    def run_git(self):
 
        self.git_path.operate(['fetch', '--no-tags'])
 
        self.git_path.operate(['merge', '--ff-only'])
 

	
 

	
 
class GitCommit(GitOperation):
 
    NAME = 'commit'
 
    VERB = 'committed'
 

	
 
    def __init__(self, args):
 
        super().__init__(args)
 
        try:
 
            self._should_run = ((not self.git_path.has_staged_changes())
 
                                and self.git_path.in_sync_with_upstream())
 
        except subprocess.CalledProcessError:
 
            self._should_run = False
 

	
 
    def should_run(self):
 
        return self.on_work_tree and self._should_run
 

	
 
    def run_git(self):
 
        self.git_path.operate([
 
            'add', str(self.args.output_file_path), str(self.args.output_link_path),
 
        ])
 
        commit_message = self.args.commit_message.format(
 
            filename=self.args.output_link_path.name,
 
            revision=self.args.revision,
 
        )
 
        self.git_path.operate(['commit', '-m', commit_message])
 

	
 

	
 
class GitPush(GitCommit):
 
    NAME = 'push'
 
    VERB = 'pushed'
 

	
 
    def run_git(self):
 
        self.git_path.operate(['push'])
 

	
 

	
 
def write_output(args):
 
    converter = markdown.Markdown(
 
        extensions=[
 
            mdx_tables.TableExtension(),
 
            mdx_sane_lists.SaneListExtension(),
 
            mdx_smarty.SmartyExtension(),
 
            mdx_toc.TocExtension(),
 
        ],
 
        output_format='html5',
 
    )
 
    header = TEMPLATE_HEADER
 
    with args.input_path.open(encoding=args.encoding) as src_file:
 
        for line in src_file:
 
            if line.startswith('# '):
 
                subtitle = line[2:].replace('Software Freedom Conservancy', '').strip()
 
                header = header.replace(
 
                    '{% block subtitle %}',
 
                    '{{% block subtitle %}}{} - '.format(subtitle),
 
                )
 
                break
 
        src_file.seek(0)
 
        body = converter.convert(src_file.read())
 
    with tempfile.NamedTemporaryFile(
 
            'w',
 
            encoding=args.encoding,
 
            dir=args.git_output.dir_path.as_posix(),
 
            suffix='.html',
 
            delete=False,
 
    ) as tmp_out:
 
        try:
 
            tmp_out.write(header)
 
            tmp_out.write(body)
 
            tmp_out.write(TEMPLATE_FOOTER)
 
            tmp_out.flush()
 
            os.rename(tmp_out.name, str(args.output_file_path))
 
        except BaseException:
 
            os.unlink(tmp_out.name)
 
            raise
 
    if args.output_link_path.is_symlink():
 
        args.output_link_path.unlink()
 
    args.output_link_path.symlink_to(args.output_file_path.name)
 

	
 
def main(arglist=None, stdout=sys.stdout, stderr=sys.stderr):
 
    args = parse_arguments(arglist)
 
    pull = GitPull(args)
 
    pull.run()
 
    if pull.exitcode:
 
        return pull.exitcode
 
    write_output(args)
 
    ops = [GitCommit(args), GitPush(args)]
 
    for op in ops:
 
        op.run()
 
        if op.exitcode != 0:
 
            exitcode = op.exitcode or 0
 
            break
 
    else:
 
        exitcode = 0
 
    print(args.input_path.name, "converted,",
 
          ", ".join(op.VERB if op.exitcode == 0 else "not " + op.VERB for op in ops),
 
          file=stdout)
 
    return exitcode
 

	
 
if __name__ == '__main__':
 
    exit(main())
 

	
conservancy/events/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Event, EventMedia, EventTag
 

	
 
admin.site.register(EventTag)
 

	
 
@admin.register(Event)
 
class EventAdmin(admin.ModelAdmin):
 
    list_display = ("title", "date", "date_tentative", "location")
 
    list_filter = ['date']
 
    date_hierarchy = 'date'
 
    search_fields = ["title", "description", "earth_location"]
 
    prepopulated_fields = {'slug' : ("title",) }
 

	
 

	
 
@admin.register(EventMedia)
 
class EventMediaAdmin(admin.ModelAdmin):
 
    list_display = ("event", "format", "novel")
 

	
 

	
 

	
conservancy/events/models.py
Show inline comments
 
from datetime import datetime, timedelta
 

	
 
from django.db import models
 

	
 
from ..staff.models import Person
 
from ..worldmap.models import EarthLocation
 

	
 

	
 
class EventTag(models.Model):
 
    """Tagging for events
 

	
 
    (currently unused)
 
    """
 

	
 
    label = models.CharField(max_length=100)
 

	
 
    date_created = models.DateField(auto_now_add=True)
 

	
 
    def __str__(self):
 
        return self.label
 

	
 
class PastEventManager(models.Manager):
 
    """Returns all past events"""
 

	
 
    def get_queryset(self):
 
        return super().get_queryset().filter(date__lt=datetime.today())
 

	
 
class FutureEventManager(models.Manager):
 
    """Returns all future events"""
 

	
 
    def get_queryset(self):
 
        return super().get_queryset().filter(date__gte=datetime.today())
 

	
 
class Event(models.Model):
 
    """Model for Conservancy staff member events (presentations, etc)"""
 

	
 
    title = models.CharField(max_length=400)
 
    date = models.DateField()
 
    date_tentative = models.BooleanField(default=False)
 
    datetime = models.CharField("Date and Time", max_length=300, blank=True)
 
    slug = models.SlugField(unique_for_year='date')
 
    description = models.TextField(blank=True)
 
    people = models.ManyToManyField(Person, blank=True)
 
    location = models.CharField(max_length=1000)
 
    earth_location = models.ForeignKey(
 
        EarthLocation, null=True, blank=True, help_text="Label will not be displayed",
 
        on_delete=models.CASCADE
 
    )
 
    tags = models.ManyToManyField(EventTag, blank=True)
 

	
 
    date_created = models.DateTimeField(auto_now_add=True)
 
    date_last_modified = models.DateTimeField(auto_now=True)
 

	
 
    class Meta:
 
        ordering = ("-date",)
 

	
 
    def __str__(self):
 
        return "{} ({})".format(self.title, self.date)
 

	
 
    def get_absolute_url(self):
 
        return "/events/{}/{}/".format(self.date.strftime("%Y"), self.slug)
 

	
 
    def day_after(self):
 
        return self.date + timedelta(days=1)
 

	
 
    # for aggregate feed
 
    pub_date = property(lambda self: self.date_created)
 

	
 
    objects = models.Manager()
 
    past = PastEventManager()
 
    future = FutureEventManager()
 

	
 
class EventMedia(models.Model):
 
    """Media from an event
 

	
 
    includes transcripts, audio, and video pieces
 
    """
 

	
 
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
 
    format = models.CharField(max_length=1,
 
                              choices=(('T', 'Transcript'),
 
                                       ('A', 'Audio'),
 
                                       ('V', 'Video')))
 
    local = models.CharField(max_length=300, blank=True,
 
                             help_text="Local filename of the resource.  File should be uploaded into the static directory that corresponds to the event.")
 
    # verify_exists removed https://docs.djangoproject.com/en/1.7/releases/1.4/
 
    remote = models.URLField(blank=True,
 
                             help_text="Remote URL of the resource.  Required if 'local' is not given.")
 
    novel = models.BooleanField(help_text="Is it a new piece of media or another form of an old one?  If it is new it will be included in the event-media RSS feed and shown on the front page for a bit.", default=False)
 

	
 
    date_created = models.DateTimeField(auto_now_add=True)
 
    date_last_modified = models.DateTimeField(auto_now=True)
 

	
 
    class Meta:
 
        verbose_name_plural = 'event media'
 

	
 
    def __str__(self):
 
        return "{} media: {}".format(self.event, self.format)
 

	
conservancy/news/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import ExternalArticle, ExternalArticleTag, PressRelease
 

	
 

	
 
@admin.register(PressRelease)
 
class PressReleaseAdmin(admin.ModelAdmin):
 
    list_display = ("headline", "pub_date")
 
    list_filter = ['pub_date']
 
    date_hierarchy = 'pub_date'
 
    search_fields = ['headline', 'summary', 'body']
 
    prepopulated_fields = { 'slug' : ("headline",), }
 

	
 
admin.site.register(ExternalArticleTag)
 

	
 
@admin.register(ExternalArticle)
 
class ExternalArticleAdmin(admin.ModelAdmin):
 
    list_display = ("title", "publication", "visible", "date")
 
    list_filter = ['date']
 
    date_hierarchy = 'date'
 
    search_fields = ["title", "info", "publication"]
 

	
 

	
 

	
 

	
conservancy/news/models.py
Show inline comments
 
from datetime import datetime, timedelta
 

	
 
from django.conf import settings
 
from django.contrib.sites.models import Site
 
from django.db import models
 

	
 
from .. import bsoup
 
from ..events.models import Event
 
from ..staff.models import Person
 

	
 

	
 
class PressRelease(models.Model, bsoup.SoupModelMixin):
 
    """News release model"""
 

	
 
    headline = models.CharField(max_length=300)
 
    subhead = models.CharField(max_length=300, blank=True)
 
    slug = models.SlugField(unique_for_date="pub_date",
 
                            help_text=("automatically built from headline"))
 
    summary = models.TextField(help_text="First paragraph (raw HTML)")
 
    body = models.TextField(help_text="Remainder of post (raw HTML)",
 
                            blank=True)
 
    pub_date = models.DateTimeField("date [to be] published")
 
    sites = models.ManyToManyField(Site)
 

	
 
    date_last_modified = models.DateTimeField(auto_now=True)
 

	
 
    class Meta:
 
        ordering = ("-pub_date",)
 
        get_latest_by = "pub_date"
 

	
 
    SOUP_ATTRS = ['summary', 'body']
 

	
 
    def __str__(self):
 
        return self.headline
 

	
 
    def get_absolute_url(self):
 
        return "/news/{}/{}/".format(
 
            self.pub_date.strftime("%Y/%b/%d").lower(),
 
            self.slug,
 
        )
 

	
 
    def is_recent(self):
 
        return self.pub_date > (datetime.now() - timedelta(days=5))
 
        # question: does datetime.now() do a syscall each time is it called?
 

	
 
    def is_in_past_month(self):
 
        # This function is deprecated.  Use the date_within template
 
        # filter instead (example in conservancy/templates/frontpage.html)
 
        return self.pub_date > (datetime.now() - timedelta(days=30))
 

	
 
    def save(self):
 
        if settings.DEBUG or True:
 
            super().save()
 
            return
 

	
 
        blog_name = 'Software Freedom Conservancy News'
 
        blog_url = 'https://www.sfconservancy.org/news/'
 
        post_url = ('https://www.sfconservancy.org'
 
                    + self.get_absolute_url())
 

	
 
        import xmlrpc.client
 

	
 
        # Ping Technorati
 
        j = xmlrpc.client.Server('http://rpc.technorati.com/rpc/ping')
 
        j.weblogUpdates.ping(blog_name, blog_url)
 

	
 
        # Ping Google Blog Search
 
        j = xmlrpc.client.Server('http://blogsearch.google.com/ping/RPC2')
 
        j.weblogUpdates.ping(blog_name, blog_url, post_url)
 

	
 
        # Call any superclass's method
 
        super().save()
 

	
 
class ExternalArticleTag(models.Model):
 
    """A way to tag external articles"""
 

	
 
    label = models.CharField(max_length=100)
 

	
 
    date_created = models.DateField(auto_now_add=True)
 

	
 
    def __str__(self):
 
        return self.label
 

	
 
class PublicExternalArticleManager(models.Manager):
 
    def get_queryset(self):
 
        return super().get_queryset().filter(visible=True)
 

	
 
class ExternalArticle(models.Model):
 
    """A system for displaying Conservancy news mentions on the site.
 

	
 
    (Currently unused)
 
    """
 

	
 
    title = models.CharField(max_length=400)
 
    info = models.CharField(help_text="subscribers only? audio? pdf warning?",
 
                            blank=True, max_length=300)
 
    publication = models.CharField("source of article", max_length=300)
 
    # verify_exists removed https://docs.djangoproject.com/en/1.7/releases/1.4/
 
    url = models.URLField(blank=True)
 
    date = models.DateField()
 
    visible = models.BooleanField(help_text="Whether to display on website", default=True)
 

	
 
    tags = models.ManyToManyField(ExternalArticleTag, blank=True)
 
    people = models.ManyToManyField(Person, blank=True)
 
    event = models.ForeignKey(Event, null=True, blank=True, on_delete=models.CASCADE)
 
    press_release = models.ForeignKey(PressRelease, null=True, blank=True, on_delete=models.CASCADE)
 

	
 
    date_created = models.DateField(auto_now_add=True)
 

	
 
    class Meta:
 
        ordering = ("-date_created",)
 
        get_latest_by = "date_created"
 

	
 
    def __str__(self):
 
        return "{} ({})".format(self.title, self.publication)
 

	
 
    objects = models.Manager()
 
    public = PublicExternalArticleManager()
 

	
conservancy/news/views.py
Show inline comments
 
from datetime import datetime
 

	
 
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
 
from django.shortcuts import render
 
from django.views.generic import ListView
 
from django.views.generic.dates import (
 
    DateDetailView,
 
    DayArchiveView,
 
    MonthArchiveView,
 
    YearArchiveView,
 
)
 

	
 
from .models import PressRelease
 

	
 

	
 
class NewsListView(ListView):
 
    extra_context = {}
 
    def get_context_data(self, **kwargs):
 
        context = super().get_context_data(**kwargs)
 
        # context['key'] = 'value'
 
        context.update(self.extra_context)
 
        return context
 

	
 
def listing(request, *args, **kwargs):
 
    news_queryset = PressRelease.objects.all()
 

	
 
#    if (not kwargs.has_key('allow_future')) or not kwargs['allow_future']:
 
    news_queryset = news_queryset.filter(
 
        **{'%s__lte' % kwargs['date_field']: datetime.now()}
 
    )
 

	
 
    date_list = news_queryset.dates(kwargs['date_field'], 'year')
 

	
 
    paginate_by = kwargs.get('paginate_by', 6)  # Show 6 news items per page, by default
 
    paginator = Paginator(news_queryset, paginate_by)
 

	
 
    page = request.GET.get('page')
 
    try:
 
        news = paginator.page(page)
 
    except PageNotAnInteger:
 
        # If page is not an integer, deliver first page.
 
        news = paginator.page(1)
 
    except EmptyPage:
 
        # If page is out of range (e.g. 9999), deliver last page of results.
 
        news = paginator.page(paginator.num_pages)
 

	
 
    return render(request, 'news/pressrelease_list.html', {"news": news, "date_list" : date_list})
 

	
 
class NewsYearArchiveView(YearArchiveView):
 
    # queryset = Article.objects.all()
 
    # date_field = "pub_date"
 
    make_object_list = True
 
    allow_future = True
 

	
 
# def archive_year(request, **kwargs):
 
#     callable = NewsYearArchiveView.as_view(**kwargs)
 
#     return callable(request)
 

	
 
class NewsMonthArchiveView(MonthArchiveView):
 
    allow_future = True
 

	
 
# def archive_month(request, **kwargs):
 
#     # return HttpResponse("archive_month")
 
#     callable = NewsMonthArchiveView.as_view(**kwargs)
 
#     return callable(request)
 

	
 
class NewsDayArchiveView(DayArchiveView):
 
    allow_future = True
 

	
 
# def archive_day(request, **kwargs):
 
#     # return HttpResponse("archive_day")
 
#     callable = NewsDayArchiveView.as_view(**kwargs)
 
#     return callable(request)
 

	
 
class NewsDateDetailView(DateDetailView):
 
    # extra_context = {}
 
    allow_future = True
 
    # slug_url_kwarg = 'slug'
 

	
 
    # def get_context_data(self, **kwargs):
 
    #     context = super(NewsDateDetailView, self).get_context_data(**kwargs)
 
    #     context.update(self.extra_context)
 
    #     return context
 

	
 
# def object_detail(request, **kwargs):
 
#     # extra_context = {}
 
#     # extra_context['slug'] = kwargs['slug']
 
#     # del kwargs['slug']
 
#     # kwargs['extra_context'] = extra_context
 
#     # return HttpResponse("object_detail: " + str(kwargs))
 
#     # slug = kwargs['slug']
 
#     # del kwargs['slug']
 
#     callable = NewsDateDetailView.as_view(**kwargs)
 
#     return callable(request)
 

	
conservancy/podjango/admin.py
Show inline comments
 
#  Copyright (C) 2008       Bradley M. Kuhn <bkuhn@ebb.org>
 
#  Copyright (C) 2006, 2007 Software Freedom Law Center, Inc.
 
#
 
# This software's license gives you freedom; you can copy, convey,
 
# propogate, redistribute and/or modify this program under the terms of
 
# the GNU Affero General Public License (AGPL) as published by the Free
 
# Software Foundation (FSF), either version 3 of the License, or (at your
 
# option) any later version of the AGPL published by the FSF.
 
#
 
# This program is distributed in the hope that it will be useful, but
 
# WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero
 
# General Public License for more details.
 
#
 
# You should have received a copy of the GNU Affero General Public License
 
# along with this program in a file in the toplevel directory called
 
# "AGPLv3".  If not, see <http://www.gnu.org/licenses/>.
 
#
 
from django.contrib import admin
 

	
 
from .models import Cast, CastTag, Podcast
 

	
 

	
 
@admin.register(Podcast)
 
class PodcastAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {'slug': ('title',)}
 

	
 

	
 
@admin.register(CastTag)
 
class CastTagAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {'slug': ('label',)}
 

	
 

	
 
@admin.register(Cast)
 
class CastAdmin(admin.ModelAdmin):
 
    list_display = ('pub_date', 'title')
 
    list_filter = ['pub_date', 'podcast']
 
    date_hierarchy = 'pub_date'
 
    search_fields = ['title', 'summary', 'body']
 
    prepopulated_fields = {'slug': ("title",)}
 
    filter_horizontal = ('tags',)
 

	
 

	
conservancy/staff/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Person
 

	
 

	
 
@admin.register(Person)
 
class PersonAdmin(admin.ModelAdmin):
 
    list_display = ("username", "formal_name", "casual_name",
 
                    "currently_employed")
 
    list_filter = ["currently_employed"]
 

	
conservancy/static/css/tachyons.min.css
Show inline comments
 
/*! TACHYONS v4.12.0 | http://tachyons.io */
 
/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}.border-box,a,article,aside,blockquote,body,code,dd,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,html,input[type=email],input[type=number],input[type=password],input[type=tel],input[type=text],input[type=url],legend,li,main,nav,ol,p,pre,section,table,td,textarea,th,tr,ul{box-sizing:border-box}.aspect-ratio{height:0;position:relative}.aspect-ratio--16x9{padding-bottom:56.25%}.aspect-ratio--9x16{padding-bottom:177.77%}.aspect-ratio--4x3{padding-bottom:75%}.aspect-ratio--3x4{padding-bottom:133.33%}.aspect-ratio--6x4{padding-bottom:66.6%}.aspect-ratio--4x6{padding-bottom:150%}.aspect-ratio--8x5{padding-bottom:62.5%}.aspect-ratio--5x8{padding-bottom:160%}.aspect-ratio--7x5{padding-bottom:71.42%}.aspect-ratio--5x7{padding-bottom:140%}.aspect-ratio--1x1{padding-bottom:100%}.aspect-ratio--object{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}img{max-width:100%}.cover{background-size:cover!important}.contain{background-size:contain!important}.bg-center{background-position:50%}.bg-center,.bg-top{background-repeat:no-repeat}.bg-top{background-position:top}.bg-right{background-position:100%}.bg-bottom,.bg-right{background-repeat:no-repeat}.bg-bottom{background-position:bottom}.bg-left{background-repeat:no-repeat;background-position:0}.outline{outline:1px solid}.outline-transparent{outline:1px solid transparent}.outline-0{outline:0}.ba{border-style:solid;border-width:1px}.bt{border-top-style:solid;border-top-width:1px}.br{border-right-style:solid;border-right-width:1px}.bb{border-bottom-style:solid;border-bottom-width:1px}.bl{border-left-style:solid;border-left-width:1px}.bn{border-style:none;border-width:0}.b--black{border-color:#000}.b--near-black{border-color:#111}.b--dark-gray{border-color:#333}.b--mid-gray{border-color:#555}.b--gray{border-color:#777}.b--silver{border-color:#999}.b--light-silver{border-color:#aaa}.b--moon-gray{border-color:#ccc}.b--light-gray{border-color:#eee}.b--near-white{border-color:#f4f4f4}.b--white{border-color:#fff}.b--white-90{border-color:hsla(0,0%,100%,.9)}.b--white-80{border-color:hsla(0,0%,100%,.8)}.b--white-70{border-color:hsla(0,0%,100%,.7)}.b--white-60{border-color:hsla(0,0%,100%,.6)}.b--white-50{border-color:hsla(0,0%,100%,.5)}.b--white-40{border-color:hsla(0,0%,100%,.4)}.b--white-30{border-color:hsla(0,0%,100%,.3)}.b--white-20{border-color:hsla(0,0%,100%,.2)}.b--white-10{border-color:hsla(0,0%,100%,.1)}.b--white-05{border-color:hsla(0,0%,100%,.05)}.b--white-025{border-color:hsla(0,0%,100%,.025)}.b--white-0125{border-color:hsla(0,0%,100%,.0125)}.b--black-90{border-color:rgba(0,0,0,.9)}.b--black-80{border-color:rgba(0,0,0,.8)}.b--black-70{border-color:rgba(0,0,0,.7)}.b--black-60{border-color:rgba(0,0,0,.6)}.b--black-50{border-color:rgba(0,0,0,.5)}.b--black-40{border-color:rgba(0,0,0,.4)}.b--black-30{border-color:rgba(0,0,0,.3)}.b--black-20{border-color:rgba(0,0,0,.2)}.b--black-10{border-color:rgba(0,0,0,.1)}.b--black-05{border-color:rgba(0,0,0,.05)}.b--black-025{border-color:rgba(0,0,0,.025)}.b--black-0125{border-color:rgba(0,0,0,.0125)}.b--dark-red{border-color:#e7040f}.b--red{border-color:#ff4136}.b--light-red{border-color:#ff725c}.b--orange{border-color:#ff6300}.b--gold{border-color:#ffb700}.b--yellow{border-color:gold}.b--light-yellow{border-color:#fbf1a9}.b--purple{border-color:#5e2ca5}.b--light-purple{border-color:#a463f2}.b--dark-pink{border-color:#d5008f}.b--hot-pink{border-color:#ff41b4}.b--pink{border-color:#ff80cc}.b--light-pink{border-color:#ffa3d7}.b--dark-green{border-color:#137752}.b--green{border-color:#19a974}.b--light-green{border-color:#9eebcf}.b--navy{border-color:#001b44}.b--dark-blue{border-color:#00449e}.b--blue{border-color:#357edd}.b--light-blue{border-color:#96ccff}.b--lightest-blue{border-color:#cdecff}.b--washed-blue{border-color:#f6fffe}.b--washed-green{border-color:#e8fdf5}.b--washed-yellow{border-color:#fffceb}.b--washed-red{border-color:#ffdfdf}.b--transparent{border-color:transparent}.b--inherit{border-color:inherit}.b--initial{border-color:initial}.b--unset{border-color:unset}.br0{border-radius:0}.br1{border-radius:.125rem}.br2{border-radius:.25rem}.br3{border-radius:.5rem}.br4{border-radius:1rem}.br-100{border-radius:100%}.br-pill{border-radius:9999px}.br--bottom{border-top-left-radius:0;border-top-right-radius:0}.br--top{border-bottom-right-radius:0}.br--right,.br--top{border-bottom-left-radius:0}.br--right{border-top-left-radius:0}.br--left{border-top-right-radius:0;border-bottom-right-radius:0}.br-inherit{border-radius:inherit}.br-initial{border-radius:initial}.br-unset{border-radius:unset}.b--dotted{border-style:dotted}.b--dashed{border-style:dashed}.b--solid{border-style:solid}.b--none{border-style:none}.bw0{border-width:0}.bw1{border-width:.125rem}.bw2{border-width:.25rem}.bw3{border-width:.5rem}.bw4{border-width:1rem}.bw5{border-width:2rem}.bt-0{border-top-width:0}.br-0{border-right-width:0}.bb-0{border-bottom-width:0}.bl-0{border-left-width:0}.shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-1{top:1rem}.right-1{right:1rem}.bottom-1{bottom:1rem}.left-1{left:1rem}.top-2{top:2rem}.right-2{right:2rem}.bottom-2{bottom:2rem}.left-2{left:2rem}.top--1{top:-1rem}.right--1{right:-1rem}.bottom--1{bottom:-1rem}.left--1{left:-1rem}.top--2{top:-2rem}.right--2{right:-2rem}.bottom--2{bottom:-2rem}.left--2{left:-2rem}.absolute--fill{top:0;right:0;bottom:0;left:0}.cf:after,.cf:before{content:" ";display:table}.cf:after{clear:both}.cf{*zoom:1}.cl{clear:left}.cr{clear:right}.cb{clear:both}.cn{clear:none}.dn{display:none}.di{display:inline}.db{display:block}.dib{display:inline-block}.dit{display:inline-table}.dt{display:table}.dtc{display:table-cell}.dt-row{display:table-row}.dt-row-group{display:table-row-group}.dt-column{display:table-column}.dt-column-group{display:table-column-group}.dt--fixed{table-layout:fixed;width:100%}.flex{display:flex}.inline-flex{display:inline-flex}.flex-auto{flex:1 1 auto;min-width:0;min-height:0}.flex-none{flex:none}.flex-column{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-column-reverse{flex-direction:column-reverse}.flex-row-reverse{flex-direction:row-reverse}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-baseline{align-self:baseline}.self-stretch{align-self:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-center{align-content:center}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-stretch{align-content:stretch}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-last{order:99999}.flex-grow-0{flex-grow:0}.flex-grow-1{flex-grow:1}.flex-shrink-0{flex-shrink:0}.flex-shrink-1{flex-shrink:1}.fl{float:left}.fl,.fr{_display:inline}.fr{float:right}.fn{float:none}.sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica neue,helvetica,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.serif{font-family:georgia,times,serif}.system-sans-serif{font-family:sans-serif}.system-serif{font-family:serif}.code,code{font-family:Consolas,monaco,monospace}.courier{font-family:Courier Next,courier,monospace}.helvetica{font-family:helvetica neue,helvetica,sans-serif}.avenir{font-family:avenir next,avenir,sans-serif}.athelas{font-family:athelas,georgia,serif}.georgia{font-family:georgia,serif}.times{font-family:times,serif}.bodoni{font-family:Bodoni MT,serif}.calisto{font-family:Calisto MT,serif}.garamond{font-family:garamond,serif}.baskerville{font-family:baskerville,serif}.i{font-style:italic}.fs-normal{font-style:normal}.normal{font-weight:400}.b{font-weight:700}.fw1{font-weight:100}.fw2{font-weight:200}.fw3{font-weight:300}.fw4{font-weight:400}.fw5{font-weight:500}.fw6{font-weight:600}.fw7{font-weight:700}.fw8{font-weight:800}.fw9{font-weight:900}.input-reset{-webkit-appearance:none;-moz-appearance:none}.button-reset::-moz-focus-inner,.input-reset::-moz-focus-inner{border:0;padding:0}.h1{height:1rem}.h2{height:2rem}.h3{height:4rem}.h4{height:8rem}.h5{height:16rem}.h-25{height:25%}.h-50{height:50%}.h-75{height:75%}.h-100{height:100%}.min-h-100{min-height:100%}.vh-25{height:25vh}.vh-50{height:50vh}.vh-75{height:75vh}.vh-100{height:100vh}.min-vh-100{min-height:100vh}.h-auto{height:auto}.h-inherit{height:inherit}.tracked{letter-spacing:.1em}.tracked-tight{letter-spacing:-.05em}.tracked-mega{letter-spacing:.25em}.lh-solid{line-height:1}.lh-title{line-height:1.25}.lh-copy{line-height:1.5}.link{text-decoration:none}.link,.link:active,.link:focus,.link:hover,.link:link,.link:visited{transition:color .15s ease-in}.link:focus{outline:1px dotted currentColor}.list{list-style-type:none}.mw-100{max-width:100%}.mw1{max-width:1rem}.mw2{max-width:2rem}.mw3{max-width:4rem}.mw4{max-width:8rem}.mw5{max-width:16rem}.mw6{max-width:32rem}.mw7{max-width:48rem}.mw8{max-width:64rem}.mw9{max-width:96rem}.mw-none{max-width:none}.w1{width:1rem}.w2{width:2rem}.w3{width:4rem}.w4{width:8rem}.w5{width:16rem}.w-10{width:10%}.w-20{width:20%}.w-25{width:25%}.w-30{width:30%}.w-33{width:33%}.w-34{width:34%}.w-40{width:40%}.w-50{width:50%}.w-60{width:60%}.w-70{width:70%}.w-75{width:75%}.w-80{width:80%}.w-90{width:90%}.w-100{width:100%}.w-third{width:33.33333%}.w-two-thirds{width:66.66667%}.w-auto{width:auto}.overflow-visible{overflow:visible}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-auto{overflow:auto}.overflow-x-visible{overflow-x:visible}.overflow-x-hidden{overflow-x:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-visible{overflow-y:visible}.overflow-y-hidden{overflow-y:hidden}.overflow-y-scroll{overflow-y:scroll}.overflow-y-auto{overflow-y:auto}.static{position:static}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.o-100{opacity:1}.o-90{opacity:.9}.o-80{opacity:.8}.o-70{opacity:.7}.o-60{opacity:.6}.o-50{opacity:.5}.o-40{opacity:.4}.o-30{opacity:.3}.o-20{opacity:.2}.o-10{opacity:.1}.o-05{opacity:.05}.o-025{opacity:.025}.o-0{opacity:0}.rotate-45{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.black-90{color:rgba(0,0,0,.9)}.black-80{color:rgba(0,0,0,.8)}.black-70{color:rgba(0,0,0,.7)}.black-60{color:rgba(0,0,0,.6)}.black-50{color:rgba(0,0,0,.5)}.black-40{color:rgba(0,0,0,.4)}.black-30{color:rgba(0,0,0,.3)}.black-20{color:rgba(0,0,0,.2)}.black-10{color:rgba(0,0,0,.1)}.black-05{color:rgba(0,0,0,.05)}.white-90{color:hsla(0,0%,100%,.9)}.white-80{color:hsla(0,0%,100%,.8)}.white-70{color:hsla(0,0%,100%,.7)}.white-60{color:hsla(0,0%,100%,.6)}.white-50{color:hsla(0,0%,100%,.5)}.white-40{color:hsla(0,0%,100%,.4)}.white-30{color:hsla(0,0%,100%,.3)}.white-20{color:hsla(0,0%,100%,.2)}.white-10{color:hsla(0,0%,100%,.1)}.black{color:#000}.near-black{color:#111}.dark-gray{color:#333}.mid-gray{color:#555}.gray{color:#777}.silver{color:#999}.light-silver{color:#aaa}.moon-gray{color:#ccc}.light-gray{color:#eee}.near-white{color:#f4f4f4}.white{color:#fff}.dark-red{color:#e7040f}.red{color:#ff4136}.light-red{color:#ff725c}.orange{color:#ff6300}.gold{color:#ffb700}.yellow{color:gold}.light-yellow{color:#fbf1a9}.purple{color:#5e2ca5}.light-purple{color:#a463f2}.dark-pink{color:#d5008f}.hot-pink{color:#ff41b4}.pink{color:#ff80cc}.light-pink{color:#ffa3d7}.dark-green{color:#137752}.green{color:#19a974}.light-green{color:#9eebcf}.navy{color:#001b44}.dark-blue{color:#00449e}.blue{color:#357edd}.light-blue{color:#96ccff}.lightest-blue{color:#cdecff}.washed-blue{color:#f6fffe}.washed-green{color:#e8fdf5}.washed-yellow{color:#fffceb}.washed-red{color:#ffdfdf}.color-inherit{color:inherit}.bg-black-90{background-color:rgba(0,0,0,.9)}.bg-black-80{background-color:rgba(0,0,0,.8)}.bg-black-70{background-color:rgba(0,0,0,.7)}.bg-black-60{background-color:rgba(0,0,0,.6)}.bg-black-50{background-color:rgba(0,0,0,.5)}.bg-black-40{background-color:rgba(0,0,0,.4)}.bg-black-30{background-color:rgba(0,0,0,.3)}.bg-black-20{background-color:rgba(0,0,0,.2)}.bg-black-10{background-color:rgba(0,0,0,.1)}.bg-black-05{background-color:rgba(0,0,0,.05)}.bg-white-90{background-color:hsla(0,0%,100%,.9)}.bg-white-80{background-color:hsla(0,0%,100%,.8)}.bg-white-70{background-color:hsla(0,0%,100%,.7)}.bg-white-60{background-color:hsla(0,0%,100%,.6)}.bg-white-50{background-color:hsla(0,0%,100%,.5)}.bg-white-40{background-color:hsla(0,0%,100%,.4)}.bg-white-30{background-color:hsla(0,0%,100%,.3)}.bg-white-20{background-color:hsla(0,0%,100%,.2)}.bg-white-10{background-color:hsla(0,0%,100%,.1)}.bg-black{background-color:#000}.bg-near-black{background-color:#111}.bg-dark-gray{background-color:#333}.bg-mid-gray{background-color:#555}.bg-gray{background-color:#777}.bg-silver{background-color:#999}.bg-light-silver{background-color:#aaa}.bg-moon-gray{background-color:#ccc}.bg-light-gray{background-color:#eee}.bg-near-white{background-color:#f4f4f4}.bg-white{background-color:#fff}.bg-transparent{background-color:transparent}.bg-dark-red{background-color:#e7040f}.bg-red{background-color:#ff4136}.bg-light-red{background-color:#ff725c}.bg-orange{background-color:#ff6300}.bg-gold{background-color:#ffb700}.bg-yellow{background-color:gold}.bg-light-yellow{background-color:#fbf1a9}.bg-purple{background-color:#5e2ca5}.bg-light-purple{background-color:#a463f2}.bg-dark-pink{background-color:#d5008f}.bg-hot-pink{background-color:#ff41b4}.bg-pink{background-color:#ff80cc}.bg-light-pink{background-color:#ffa3d7}.bg-dark-green{background-color:#137752}.bg-green{background-color:#19a974}.bg-light-green{background-color:#9eebcf}.bg-navy{background-color:#001b44}.bg-dark-blue{background-color:#00449e}.bg-blue{background-color:#357edd}.bg-light-blue{background-color:#96ccff}.bg-lightest-blue{background-color:#cdecff}.bg-washed-blue{background-color:#f6fffe}.bg-washed-green{background-color:#e8fdf5}.bg-washed-yellow{background-color:#fffceb}.bg-washed-red{background-color:#ffdfdf}.bg-inherit{background-color:inherit}.hover-black:focus,.hover-black:hover{color:#000}.hover-near-black:focus,.hover-near-black:hover{color:#111}.hover-dark-gray:focus,.hover-dark-gray:hover{color:#333}.hover-mid-gray:focus,.hover-mid-gray:hover{color:#555}.hover-gray:focus,.hover-gray:hover{color:#777}.hover-silver:focus,.hover-silver:hover{color:#999}.hover-light-silver:focus,.hover-light-silver:hover{color:#aaa}.hover-moon-gray:focus,.hover-moon-gray:hover{color:#ccc}.hover-light-gray:focus,.hover-light-gray:hover{color:#eee}.hover-near-white:focus,.hover-near-white:hover{color:#f4f4f4}.hover-white:focus,.hover-white:hover{color:#fff}.hover-black-90:focus,.hover-black-90:hover{color:rgba(0,0,0,.9)}.hover-black-80:focus,.hover-black-80:hover{color:rgba(0,0,0,.8)}.hover-black-70:focus,.hover-black-70:hover{color:rgba(0,0,0,.7)}.hover-black-60:focus,.hover-black-60:hover{color:rgba(0,0,0,.6)}.hover-black-50:focus,.hover-black-50:hover{color:rgba(0,0,0,.5)}.hover-black-40:focus,.hover-black-40:hover{color:rgba(0,0,0,.4)}.hover-black-30:focus,.hover-black-30:hover{color:rgba(0,0,0,.3)}.hover-black-20:focus,.hover-black-20:hover{color:rgba(0,0,0,.2)}.hover-black-10:focus,.hover-black-10:hover{color:rgba(0,0,0,.1)}.hover-white-90:focus,.hover-white-90:hover{color:hsla(0,0%,100%,.9)}.hover-white-80:focus,.hover-white-80:hover{color:hsla(0,0%,100%,.8)}.hover-white-70:focus,.hover-white-70:hover{color:hsla(0,0%,100%,.7)}.hover-white-60:focus,.hover-white-60:hover{color:hsla(0,0%,100%,.6)}.hover-white-50:focus,.hover-white-50:hover{color:hsla(0,0%,100%,.5)}.hover-white-40:focus,.hover-white-40:hover{color:hsla(0,0%,100%,.4)}.hover-white-30:focus,.hover-white-30:hover{color:hsla(0,0%,100%,.3)}.hover-white-20:focus,.hover-white-20:hover{color:hsla(0,0%,100%,.2)}.hover-white-10:focus,.hover-white-10:hover{color:hsla(0,0%,100%,.1)}.hover-inherit:focus,.hover-inherit:hover{color:inherit}.hover-bg-black:focus,.hover-bg-black:hover{background-color:#000}.hover-bg-near-black:focus,.hover-bg-near-black:hover{background-color:#111}.hover-bg-dark-gray:focus,.hover-bg-dark-gray:hover{background-color:#333}.hover-bg-mid-gray:focus,.hover-bg-mid-gray:hover{background-color:#555}.hover-bg-gray:focus,.hover-bg-gray:hover{background-color:#777}.hover-bg-silver:focus,.hover-bg-silver:hover{background-color:#999}.hover-bg-light-silver:focus,.hover-bg-light-silver:hover{background-color:#aaa}.hover-bg-moon-gray:focus,.hover-bg-moon-gray:hover{background-color:#ccc}.hover-bg-light-gray:focus,.hover-bg-light-gray:hover{background-color:#eee}.hover-bg-near-white:focus,.hover-bg-near-white:hover{background-color:#f4f4f4}.hover-bg-white:focus,.hover-bg-white:hover{background-color:#fff}.hover-bg-transparent:focus,.hover-bg-transparent:hover{background-color:transparent}.hover-bg-black-90:focus,.hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.hover-bg-black-80:focus,.hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.hover-bg-black-70:focus,.hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.hover-bg-black-60:focus,.hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.hover-bg-black-50:focus,.hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.hover-bg-black-40:focus,.hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.hover-bg-black-30:focus,.hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.hover-bg-black-20:focus,.hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.hover-bg-black-10:focus,.hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.hover-bg-white-90:focus,.hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.hover-bg-white-80:focus,.hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.hover-bg-white-70:focus,.hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.hover-bg-white-60:focus,.hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.hover-bg-white-50:focus,.hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.hover-bg-white-40:focus,.hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.hover-bg-white-30:focus,.hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.hover-bg-white-20:focus,.hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.hover-bg-white-10:focus,.hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.hover-dark-red:focus,.hover-dark-red:hover{color:#e7040f}.hover-red:focus,.hover-red:hover{color:#ff4136}.hover-light-red:focus,.hover-light-red:hover{color:#ff725c}.hover-orange:focus,.hover-orange:hover{color:#ff6300}.hover-gold:focus,.hover-gold:hover{color:#ffb700}.hover-yellow:focus,.hover-yellow:hover{color:gold}.hover-light-yellow:focus,.hover-light-yellow:hover{color:#fbf1a9}.hover-purple:focus,.hover-purple:hover{color:#5e2ca5}.hover-light-purple:focus,.hover-light-purple:hover{color:#a463f2}.hover-dark-pink:focus,.hover-dark-pink:hover{color:#d5008f}.hover-hot-pink:focus,.hover-hot-pink:hover{color:#ff41b4}.hover-pink:focus,.hover-pink:hover{color:#ff80cc}.hover-light-pink:focus,.hover-light-pink:hover{color:#ffa3d7}.hover-dark-green:focus,.hover-dark-green:hover{color:#137752}.hover-green:focus,.hover-green:hover{color:#19a974}.hover-light-green:focus,.hover-light-green:hover{color:#9eebcf}.hover-navy:focus,.hover-navy:hover{color:#001b44}.hover-dark-blue:focus,.hover-dark-blue:hover{color:#00449e}.hover-blue:focus,.hover-blue:hover{color:#357edd}.hover-light-blue:focus,.hover-light-blue:hover{color:#96ccff}.hover-lightest-blue:focus,.hover-lightest-blue:hover{color:#cdecff}.hover-washed-blue:focus,.hover-washed-blue:hover{color:#f6fffe}.hover-washed-green:focus,.hover-washed-green:hover{color:#e8fdf5}.hover-washed-yellow:focus,.hover-washed-yellow:hover{color:#fffceb}.hover-washed-red:focus,.hover-washed-red:hover{color:#ffdfdf}.hover-bg-dark-red:focus,.hover-bg-dark-red:hover{background-color:#e7040f}.hover-bg-red:focus,.hover-bg-red:hover{background-color:#ff4136}.hover-bg-light-red:focus,.hover-bg-light-red:hover{background-color:#ff725c}.hover-bg-orange:focus,.hover-bg-orange:hover{background-color:#ff6300}.hover-bg-gold:focus,.hover-bg-gold:hover{background-color:#ffb700}.hover-bg-yellow:focus,.hover-bg-yellow:hover{background-color:gold}.hover-bg-light-yellow:focus,.hover-bg-light-yellow:hover{background-color:#fbf1a9}.hover-bg-purple:focus,.hover-bg-purple:hover{background-color:#5e2ca5}.hover-bg-light-purple:focus,.hover-bg-light-purple:hover{background-color:#a463f2}.hover-bg-dark-pink:focus,.hover-bg-dark-pink:hover{background-color:#d5008f}.hover-bg-hot-pink:focus,.hover-bg-hot-pink:hover{background-color:#ff41b4}.hover-bg-pink:focus,.hover-bg-pink:hover{background-color:#ff80cc}.hover-bg-light-pink:focus,.hover-bg-light-pink:hover{background-color:#ffa3d7}.hover-bg-dark-green:focus,.hover-bg-dark-green:hover{background-color:#137752}.hover-bg-green:focus,.hover-bg-green:hover{background-color:#19a974}.hover-bg-light-green:focus,.hover-bg-light-green:hover{background-color:#9eebcf}.hover-bg-navy:focus,.hover-bg-navy:hover{background-color:#001b44}.hover-bg-dark-blue:focus,.hover-bg-dark-blue:hover{background-color:#00449e}.hover-bg-blue:focus,.hover-bg-blue:hover{background-color:#357edd}.hover-bg-light-blue:focus,.hover-bg-light-blue:hover{background-color:#96ccff}.hover-bg-lightest-blue:focus,.hover-bg-lightest-blue:hover{background-color:#cdecff}.hover-bg-washed-blue:focus,.hover-bg-washed-blue:hover{background-color:#f6fffe}.hover-bg-washed-green:focus,.hover-bg-washed-green:hover{background-color:#e8fdf5}.hover-bg-washed-yellow:focus,.hover-bg-washed-yellow:hover{background-color:#fffceb}.hover-bg-washed-red:focus,.hover-bg-washed-red:hover{background-color:#ffdfdf}.hover-bg-inherit:focus,.hover-bg-inherit:hover{background-color:inherit}.pa0{padding:0}.pa1{padding:.25rem}.pa2{padding:.5rem}.pa3{padding:1rem}.pa4{padding:2rem}.pa5{padding:4rem}.pa6{padding:8rem}.pa7{padding:16rem}.pl0{padding-left:0}.pl1{padding-left:.25rem}.pl2{padding-left:.5rem}.pl3{padding-left:1rem}.pl4{padding-left:2rem}.pl5{padding-left:4rem}.pl6{padding-left:8rem}.pl7{padding-left:16rem}.pr0{padding-right:0}.pr1{padding-right:.25rem}.pr2{padding-right:.5rem}.pr3{padding-right:1rem}.pr4{padding-right:2rem}.pr5{padding-right:4rem}.pr6{padding-right:8rem}.pr7{padding-right:16rem}.pb0{padding-bottom:0}.pb1{padding-bottom:.25rem}.pb2{padding-bottom:.5rem}.pb3{padding-bottom:1rem}.pb4{padding-bottom:2rem}.pb5{padding-bottom:4rem}.pb6{padding-bottom:8rem}.pb7{padding-bottom:16rem}.pt0{padding-top:0}.pt1{padding-top:.25rem}.pt2{padding-top:.5rem}.pt3{padding-top:1rem}.pt4{padding-top:2rem}.pt5{padding-top:4rem}.pt6{padding-top:8rem}.pt7{padding-top:16rem}.pv0{padding-top:0;padding-bottom:0}.pv1{padding-top:.25rem;padding-bottom:.25rem}.pv2{padding-top:.5rem;padding-bottom:.5rem}.pv3{padding-top:1rem;padding-bottom:1rem}.pv4{padding-top:2rem;padding-bottom:2rem}.pv5{padding-top:4rem;padding-bottom:4rem}.pv6{padding-top:8rem;padding-bottom:8rem}.pv7{padding-top:16rem;padding-bottom:16rem}.ph0{padding-left:0;padding-right:0}.ph1{padding-left:.25rem;padding-right:.25rem}.ph2{padding-left:.5rem;padding-right:.5rem}.ph3{padding-left:1rem;padding-right:1rem}.ph4{padding-left:2rem;padding-right:2rem}.ph5{padding-left:4rem;padding-right:4rem}.ph6{padding-left:8rem;padding-right:8rem}.ph7{padding-left:16rem;padding-right:16rem}.ma0{margin:0}.ma1{margin:.25rem}.ma2{margin:.5rem}.ma3{margin:1rem}.ma4{margin:2rem}.ma5{margin:4rem}.ma6{margin:8rem}.ma7{margin:16rem}.ml0{margin-left:0}.ml1{margin-left:.25rem}.ml2{margin-left:.5rem}.ml3{margin-left:1rem}.ml4{margin-left:2rem}.ml5{margin-left:4rem}.ml6{margin-left:8rem}.ml7{margin-left:16rem}.mr0{margin-right:0}.mr1{margin-right:.25rem}.mr2{margin-right:.5rem}.mr3{margin-right:1rem}.mr4{margin-right:2rem}.mr5{margin-right:4rem}.mr6{margin-right:8rem}.mr7{margin-right:16rem}.mb0{margin-bottom:0}.mb1{margin-bottom:.25rem}.mb2{margin-bottom:.5rem}.mb3{margin-bottom:1rem}.mb4{margin-bottom:2rem}.mb5{margin-bottom:4rem}.mb6{margin-bottom:8rem}.mb7{margin-bottom:16rem}.mt0{margin-top:0}.mt1{margin-top:.25rem}.mt2{margin-top:.5rem}.mt3{margin-top:1rem}.mt4{margin-top:2rem}.mt5{margin-top:4rem}.mt6{margin-top:8rem}.mt7{margin-top:16rem}.mv0{margin-top:0;margin-bottom:0}.mv1{margin-top:.25rem;margin-bottom:.25rem}.mv2{margin-top:.5rem;margin-bottom:.5rem}.mv3{margin-top:1rem;margin-bottom:1rem}.mv4{margin-top:2rem;margin-bottom:2rem}.mv5{margin-top:4rem;margin-bottom:4rem}.mv6{margin-top:8rem;margin-bottom:8rem}.mv7{margin-top:16rem;margin-bottom:16rem}.mh0{margin-left:0;margin-right:0}.mh1{margin-left:.25rem;margin-right:.25rem}.mh2{margin-left:.5rem;margin-right:.5rem}.mh3{margin-left:1rem;margin-right:1rem}.mh4{margin-left:2rem;margin-right:2rem}.mh5{margin-left:4rem;margin-right:4rem}.mh6{margin-left:8rem;margin-right:8rem}.mh7{margin-left:16rem;margin-right:16rem}.na1{margin:-.25rem}.na2{margin:-.5rem}.na3{margin:-1rem}.na4{margin:-2rem}.na5{margin:-4rem}.na6{margin:-8rem}.na7{margin:-16rem}.nl1{margin-left:-.25rem}.nl2{margin-left:-.5rem}.nl3{margin-left:-1rem}.nl4{margin-left:-2rem}.nl5{margin-left:-4rem}.nl6{margin-left:-8rem}.nl7{margin-left:-16rem}.nr1{margin-right:-.25rem}.nr2{margin-right:-.5rem}.nr3{margin-right:-1rem}.nr4{margin-right:-2rem}.nr5{margin-right:-4rem}.nr6{margin-right:-8rem}.nr7{margin-right:-16rem}.nb1{margin-bottom:-.25rem}.nb2{margin-bottom:-.5rem}.nb3{margin-bottom:-1rem}.nb4{margin-bottom:-2rem}.nb5{margin-bottom:-4rem}.nb6{margin-bottom:-8rem}.nb7{margin-bottom:-16rem}.nt1{margin-top:-.25rem}.nt2{margin-top:-.5rem}.nt3{margin-top:-1rem}.nt4{margin-top:-2rem}.nt5{margin-top:-4rem}.nt6{margin-top:-8rem}.nt7{margin-top:-16rem}.collapse{border-collapse:collapse;border-spacing:0}.striped--light-silver:nth-child(odd){background-color:#aaa}.striped--moon-gray:nth-child(odd){background-color:#ccc}.striped--light-gray:nth-child(odd){background-color:#eee}.striped--near-white:nth-child(odd){background-color:#f4f4f4}.stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.strike{text-decoration:line-through}.underline{text-decoration:underline}.no-underline{text-decoration:none}.tl{text-align:left}.tr{text-align:right}.tc{text-align:center}.tj{text-align:justify}.ttc{text-transform:capitalize}.ttl{text-transform:lowercase}.ttu{text-transform:uppercase}.ttn{text-transform:none}.f-6,.f-headline{font-size:6rem}.f-5,.f-subheadline{font-size:5rem}.f1{font-size:3rem}.f2{font-size:2.25rem}.f3{font-size:1.5rem}.f4{font-size:1.25rem}.f5{font-size:1rem}.f6{font-size:.875rem}.f7{font-size:.75rem}.measure{max-width:30em}.measure-wide{max-width:34em}.measure-narrow{max-width:20em}.indent{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps{font-variant:small-caps}.truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.overflow-container{overflow-y:scroll}.center{margin-left:auto}.center,.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal{white-space:normal}.nowrap{white-space:nowrap}.pre{white-space:pre}.v-base{vertical-align:baseline}.v-mid{vertical-align:middle}.v-top{vertical-align:top}.v-btm{vertical-align:bottom}.dim{opacity:1}.dim,.dim:focus,.dim:hover{transition:opacity .15s ease-in}.dim:focus,.dim:hover{opacity:.5}.dim:active{opacity:.8;transition:opacity .15s ease-out}.glow,.glow:focus,.glow:hover{transition:opacity .15s ease-in}.glow:focus,.glow:hover{opacity:1}.hide-child .child{opacity:0;transition:opacity .15s ease-in}.hide-child:active .child,.hide-child:focus .child,.hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.underline-hover:focus,.underline-hover:hover{text-decoration:underline}.grow{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-out;transition:transform .25s ease-out;transition:transform .25s ease-out,-webkit-transform .25s ease-out}.grow:focus,.grow:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.grow:active{-webkit-transform:scale(.9);transform:scale(.9)}.grow-large{-moz-osx-font-smoothing:grayscale;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0);transition:-webkit-transform .25s ease-in-out;transition:transform .25s ease-in-out;transition:transform .25s ease-in-out,-webkit-transform .25s ease-in-out}.grow-large:focus,.grow-large:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.grow-large:active{-webkit-transform:scale(.95);transform:scale(.95)}.pointer:hover,.shadow-hover{cursor:pointer}.shadow-hover{position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.shadow-hover:after{content:"";box-shadow:0 0 16px 2px rgba(0,0,0,.2);border-radius:inherit;opacity:0;position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;transition:opacity .5s cubic-bezier(.165,.84,.44,1)}.shadow-hover:focus:after,.shadow-hover:hover:after{opacity:1}.bg-animate,.bg-animate:focus,.bg-animate:hover{transition:background-color .15s ease-in-out}.z-0{z-index:0}.z-1{z-index:1}.z-2{z-index:2}.z-3{z-index:3}.z-4{z-index:4}.z-5{z-index:5}.z-999{z-index:999}.z-9999{z-index:9999}.z-max{z-index:2147483647}.z-inherit{z-index:inherit}.z-initial{z-index:auto}.z-unset{z-index:unset}.nested-copy-line-height ol,.nested-copy-line-height p,.nested-copy-line-height ul{line-height:1.5}.nested-headline-line-height h1,.nested-headline-line-height h2,.nested-headline-line-height h3,.nested-headline-line-height h4,.nested-headline-line-height h5,.nested-headline-line-height h6{line-height:1.25}.nested-list-reset ol,.nested-list-reset ul{padding-left:0;margin-left:0;list-style-type:none}.nested-copy-indent p+p{text-indent:1em;margin-top:0;margin-bottom:0}.nested-copy-separator p+p{margin-top:1.5em}.nested-img img{width:100%;max-width:100%;display:block}.nested-links a{color:#357edd;transition:color .15s ease-in}.nested-links a:focus,.nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.debug *{outline:1px solid gold}.debug-white *{outline:1px solid #fff}.debug-black *{outline:1px solid #000}.debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAFElEQVR4AWPAC97/9x0eCsAEPgwAVLshdpENIxcAAAAASUVORK5CYII=) repeat 0 0}.debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMklEQVR4AWOgCLz/b0epAa6UGuBOqQHOQHLUgFEDnAbcBZ4UGwDOkiCnkIhdgNgNxAYAiYlD+8sEuo8AAAAASUVORK5CYII=) repeat 0 0}.debug-grid-8-solid{background:#fff url(data:image/gif;base64,R0lGODdhCAAIAPEAAADw/wDx/////wAAACwAAAAACAAIAAACDZQvgaeb/lxbAIKA8y0AOw==) repeat 0 0}.debug-grid-16-solid{background:#fff url(data:image/gif;base64,R0lGODdhEAAQAPEAAADw/wDx/xXy/////ywAAAAAEAAQAAACIZyPKckYDQFsb6ZqD85jZ2+BkwiRFKehhqQCQgDHcgwEBQA7) repeat 0 0}@media screen and (min-width:30em){.aspect-ratio-ns{height:0;position:relative}.aspect-ratio--16x9-ns{padding-bottom:56.25%}.aspect-ratio--9x16-ns{padding-bottom:177.77%}.aspect-ratio--4x3-ns{padding-bottom:75%}.aspect-ratio--3x4-ns{padding-bottom:133.33%}.aspect-ratio--6x4-ns{padding-bottom:66.6%}.aspect-ratio--4x6-ns{padding-bottom:150%}.aspect-ratio--8x5-ns{padding-bottom:62.5%}.aspect-ratio--5x8-ns{padding-bottom:160%}.aspect-ratio--7x5-ns{padding-bottom:71.42%}.aspect-ratio--5x7-ns{padding-bottom:140%}.aspect-ratio--1x1-ns{padding-bottom:100%}.aspect-ratio--object-ns{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}.cover-ns{background-size:cover!important}.contain-ns{background-size:contain!important}.bg-center-ns{background-position:50%}.bg-center-ns,.bg-top-ns{background-repeat:no-repeat}.bg-top-ns{background-position:top}.bg-right-ns{background-position:100%}.bg-bottom-ns,.bg-right-ns{background-repeat:no-repeat}.bg-bottom-ns{background-position:bottom}.bg-left-ns{background-repeat:no-repeat;background-position:0}.outline-ns{outline:1px solid}.outline-transparent-ns{outline:1px solid transparent}.outline-0-ns{outline:0}.ba-ns{border-style:solid;border-width:1px}.bt-ns{border-top-style:solid;border-top-width:1px}.br-ns{border-right-style:solid;border-right-width:1px}.bb-ns{border-bottom-style:solid;border-bottom-width:1px}.bl-ns{border-left-style:solid;border-left-width:1px}.bn-ns{border-style:none;border-width:0}.br0-ns{border-radius:0}.br1-ns{border-radius:.125rem}.br2-ns{border-radius:.25rem}.br3-ns{border-radius:.5rem}.br4-ns{border-radius:1rem}.br-100-ns{border-radius:100%}.br-pill-ns{border-radius:9999px}.br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.br--top-ns{border-bottom-right-radius:0}.br--right-ns,.br--top-ns{border-bottom-left-radius:0}.br--right-ns{border-top-left-radius:0}.br--left-ns{border-top-right-radius:0;border-bottom-right-radius:0}.br-inherit-ns{border-radius:inherit}.br-initial-ns{border-radius:initial}.br-unset-ns{border-radius:unset}.b--dotted-ns{border-style:dotted}.b--dashed-ns{border-style:dashed}.b--solid-ns{border-style:solid}.b--none-ns{border-style:none}.bw0-ns{border-width:0}.bw1-ns{border-width:.125rem}.bw2-ns{border-width:.25rem}.bw3-ns{border-width:.5rem}.bw4-ns{border-width:1rem}.bw5-ns{border-width:2rem}.bt-0-ns{border-top-width:0}.br-0-ns{border-right-width:0}.bb-0-ns{border-bottom-width:0}.bl-0-ns{border-left-width:0}.shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.top-0-ns{top:0}.left-0-ns{left:0}.right-0-ns{right:0}.bottom-0-ns{bottom:0}.top-1-ns{top:1rem}.left-1-ns{left:1rem}.right-1-ns{right:1rem}.bottom-1-ns{bottom:1rem}.top-2-ns{top:2rem}.left-2-ns{left:2rem}.right-2-ns{right:2rem}.bottom-2-ns{bottom:2rem}.top--1-ns{top:-1rem}.right--1-ns{right:-1rem}.bottom--1-ns{bottom:-1rem}.left--1-ns{left:-1rem}.top--2-ns{top:-2rem}.right--2-ns{right:-2rem}.bottom--2-ns{bottom:-2rem}.left--2-ns{left:-2rem}.absolute--fill-ns{top:0;right:0;bottom:0;left:0}.cl-ns{clear:left}.cr-ns{clear:right}.cb-ns{clear:both}.cn-ns{clear:none}.dn-ns{display:none}.di-ns{display:inline}.db-ns{display:block}.dib-ns{display:inline-block}.dit-ns{display:inline-table}.dt-ns{display:table}.dtc-ns{display:table-cell}.dt-row-ns{display:table-row}.dt-row-group-ns{display:table-row-group}.dt-column-ns{display:table-column}.dt-column-group-ns{display:table-column-group}.dt--fixed-ns{table-layout:fixed;width:100%}.flex-ns{display:flex}.inline-flex-ns{display:inline-flex}.flex-auto-ns{flex:1 1 auto;min-width:0;min-height:0}.flex-none-ns{flex:none}.flex-column-ns{flex-direction:column}.flex-row-ns{flex-direction:row}.flex-wrap-ns{flex-wrap:wrap}.flex-nowrap-ns{flex-wrap:nowrap}.flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.flex-column-reverse-ns{flex-direction:column-reverse}.flex-row-reverse-ns{flex-direction:row-reverse}.items-start-ns{align-items:flex-start}.items-end-ns{align-items:flex-end}.items-center-ns{align-items:center}.items-baseline-ns{align-items:baseline}.items-stretch-ns{align-items:stretch}.self-start-ns{align-self:flex-start}.self-end-ns{align-self:flex-end}.self-center-ns{align-self:center}.self-baseline-ns{align-self:baseline}.self-stretch-ns{align-self:stretch}.justify-start-ns{justify-content:flex-start}.justify-end-ns{justify-content:flex-end}.justify-center-ns{justify-content:center}.justify-between-ns{justify-content:space-between}.justify-around-ns{justify-content:space-around}.content-start-ns{align-content:flex-start}.content-end-ns{align-content:flex-end}.content-center-ns{align-content:center}.content-between-ns{align-content:space-between}.content-around-ns{align-content:space-around}.content-stretch-ns{align-content:stretch}.order-0-ns{order:0}.order-1-ns{order:1}.order-2-ns{order:2}.order-3-ns{order:3}.order-4-ns{order:4}.order-5-ns{order:5}.order-6-ns{order:6}.order-7-ns{order:7}.order-8-ns{order:8}.order-last-ns{order:99999}.flex-grow-0-ns{flex-grow:0}.flex-grow-1-ns{flex-grow:1}.flex-shrink-0-ns{flex-shrink:0}.flex-shrink-1-ns{flex-shrink:1}.fl-ns{float:left}.fl-ns,.fr-ns{_display:inline}.fr-ns{float:right}.fn-ns{float:none}.i-ns{font-style:italic}.fs-normal-ns{font-style:normal}.normal-ns{font-weight:400}.b-ns{font-weight:700}.fw1-ns{font-weight:100}.fw2-ns{font-weight:200}.fw3-ns{font-weight:300}.fw4-ns{font-weight:400}.fw5-ns{font-weight:500}.fw6-ns{font-weight:600}.fw7-ns{font-weight:700}.fw8-ns{font-weight:800}.fw9-ns{font-weight:900}.h1-ns{height:1rem}.h2-ns{height:2rem}.h3-ns{height:4rem}.h4-ns{height:8rem}.h5-ns{height:16rem}.h-25-ns{height:25%}.h-50-ns{height:50%}.h-75-ns{height:75%}.h-100-ns{height:100%}.min-h-100-ns{min-height:100%}.vh-25-ns{height:25vh}.vh-50-ns{height:50vh}.vh-75-ns{height:75vh}.vh-100-ns{height:100vh}.min-vh-100-ns{min-height:100vh}.h-auto-ns{height:auto}.h-inherit-ns{height:inherit}.tracked-ns{letter-spacing:.1em}.tracked-tight-ns{letter-spacing:-.05em}.tracked-mega-ns{letter-spacing:.25em}.lh-solid-ns{line-height:1}.lh-title-ns{line-height:1.25}.lh-copy-ns{line-height:1.5}.mw-100-ns{max-width:100%}.mw1-ns{max-width:1rem}.mw2-ns{max-width:2rem}.mw3-ns{max-width:4rem}.mw4-ns{max-width:8rem}.mw5-ns{max-width:16rem}.mw6-ns{max-width:32rem}.mw7-ns{max-width:48rem}.mw8-ns{max-width:64rem}.mw9-ns{max-width:96rem}.mw-none-ns{max-width:none}.w1-ns{width:1rem}.w2-ns{width:2rem}.w3-ns{width:4rem}.w4-ns{width:8rem}.w5-ns{width:16rem}.w-10-ns{width:10%}.w-20-ns{width:20%}.w-25-ns{width:25%}.w-30-ns{width:30%}.w-33-ns{width:33%}.w-34-ns{width:34%}.w-40-ns{width:40%}.w-50-ns{width:50%}.w-60-ns{width:60%}.w-70-ns{width:70%}.w-75-ns{width:75%}.w-80-ns{width:80%}.w-90-ns{width:90%}.w-100-ns{width:100%}.w-third-ns{width:33.33333%}.w-two-thirds-ns{width:66.66667%}.w-auto-ns{width:auto}.overflow-visible-ns{overflow:visible}.overflow-hidden-ns{overflow:hidden}.overflow-scroll-ns{overflow:scroll}.overflow-auto-ns{overflow:auto}.overflow-x-visible-ns{overflow-x:visible}.overflow-x-hidden-ns{overflow-x:hidden}.overflow-x-scroll-ns{overflow-x:scroll}.overflow-x-auto-ns{overflow-x:auto}.overflow-y-visible-ns{overflow-y:visible}.overflow-y-hidden-ns{overflow-y:hidden}.overflow-y-scroll-ns{overflow-y:scroll}.overflow-y-auto-ns{overflow-y:auto}.static-ns{position:static}.relative-ns{position:relative}.absolute-ns{position:absolute}.fixed-ns{position:fixed}.rotate-45-ns{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90-ns{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135-ns{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180-ns{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225-ns{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270-ns{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315-ns{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.pa0-ns{padding:0}.pa1-ns{padding:.25rem}.pa2-ns{padding:.5rem}.pa3-ns{padding:1rem}.pa4-ns{padding:2rem}.pa5-ns{padding:4rem}.pa6-ns{padding:8rem}.pa7-ns{padding:16rem}.pl0-ns{padding-left:0}.pl1-ns{padding-left:.25rem}.pl2-ns{padding-left:.5rem}.pl3-ns{padding-left:1rem}.pl4-ns{padding-left:2rem}.pl5-ns{padding-left:4rem}.pl6-ns{padding-left:8rem}.pl7-ns{padding-left:16rem}.pr0-ns{padding-right:0}.pr1-ns{padding-right:.25rem}.pr2-ns{padding-right:.5rem}.pr3-ns{padding-right:1rem}.pr4-ns{padding-right:2rem}.pr5-ns{padding-right:4rem}.pr6-ns{padding-right:8rem}.pr7-ns{padding-right:16rem}.pb0-ns{padding-bottom:0}.pb1-ns{padding-bottom:.25rem}.pb2-ns{padding-bottom:.5rem}.pb3-ns{padding-bottom:1rem}.pb4-ns{padding-bottom:2rem}.pb5-ns{padding-bottom:4rem}.pb6-ns{padding-bottom:8rem}.pb7-ns{padding-bottom:16rem}.pt0-ns{padding-top:0}.pt1-ns{padding-top:.25rem}.pt2-ns{padding-top:.5rem}.pt3-ns{padding-top:1rem}.pt4-ns{padding-top:2rem}.pt5-ns{padding-top:4rem}.pt6-ns{padding-top:8rem}.pt7-ns{padding-top:16rem}.pv0-ns{padding-top:0;padding-bottom:0}.pv1-ns{padding-top:.25rem;padding-bottom:.25rem}.pv2-ns{padding-top:.5rem;padding-bottom:.5rem}.pv3-ns{padding-top:1rem;padding-bottom:1rem}.pv4-ns{padding-top:2rem;padding-bottom:2rem}.pv5-ns{padding-top:4rem;padding-bottom:4rem}.pv6-ns{padding-top:8rem;padding-bottom:8rem}.pv7-ns{padding-top:16rem;padding-bottom:16rem}.ph0-ns{padding-left:0;padding-right:0}.ph1-ns{padding-left:.25rem;padding-right:.25rem}.ph2-ns{padding-left:.5rem;padding-right:.5rem}.ph3-ns{padding-left:1rem;padding-right:1rem}.ph4-ns{padding-left:2rem;padding-right:2rem}.ph5-ns{padding-left:4rem;padding-right:4rem}.ph6-ns{padding-left:8rem;padding-right:8rem}.ph7-ns{padding-left:16rem;padding-right:16rem}.ma0-ns{margin:0}.ma1-ns{margin:.25rem}.ma2-ns{margin:.5rem}.ma3-ns{margin:1rem}.ma4-ns{margin:2rem}.ma5-ns{margin:4rem}.ma6-ns{margin:8rem}.ma7-ns{margin:16rem}.ml0-ns{margin-left:0}.ml1-ns{margin-left:.25rem}.ml2-ns{margin-left:.5rem}.ml3-ns{margin-left:1rem}.ml4-ns{margin-left:2rem}.ml5-ns{margin-left:4rem}.ml6-ns{margin-left:8rem}.ml7-ns{margin-left:16rem}.mr0-ns{margin-right:0}.mr1-ns{margin-right:.25rem}.mr2-ns{margin-right:.5rem}.mr3-ns{margin-right:1rem}.mr4-ns{margin-right:2rem}.mr5-ns{margin-right:4rem}.mr6-ns{margin-right:8rem}.mr7-ns{margin-right:16rem}.mb0-ns{margin-bottom:0}.mb1-ns{margin-bottom:.25rem}.mb2-ns{margin-bottom:.5rem}.mb3-ns{margin-bottom:1rem}.mb4-ns{margin-bottom:2rem}.mb5-ns{margin-bottom:4rem}.mb6-ns{margin-bottom:8rem}.mb7-ns{margin-bottom:16rem}.mt0-ns{margin-top:0}.mt1-ns{margin-top:.25rem}.mt2-ns{margin-top:.5rem}.mt3-ns{margin-top:1rem}.mt4-ns{margin-top:2rem}.mt5-ns{margin-top:4rem}.mt6-ns{margin-top:8rem}.mt7-ns{margin-top:16rem}.mv0-ns{margin-top:0;margin-bottom:0}.mv1-ns{margin-top:.25rem;margin-bottom:.25rem}.mv2-ns{margin-top:.5rem;margin-bottom:.5rem}.mv3-ns{margin-top:1rem;margin-bottom:1rem}.mv4-ns{margin-top:2rem;margin-bottom:2rem}.mv5-ns{margin-top:4rem;margin-bottom:4rem}.mv6-ns{margin-top:8rem;margin-bottom:8rem}.mv7-ns{margin-top:16rem;margin-bottom:16rem}.mh0-ns{margin-left:0;margin-right:0}.mh1-ns{margin-left:.25rem;margin-right:.25rem}.mh2-ns{margin-left:.5rem;margin-right:.5rem}.mh3-ns{margin-left:1rem;margin-right:1rem}.mh4-ns{margin-left:2rem;margin-right:2rem}.mh5-ns{margin-left:4rem;margin-right:4rem}.mh6-ns{margin-left:8rem;margin-right:8rem}.mh7-ns{margin-left:16rem;margin-right:16rem}.na1-ns{margin:-.25rem}.na2-ns{margin:-.5rem}.na3-ns{margin:-1rem}.na4-ns{margin:-2rem}.na5-ns{margin:-4rem}.na6-ns{margin:-8rem}.na7-ns{margin:-16rem}.nl1-ns{margin-left:-.25rem}.nl2-ns{margin-left:-.5rem}.nl3-ns{margin-left:-1rem}.nl4-ns{margin-left:-2rem}.nl5-ns{margin-left:-4rem}.nl6-ns{margin-left:-8rem}.nl7-ns{margin-left:-16rem}.nr1-ns{margin-right:-.25rem}.nr2-ns{margin-right:-.5rem}.nr3-ns{margin-right:-1rem}.nr4-ns{margin-right:-2rem}.nr5-ns{margin-right:-4rem}.nr6-ns{margin-right:-8rem}.nr7-ns{margin-right:-16rem}.nb1-ns{margin-bottom:-.25rem}.nb2-ns{margin-bottom:-.5rem}.nb3-ns{margin-bottom:-1rem}.nb4-ns{margin-bottom:-2rem}.nb5-ns{margin-bottom:-4rem}.nb6-ns{margin-bottom:-8rem}.nb7-ns{margin-bottom:-16rem}.nt1-ns{margin-top:-.25rem}.nt2-ns{margin-top:-.5rem}.nt3-ns{margin-top:-1rem}.nt4-ns{margin-top:-2rem}.nt5-ns{margin-top:-4rem}.nt6-ns{margin-top:-8rem}.nt7-ns{margin-top:-16rem}.strike-ns{text-decoration:line-through}.underline-ns{text-decoration:underline}.no-underline-ns{text-decoration:none}.tl-ns{text-align:left}.tr-ns{text-align:right}.tc-ns{text-align:center}.tj-ns{text-align:justify}.ttc-ns{text-transform:capitalize}.ttl-ns{text-transform:lowercase}.ttu-ns{text-transform:uppercase}.ttn-ns{text-transform:none}.f-6-ns,.f-headline-ns{font-size:6rem}.f-5-ns,.f-subheadline-ns{font-size:5rem}.f1-ns{font-size:3rem}.f2-ns{font-size:2.25rem}.f3-ns{font-size:1.5rem}.f4-ns{font-size:1.25rem}.f5-ns{font-size:1rem}.f6-ns{font-size:.875rem}.f7-ns{font-size:.75rem}.measure-ns{max-width:30em}.measure-wide-ns{max-width:34em}.measure-narrow-ns{max-width:20em}.indent-ns{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps-ns{font-variant:small-caps}.truncate-ns{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.center-ns{margin-left:auto}.center-ns,.mr-auto-ns{margin-right:auto}.ml-auto-ns{margin-left:auto}.clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal-ns{white-space:normal}.nowrap-ns{white-space:nowrap}.pre-ns{white-space:pre}.v-base-ns{vertical-align:baseline}.v-mid-ns{vertical-align:middle}.v-top-ns{vertical-align:top}.v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.aspect-ratio-m{height:0;position:relative}.aspect-ratio--16x9-m{padding-bottom:56.25%}.aspect-ratio--9x16-m{padding-bottom:177.77%}.aspect-ratio--4x3-m{padding-bottom:75%}.aspect-ratio--3x4-m{padding-bottom:133.33%}.aspect-ratio--6x4-m{padding-bottom:66.6%}.aspect-ratio--4x6-m{padding-bottom:150%}.aspect-ratio--8x5-m{padding-bottom:62.5%}.aspect-ratio--5x8-m{padding-bottom:160%}.aspect-ratio--7x5-m{padding-bottom:71.42%}.aspect-ratio--5x7-m{padding-bottom:140%}.aspect-ratio--1x1-m{padding-bottom:100%}.aspect-ratio--object-m{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}.cover-m{background-size:cover!important}.contain-m{background-size:contain!important}.bg-center-m{background-position:50%}.bg-center-m,.bg-top-m{background-repeat:no-repeat}.bg-top-m{background-position:top}.bg-right-m{background-position:100%}.bg-bottom-m,.bg-right-m{background-repeat:no-repeat}.bg-bottom-m{background-position:bottom}.bg-left-m{background-repeat:no-repeat;background-position:0}.outline-m{outline:1px solid}.outline-transparent-m{outline:1px solid transparent}.outline-0-m{outline:0}.ba-m{border-style:solid;border-width:1px}.bt-m{border-top-style:solid;border-top-width:1px}.br-m{border-right-style:solid;border-right-width:1px}.bb-m{border-bottom-style:solid;border-bottom-width:1px}.bl-m{border-left-style:solid;border-left-width:1px}.bn-m{border-style:none;border-width:0}.br0-m{border-radius:0}.br1-m{border-radius:.125rem}.br2-m{border-radius:.25rem}.br3-m{border-radius:.5rem}.br4-m{border-radius:1rem}.br-100-m{border-radius:100%}.br-pill-m{border-radius:9999px}.br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.br--top-m{border-bottom-right-radius:0}.br--right-m,.br--top-m{border-bottom-left-radius:0}.br--right-m{border-top-left-radius:0}.br--left-m{border-top-right-radius:0;border-bottom-right-radius:0}.br-inherit-m{border-radius:inherit}.br-initial-m{border-radius:initial}.br-unset-m{border-radius:unset}.b--dotted-m{border-style:dotted}.b--dashed-m{border-style:dashed}.b--solid-m{border-style:solid}.b--none-m{border-style:none}.bw0-m{border-width:0}.bw1-m{border-width:.125rem}.bw2-m{border-width:.25rem}.bw3-m{border-width:.5rem}.bw4-m{border-width:1rem}.bw5-m{border-width:2rem}.bt-0-m{border-top-width:0}.br-0-m{border-right-width:0}.bb-0-m{border-bottom-width:0}.bl-0-m{border-left-width:0}.shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.top-0-m{top:0}.left-0-m{left:0}.right-0-m{right:0}.bottom-0-m{bottom:0}.top-1-m{top:1rem}.left-1-m{left:1rem}.right-1-m{right:1rem}.bottom-1-m{bottom:1rem}.top-2-m{top:2rem}.left-2-m{left:2rem}.right-2-m{right:2rem}.bottom-2-m{bottom:2rem}.top--1-m{top:-1rem}.right--1-m{right:-1rem}.bottom--1-m{bottom:-1rem}.left--1-m{left:-1rem}.top--2-m{top:-2rem}.right--2-m{right:-2rem}.bottom--2-m{bottom:-2rem}.left--2-m{left:-2rem}.absolute--fill-m{top:0;right:0;bottom:0;left:0}.cl-m{clear:left}.cr-m{clear:right}.cb-m{clear:both}.cn-m{clear:none}.dn-m{display:none}.di-m{display:inline}.db-m{display:block}.dib-m{display:inline-block}.dit-m{display:inline-table}.dt-m{display:table}.dtc-m{display:table-cell}.dt-row-m{display:table-row}.dt-row-group-m{display:table-row-group}.dt-column-m{display:table-column}.dt-column-group-m{display:table-column-group}.dt--fixed-m{table-layout:fixed;width:100%}.flex-m{display:flex}.inline-flex-m{display:inline-flex}.flex-auto-m{flex:1 1 auto;min-width:0;min-height:0}.flex-none-m{flex:none}.flex-column-m{flex-direction:column}.flex-row-m{flex-direction:row}.flex-wrap-m{flex-wrap:wrap}.flex-nowrap-m{flex-wrap:nowrap}.flex-wrap-reverse-m{flex-wrap:wrap-reverse}.flex-column-reverse-m{flex-direction:column-reverse}.flex-row-reverse-m{flex-direction:row-reverse}.items-start-m{align-items:flex-start}.items-end-m{align-items:flex-end}.items-center-m{align-items:center}.items-baseline-m{align-items:baseline}.items-stretch-m{align-items:stretch}.self-start-m{align-self:flex-start}.self-end-m{align-self:flex-end}.self-center-m{align-self:center}.self-baseline-m{align-self:baseline}.self-stretch-m{align-self:stretch}.justify-start-m{justify-content:flex-start}.justify-end-m{justify-content:flex-end}.justify-center-m{justify-content:center}.justify-between-m{justify-content:space-between}.justify-around-m{justify-content:space-around}.content-start-m{align-content:flex-start}.content-end-m{align-content:flex-end}.content-center-m{align-content:center}.content-between-m{align-content:space-between}.content-around-m{align-content:space-around}.content-stretch-m{align-content:stretch}.order-0-m{order:0}.order-1-m{order:1}.order-2-m{order:2}.order-3-m{order:3}.order-4-m{order:4}.order-5-m{order:5}.order-6-m{order:6}.order-7-m{order:7}.order-8-m{order:8}.order-last-m{order:99999}.flex-grow-0-m{flex-grow:0}.flex-grow-1-m{flex-grow:1}.flex-shrink-0-m{flex-shrink:0}.flex-shrink-1-m{flex-shrink:1}.fl-m{float:left}.fl-m,.fr-m{_display:inline}.fr-m{float:right}.fn-m{float:none}.i-m{font-style:italic}.fs-normal-m{font-style:normal}.normal-m{font-weight:400}.b-m{font-weight:700}.fw1-m{font-weight:100}.fw2-m{font-weight:200}.fw3-m{font-weight:300}.fw4-m{font-weight:400}.fw5-m{font-weight:500}.fw6-m{font-weight:600}.fw7-m{font-weight:700}.fw8-m{font-weight:800}.fw9-m{font-weight:900}.h1-m{height:1rem}.h2-m{height:2rem}.h3-m{height:4rem}.h4-m{height:8rem}.h5-m{height:16rem}.h-25-m{height:25%}.h-50-m{height:50%}.h-75-m{height:75%}.h-100-m{height:100%}.min-h-100-m{min-height:100%}.vh-25-m{height:25vh}.vh-50-m{height:50vh}.vh-75-m{height:75vh}.vh-100-m{height:100vh}.min-vh-100-m{min-height:100vh}.h-auto-m{height:auto}.h-inherit-m{height:inherit}.tracked-m{letter-spacing:.1em}.tracked-tight-m{letter-spacing:-.05em}.tracked-mega-m{letter-spacing:.25em}.lh-solid-m{line-height:1}.lh-title-m{line-height:1.25}.lh-copy-m{line-height:1.5}.mw-100-m{max-width:100%}.mw1-m{max-width:1rem}.mw2-m{max-width:2rem}.mw3-m{max-width:4rem}.mw4-m{max-width:8rem}.mw5-m{max-width:16rem}.mw6-m{max-width:32rem}.mw7-m{max-width:48rem}.mw8-m{max-width:64rem}.mw9-m{max-width:96rem}.mw-none-m{max-width:none}.w1-m{width:1rem}.w2-m{width:2rem}.w3-m{width:4rem}.w4-m{width:8rem}.w5-m{width:16rem}.w-10-m{width:10%}.w-20-m{width:20%}.w-25-m{width:25%}.w-30-m{width:30%}.w-33-m{width:33%}.w-34-m{width:34%}.w-40-m{width:40%}.w-50-m{width:50%}.w-60-m{width:60%}.w-70-m{width:70%}.w-75-m{width:75%}.w-80-m{width:80%}.w-90-m{width:90%}.w-100-m{width:100%}.w-third-m{width:33.33333%}.w-two-thirds-m{width:66.66667%}.w-auto-m{width:auto}.overflow-visible-m{overflow:visible}.overflow-hidden-m{overflow:hidden}.overflow-scroll-m{overflow:scroll}.overflow-auto-m{overflow:auto}.overflow-x-visible-m{overflow-x:visible}.overflow-x-hidden-m{overflow-x:hidden}.overflow-x-scroll-m{overflow-x:scroll}.overflow-x-auto-m{overflow-x:auto}.overflow-y-visible-m{overflow-y:visible}.overflow-y-hidden-m{overflow-y:hidden}.overflow-y-scroll-m{overflow-y:scroll}.overflow-y-auto-m{overflow-y:auto}.static-m{position:static}.relative-m{position:relative}.absolute-m{position:absolute}.fixed-m{position:fixed}.rotate-45-m{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90-m{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135-m{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180-m{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225-m{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270-m{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315-m{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.pa0-m{padding:0}.pa1-m{padding:.25rem}.pa2-m{padding:.5rem}.pa3-m{padding:1rem}.pa4-m{padding:2rem}.pa5-m{padding:4rem}.pa6-m{padding:8rem}.pa7-m{padding:16rem}.pl0-m{padding-left:0}.pl1-m{padding-left:.25rem}.pl2-m{padding-left:.5rem}.pl3-m{padding-left:1rem}.pl4-m{padding-left:2rem}.pl5-m{padding-left:4rem}.pl6-m{padding-left:8rem}.pl7-m{padding-left:16rem}.pr0-m{padding-right:0}.pr1-m{padding-right:.25rem}.pr2-m{padding-right:.5rem}.pr3-m{padding-right:1rem}.pr4-m{padding-right:2rem}.pr5-m{padding-right:4rem}.pr6-m{padding-right:8rem}.pr7-m{padding-right:16rem}.pb0-m{padding-bottom:0}.pb1-m{padding-bottom:.25rem}.pb2-m{padding-bottom:.5rem}.pb3-m{padding-bottom:1rem}.pb4-m{padding-bottom:2rem}.pb5-m{padding-bottom:4rem}.pb6-m{padding-bottom:8rem}.pb7-m{padding-bottom:16rem}.pt0-m{padding-top:0}.pt1-m{padding-top:.25rem}.pt2-m{padding-top:.5rem}.pt3-m{padding-top:1rem}.pt4-m{padding-top:2rem}.pt5-m{padding-top:4rem}.pt6-m{padding-top:8rem}.pt7-m{padding-top:16rem}.pv0-m{padding-top:0;padding-bottom:0}.pv1-m{padding-top:.25rem;padding-bottom:.25rem}.pv2-m{padding-top:.5rem;padding-bottom:.5rem}.pv3-m{padding-top:1rem;padding-bottom:1rem}.pv4-m{padding-top:2rem;padding-bottom:2rem}.pv5-m{padding-top:4rem;padding-bottom:4rem}.pv6-m{padding-top:8rem;padding-bottom:8rem}.pv7-m{padding-top:16rem;padding-bottom:16rem}.ph0-m{padding-left:0;padding-right:0}.ph1-m{padding-left:.25rem;padding-right:.25rem}.ph2-m{padding-left:.5rem;padding-right:.5rem}.ph3-m{padding-left:1rem;padding-right:1rem}.ph4-m{padding-left:2rem;padding-right:2rem}.ph5-m{padding-left:4rem;padding-right:4rem}.ph6-m{padding-left:8rem;padding-right:8rem}.ph7-m{padding-left:16rem;padding-right:16rem}.ma0-m{margin:0}.ma1-m{margin:.25rem}.ma2-m{margin:.5rem}.ma3-m{margin:1rem}.ma4-m{margin:2rem}.ma5-m{margin:4rem}.ma6-m{margin:8rem}.ma7-m{margin:16rem}.ml0-m{margin-left:0}.ml1-m{margin-left:.25rem}.ml2-m{margin-left:.5rem}.ml3-m{margin-left:1rem}.ml4-m{margin-left:2rem}.ml5-m{margin-left:4rem}.ml6-m{margin-left:8rem}.ml7-m{margin-left:16rem}.mr0-m{margin-right:0}.mr1-m{margin-right:.25rem}.mr2-m{margin-right:.5rem}.mr3-m{margin-right:1rem}.mr4-m{margin-right:2rem}.mr5-m{margin-right:4rem}.mr6-m{margin-right:8rem}.mr7-m{margin-right:16rem}.mb0-m{margin-bottom:0}.mb1-m{margin-bottom:.25rem}.mb2-m{margin-bottom:.5rem}.mb3-m{margin-bottom:1rem}.mb4-m{margin-bottom:2rem}.mb5-m{margin-bottom:4rem}.mb6-m{margin-bottom:8rem}.mb7-m{margin-bottom:16rem}.mt0-m{margin-top:0}.mt1-m{margin-top:.25rem}.mt2-m{margin-top:.5rem}.mt3-m{margin-top:1rem}.mt4-m{margin-top:2rem}.mt5-m{margin-top:4rem}.mt6-m{margin-top:8rem}.mt7-m{margin-top:16rem}.mv0-m{margin-top:0;margin-bottom:0}.mv1-m{margin-top:.25rem;margin-bottom:.25rem}.mv2-m{margin-top:.5rem;margin-bottom:.5rem}.mv3-m{margin-top:1rem;margin-bottom:1rem}.mv4-m{margin-top:2rem;margin-bottom:2rem}.mv5-m{margin-top:4rem;margin-bottom:4rem}.mv6-m{margin-top:8rem;margin-bottom:8rem}.mv7-m{margin-top:16rem;margin-bottom:16rem}.mh0-m{margin-left:0;margin-right:0}.mh1-m{margin-left:.25rem;margin-right:.25rem}.mh2-m{margin-left:.5rem;margin-right:.5rem}.mh3-m{margin-left:1rem;margin-right:1rem}.mh4-m{margin-left:2rem;margin-right:2rem}.mh5-m{margin-left:4rem;margin-right:4rem}.mh6-m{margin-left:8rem;margin-right:8rem}.mh7-m{margin-left:16rem;margin-right:16rem}.na1-m{margin:-.25rem}.na2-m{margin:-.5rem}.na3-m{margin:-1rem}.na4-m{margin:-2rem}.na5-m{margin:-4rem}.na6-m{margin:-8rem}.na7-m{margin:-16rem}.nl1-m{margin-left:-.25rem}.nl2-m{margin-left:-.5rem}.nl3-m{margin-left:-1rem}.nl4-m{margin-left:-2rem}.nl5-m{margin-left:-4rem}.nl6-m{margin-left:-8rem}.nl7-m{margin-left:-16rem}.nr1-m{margin-right:-.25rem}.nr2-m{margin-right:-.5rem}.nr3-m{margin-right:-1rem}.nr4-m{margin-right:-2rem}.nr5-m{margin-right:-4rem}.nr6-m{margin-right:-8rem}.nr7-m{margin-right:-16rem}.nb1-m{margin-bottom:-.25rem}.nb2-m{margin-bottom:-.5rem}.nb3-m{margin-bottom:-1rem}.nb4-m{margin-bottom:-2rem}.nb5-m{margin-bottom:-4rem}.nb6-m{margin-bottom:-8rem}.nb7-m{margin-bottom:-16rem}.nt1-m{margin-top:-.25rem}.nt2-m{margin-top:-.5rem}.nt3-m{margin-top:-1rem}.nt4-m{margin-top:-2rem}.nt5-m{margin-top:-4rem}.nt6-m{margin-top:-8rem}.nt7-m{margin-top:-16rem}.strike-m{text-decoration:line-through}.underline-m{text-decoration:underline}.no-underline-m{text-decoration:none}.tl-m{text-align:left}.tr-m{text-align:right}.tc-m{text-align:center}.tj-m{text-align:justify}.ttc-m{text-transform:capitalize}.ttl-m{text-transform:lowercase}.ttu-m{text-transform:uppercase}.ttn-m{text-transform:none}.f-6-m,.f-headline-m{font-size:6rem}.f-5-m,.f-subheadline-m{font-size:5rem}.f1-m{font-size:3rem}.f2-m{font-size:2.25rem}.f3-m{font-size:1.5rem}.f4-m{font-size:1.25rem}.f5-m{font-size:1rem}.f6-m{font-size:.875rem}.f7-m{font-size:.75rem}.measure-m{max-width:30em}.measure-wide-m{max-width:34em}.measure-narrow-m{max-width:20em}.indent-m{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps-m{font-variant:small-caps}.truncate-m{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.center-m{margin-left:auto}.center-m,.mr-auto-m{margin-right:auto}.ml-auto-m{margin-left:auto}.clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal-m{white-space:normal}.nowrap-m{white-space:nowrap}.pre-m{white-space:pre}.v-base-m{vertical-align:baseline}.v-mid-m{vertical-align:middle}.v-top-m{vertical-align:top}.v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.aspect-ratio-l{height:0;position:relative}.aspect-ratio--16x9-l{padding-bottom:56.25%}.aspect-ratio--9x16-l{padding-bottom:177.77%}.aspect-ratio--4x3-l{padding-bottom:75%}.aspect-ratio--3x4-l{padding-bottom:133.33%}.aspect-ratio--6x4-l{padding-bottom:66.6%}.aspect-ratio--4x6-l{padding-bottom:150%}.aspect-ratio--8x5-l{padding-bottom:62.5%}.aspect-ratio--5x8-l{padding-bottom:160%}.aspect-ratio--7x5-l{padding-bottom:71.42%}.aspect-ratio--5x7-l{padding-bottom:140%}.aspect-ratio--1x1-l{padding-bottom:100%}.aspect-ratio--object-l{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:100}.cover-l{background-size:cover!important}.contain-l{background-size:contain!important}.bg-center-l{background-position:50%}.bg-center-l,.bg-top-l{background-repeat:no-repeat}.bg-top-l{background-position:top}.bg-right-l{background-position:100%}.bg-bottom-l,.bg-right-l{background-repeat:no-repeat}.bg-bottom-l{background-position:bottom}.bg-left-l{background-repeat:no-repeat;background-position:0}.outline-l{outline:1px solid}.outline-transparent-l{outline:1px solid transparent}.outline-0-l{outline:0}.ba-l{border-style:solid;border-width:1px}.bt-l{border-top-style:solid;border-top-width:1px}.br-l{border-right-style:solid;border-right-width:1px}.bb-l{border-bottom-style:solid;border-bottom-width:1px}.bl-l{border-left-style:solid;border-left-width:1px}.bn-l{border-style:none;border-width:0}.br0-l{border-radius:0}.br1-l{border-radius:.125rem}.br2-l{border-radius:.25rem}.br3-l{border-radius:.5rem}.br4-l{border-radius:1rem}.br-100-l{border-radius:100%}.br-pill-l{border-radius:9999px}.br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.br--top-l{border-bottom-right-radius:0}.br--right-l,.br--top-l{border-bottom-left-radius:0}.br--right-l{border-top-left-radius:0}.br--left-l{border-top-right-radius:0;border-bottom-right-radius:0}.br-inherit-l{border-radius:inherit}.br-initial-l{border-radius:initial}.br-unset-l{border-radius:unset}.b--dotted-l{border-style:dotted}.b--dashed-l{border-style:dashed}.b--solid-l{border-style:solid}.b--none-l{border-style:none}.bw0-l{border-width:0}.bw1-l{border-width:.125rem}.bw2-l{border-width:.25rem}.bw3-l{border-width:.5rem}.bw4-l{border-width:1rem}.bw5-l{border-width:2rem}.bt-0-l{border-top-width:0}.br-0-l{border-right-width:0}.bb-0-l{border-bottom-width:0}.bl-0-l{border-left-width:0}.shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}.top-0-l{top:0}.left-0-l{left:0}.right-0-l{right:0}.bottom-0-l{bottom:0}.top-1-l{top:1rem}.left-1-l{left:1rem}.right-1-l{right:1rem}.bottom-1-l{bottom:1rem}.top-2-l{top:2rem}.left-2-l{left:2rem}.right-2-l{right:2rem}.bottom-2-l{bottom:2rem}.top--1-l{top:-1rem}.right--1-l{right:-1rem}.bottom--1-l{bottom:-1rem}.left--1-l{left:-1rem}.top--2-l{top:-2rem}.right--2-l{right:-2rem}.bottom--2-l{bottom:-2rem}.left--2-l{left:-2rem}.absolute--fill-l{top:0;right:0;bottom:0;left:0}.cl-l{clear:left}.cr-l{clear:right}.cb-l{clear:both}.cn-l{clear:none}.dn-l{display:none}.di-l{display:inline}.db-l{display:block}.dib-l{display:inline-block}.dit-l{display:inline-table}.dt-l{display:table}.dtc-l{display:table-cell}.dt-row-l{display:table-row}.dt-row-group-l{display:table-row-group}.dt-column-l{display:table-column}.dt-column-group-l{display:table-column-group}.dt--fixed-l{table-layout:fixed;width:100%}.flex-l{display:flex}.inline-flex-l{display:inline-flex}.flex-auto-l{flex:1 1 auto;min-width:0;min-height:0}.flex-none-l{flex:none}.flex-column-l{flex-direction:column}.flex-row-l{flex-direction:row}.flex-wrap-l{flex-wrap:wrap}.flex-nowrap-l{flex-wrap:nowrap}.flex-wrap-reverse-l{flex-wrap:wrap-reverse}.flex-column-reverse-l{flex-direction:column-reverse}.flex-row-reverse-l{flex-direction:row-reverse}.items-start-l{align-items:flex-start}.items-end-l{align-items:flex-end}.items-center-l{align-items:center}.items-baseline-l{align-items:baseline}.items-stretch-l{align-items:stretch}.self-start-l{align-self:flex-start}.self-end-l{align-self:flex-end}.self-center-l{align-self:center}.self-baseline-l{align-self:baseline}.self-stretch-l{align-self:stretch}.justify-start-l{justify-content:flex-start}.justify-end-l{justify-content:flex-end}.justify-center-l{justify-content:center}.justify-between-l{justify-content:space-between}.justify-around-l{justify-content:space-around}.content-start-l{align-content:flex-start}.content-end-l{align-content:flex-end}.content-center-l{align-content:center}.content-between-l{align-content:space-between}.content-around-l{align-content:space-around}.content-stretch-l{align-content:stretch}.order-0-l{order:0}.order-1-l{order:1}.order-2-l{order:2}.order-3-l{order:3}.order-4-l{order:4}.order-5-l{order:5}.order-6-l{order:6}.order-7-l{order:7}.order-8-l{order:8}.order-last-l{order:99999}.flex-grow-0-l{flex-grow:0}.flex-grow-1-l{flex-grow:1}.flex-shrink-0-l{flex-shrink:0}.flex-shrink-1-l{flex-shrink:1}.fl-l{float:left}.fl-l,.fr-l{_display:inline}.fr-l{float:right}.fn-l{float:none}.i-l{font-style:italic}.fs-normal-l{font-style:normal}.normal-l{font-weight:400}.b-l{font-weight:700}.fw1-l{font-weight:100}.fw2-l{font-weight:200}.fw3-l{font-weight:300}.fw4-l{font-weight:400}.fw5-l{font-weight:500}.fw6-l{font-weight:600}.fw7-l{font-weight:700}.fw8-l{font-weight:800}.fw9-l{font-weight:900}.h1-l{height:1rem}.h2-l{height:2rem}.h3-l{height:4rem}.h4-l{height:8rem}.h5-l{height:16rem}.h-25-l{height:25%}.h-50-l{height:50%}.h-75-l{height:75%}.h-100-l{height:100%}.min-h-100-l{min-height:100%}.vh-25-l{height:25vh}.vh-50-l{height:50vh}.vh-75-l{height:75vh}.vh-100-l{height:100vh}.min-vh-100-l{min-height:100vh}.h-auto-l{height:auto}.h-inherit-l{height:inherit}.tracked-l{letter-spacing:.1em}.tracked-tight-l{letter-spacing:-.05em}.tracked-mega-l{letter-spacing:.25em}.lh-solid-l{line-height:1}.lh-title-l{line-height:1.25}.lh-copy-l{line-height:1.5}.mw-100-l{max-width:100%}.mw1-l{max-width:1rem}.mw2-l{max-width:2rem}.mw3-l{max-width:4rem}.mw4-l{max-width:8rem}.mw5-l{max-width:16rem}.mw6-l{max-width:32rem}.mw7-l{max-width:48rem}.mw8-l{max-width:64rem}.mw9-l{max-width:96rem}.mw-none-l{max-width:none}.w1-l{width:1rem}.w2-l{width:2rem}.w3-l{width:4rem}.w4-l{width:8rem}.w5-l{width:16rem}.w-10-l{width:10%}.w-20-l{width:20%}.w-25-l{width:25%}.w-30-l{width:30%}.w-33-l{width:33%}.w-34-l{width:34%}.w-40-l{width:40%}.w-50-l{width:50%}.w-60-l{width:60%}.w-70-l{width:70%}.w-75-l{width:75%}.w-80-l{width:80%}.w-90-l{width:90%}.w-100-l{width:100%}.w-third-l{width:33.33333%}.w-two-thirds-l{width:66.66667%}.w-auto-l{width:auto}.overflow-visible-l{overflow:visible}.overflow-hidden-l{overflow:hidden}.overflow-scroll-l{overflow:scroll}.overflow-auto-l{overflow:auto}.overflow-x-visible-l{overflow-x:visible}.overflow-x-hidden-l{overflow-x:hidden}.overflow-x-scroll-l{overflow-x:scroll}.overflow-x-auto-l{overflow-x:auto}.overflow-y-visible-l{overflow-y:visible}.overflow-y-hidden-l{overflow-y:hidden}.overflow-y-scroll-l{overflow-y:scroll}.overflow-y-auto-l{overflow-y:auto}.static-l{position:static}.relative-l{position:relative}.absolute-l{position:absolute}.fixed-l{position:fixed}.rotate-45-l{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.rotate-90-l{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-135-l{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.rotate-180-l{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-225-l{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.rotate-270-l{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.rotate-315-l{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.pa0-l{padding:0}.pa1-l{padding:.25rem}.pa2-l{padding:.5rem}.pa3-l{padding:1rem}.pa4-l{padding:2rem}.pa5-l{padding:4rem}.pa6-l{padding:8rem}.pa7-l{padding:16rem}.pl0-l{padding-left:0}.pl1-l{padding-left:.25rem}.pl2-l{padding-left:.5rem}.pl3-l{padding-left:1rem}.pl4-l{padding-left:2rem}.pl5-l{padding-left:4rem}.pl6-l{padding-left:8rem}.pl7-l{padding-left:16rem}.pr0-l{padding-right:0}.pr1-l{padding-right:.25rem}.pr2-l{padding-right:.5rem}.pr3-l{padding-right:1rem}.pr4-l{padding-right:2rem}.pr5-l{padding-right:4rem}.pr6-l{padding-right:8rem}.pr7-l{padding-right:16rem}.pb0-l{padding-bottom:0}.pb1-l{padding-bottom:.25rem}.pb2-l{padding-bottom:.5rem}.pb3-l{padding-bottom:1rem}.pb4-l{padding-bottom:2rem}.pb5-l{padding-bottom:4rem}.pb6-l{padding-bottom:8rem}.pb7-l{padding-bottom:16rem}.pt0-l{padding-top:0}.pt1-l{padding-top:.25rem}.pt2-l{padding-top:.5rem}.pt3-l{padding-top:1rem}.pt4-l{padding-top:2rem}.pt5-l{padding-top:4rem}.pt6-l{padding-top:8rem}.pt7-l{padding-top:16rem}.pv0-l{padding-top:0;padding-bottom:0}.pv1-l{padding-top:.25rem;padding-bottom:.25rem}.pv2-l{padding-top:.5rem;padding-bottom:.5rem}.pv3-l{padding-top:1rem;padding-bottom:1rem}.pv4-l{padding-top:2rem;padding-bottom:2rem}.pv5-l{padding-top:4rem;padding-bottom:4rem}.pv6-l{padding-top:8rem;padding-bottom:8rem}.pv7-l{padding-top:16rem;padding-bottom:16rem}.ph0-l{padding-left:0;padding-right:0}.ph1-l{padding-left:.25rem;padding-right:.25rem}.ph2-l{padding-left:.5rem;padding-right:.5rem}.ph3-l{padding-left:1rem;padding-right:1rem}.ph4-l{padding-left:2rem;padding-right:2rem}.ph5-l{padding-left:4rem;padding-right:4rem}.ph6-l{padding-left:8rem;padding-right:8rem}.ph7-l{padding-left:16rem;padding-right:16rem}.ma0-l{margin:0}.ma1-l{margin:.25rem}.ma2-l{margin:.5rem}.ma3-l{margin:1rem}.ma4-l{margin:2rem}.ma5-l{margin:4rem}.ma6-l{margin:8rem}.ma7-l{margin:16rem}.ml0-l{margin-left:0}.ml1-l{margin-left:.25rem}.ml2-l{margin-left:.5rem}.ml3-l{margin-left:1rem}.ml4-l{margin-left:2rem}.ml5-l{margin-left:4rem}.ml6-l{margin-left:8rem}.ml7-l{margin-left:16rem}.mr0-l{margin-right:0}.mr1-l{margin-right:.25rem}.mr2-l{margin-right:.5rem}.mr3-l{margin-right:1rem}.mr4-l{margin-right:2rem}.mr5-l{margin-right:4rem}.mr6-l{margin-right:8rem}.mr7-l{margin-right:16rem}.mb0-l{margin-bottom:0}.mb1-l{margin-bottom:.25rem}.mb2-l{margin-bottom:.5rem}.mb3-l{margin-bottom:1rem}.mb4-l{margin-bottom:2rem}.mb5-l{margin-bottom:4rem}.mb6-l{margin-bottom:8rem}.mb7-l{margin-bottom:16rem}.mt0-l{margin-top:0}.mt1-l{margin-top:.25rem}.mt2-l{margin-top:.5rem}.mt3-l{margin-top:1rem}.mt4-l{margin-top:2rem}.mt5-l{margin-top:4rem}.mt6-l{margin-top:8rem}.mt7-l{margin-top:16rem}.mv0-l{margin-top:0;margin-bottom:0}.mv1-l{margin-top:.25rem;margin-bottom:.25rem}.mv2-l{margin-top:.5rem;margin-bottom:.5rem}.mv3-l{margin-top:1rem;margin-bottom:1rem}.mv4-l{margin-top:2rem;margin-bottom:2rem}.mv5-l{margin-top:4rem;margin-bottom:4rem}.mv6-l{margin-top:8rem;margin-bottom:8rem}.mv7-l{margin-top:16rem;margin-bottom:16rem}.mh0-l{margin-left:0;margin-right:0}.mh1-l{margin-left:.25rem;margin-right:.25rem}.mh2-l{margin-left:.5rem;margin-right:.5rem}.mh3-l{margin-left:1rem;margin-right:1rem}.mh4-l{margin-left:2rem;margin-right:2rem}.mh5-l{margin-left:4rem;margin-right:4rem}.mh6-l{margin-left:8rem;margin-right:8rem}.mh7-l{margin-left:16rem;margin-right:16rem}.na1-l{margin:-.25rem}.na2-l{margin:-.5rem}.na3-l{margin:-1rem}.na4-l{margin:-2rem}.na5-l{margin:-4rem}.na6-l{margin:-8rem}.na7-l{margin:-16rem}.nl1-l{margin-left:-.25rem}.nl2-l{margin-left:-.5rem}.nl3-l{margin-left:-1rem}.nl4-l{margin-left:-2rem}.nl5-l{margin-left:-4rem}.nl6-l{margin-left:-8rem}.nl7-l{margin-left:-16rem}.nr1-l{margin-right:-.25rem}.nr2-l{margin-right:-.5rem}.nr3-l{margin-right:-1rem}.nr4-l{margin-right:-2rem}.nr5-l{margin-right:-4rem}.nr6-l{margin-right:-8rem}.nr7-l{margin-right:-16rem}.nb1-l{margin-bottom:-.25rem}.nb2-l{margin-bottom:-.5rem}.nb3-l{margin-bottom:-1rem}.nb4-l{margin-bottom:-2rem}.nb5-l{margin-bottom:-4rem}.nb6-l{margin-bottom:-8rem}.nb7-l{margin-bottom:-16rem}.nt1-l{margin-top:-.25rem}.nt2-l{margin-top:-.5rem}.nt3-l{margin-top:-1rem}.nt4-l{margin-top:-2rem}.nt5-l{margin-top:-4rem}.nt6-l{margin-top:-8rem}.nt7-l{margin-top:-16rem}.strike-l{text-decoration:line-through}.underline-l{text-decoration:underline}.no-underline-l{text-decoration:none}.tl-l{text-align:left}.tr-l{text-align:right}.tc-l{text-align:center}.tj-l{text-align:justify}.ttc-l{text-transform:capitalize}.ttl-l{text-transform:lowercase}.ttu-l{text-transform:uppercase}.ttn-l{text-transform:none}.f-6-l,.f-headline-l{font-size:6rem}.f-5-l,.f-subheadline-l{font-size:5rem}.f1-l{font-size:3rem}.f2-l{font-size:2.25rem}.f3-l{font-size:1.5rem}.f4-l{font-size:1.25rem}.f5-l{font-size:1rem}.f6-l{font-size:.875rem}.f7-l{font-size:.75rem}.measure-l{max-width:30em}.measure-wide-l{max-width:34em}.measure-narrow-l{max-width:20em}.indent-l{text-indent:1em;margin-top:0;margin-bottom:0}.small-caps-l{font-variant:small-caps}.truncate-l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.center-l{margin-left:auto}.center-l,.mr-auto-l{margin-right:auto}.ml-auto-l{margin-left:auto}.clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ws-normal-l{white-space:normal}.nowrap-l{white-space:nowrap}.pre-l{white-space:pre}.v-base-l{vertical-align:baseline}.v-mid-l{vertical-align:middle}.v-top-l{vertical-align:top}.v-btm-l{vertical-align:bottom}}
 

	
conservancy/static/docs/2023-01-31_KU-Lueven_Sandler-Karen_Software-Rights-Accountability-and-Autonomy-in-Our-Technology.txt
Show inline comments
...
 
@@ -2389,2049 +2389,2048 @@ third of the uh like a quarter or a
 
00:33:25.440 --> 00:33:27.059
 
third of the audience which is really
 

	
 
00:33:27.059 --> 00:33:28.380
 
exciting
 

	
 
00:33:28.380 --> 00:33:31.140
 
um and it's so exciting and Powerful to
 

	
 
00:33:31.140 --> 00:33:32.760
 
do that because
 

	
 
00:33:32.760 --> 00:33:37.140
 
well it changes everything often at the
 

	
 
00:33:37.140 --> 00:33:39.419
 
point where you're in now you're trading
 

	
 
00:33:39.419 --> 00:33:41.399
 
off some features you might not be able
 

	
 
00:33:41.399 --> 00:33:42.840
 
to do everything that you could do
 

	
 
00:33:42.840 --> 00:33:45.539
 
before but you get to decide what
 

	
 
00:33:45.539 --> 00:33:47.159
 
software you put on it you get to decide
 

	
 
00:33:47.159 --> 00:33:48.179
 
if you're going to put some of the
 

	
 
00:33:48.179 --> 00:33:50.640
 
proprietary stuff on it or you decide if
 

	
 
00:33:50.640 --> 00:33:51.960
 
you're going to keep you know try to
 

	
 
00:33:51.960 --> 00:33:53.940
 
make as much free and open as you
 

	
 
00:33:53.940 --> 00:33:56.820
 
possibly can and you decide when and how
 

	
 
00:33:56.820 --> 00:33:58.500
 
it gets updated some of these projects
 

	
 
00:33:58.500 --> 00:34:00.120
 
automatically update and that's really
 

	
 
00:34:00.120 --> 00:34:03.299
 
wonderful for security updates
 

	
 
00:34:03.299 --> 00:34:06.299
 
um now I I wanted to talk a go back to
 

	
 
00:34:06.299 --> 00:34:08.940
 
my medical device situation a little bit
 

	
 
00:34:08.940 --> 00:34:10.320
 
um this is a picture of me it's an old
 

	
 
00:34:10.320 --> 00:34:13.020
 
picture of me getting my old device
 

	
 
00:34:13.020 --> 00:34:15.000
 
interrogated
 

	
 
00:34:15.000 --> 00:34:17.639
 
um and uh and interrogated is basically
 

	
 
00:34:17.639 --> 00:34:19.679
 
the word they use which is actually it
 

	
 
00:34:19.679 --> 00:34:22.379
 
sounds very like old spy movie like I'm
 

	
 
00:34:22.379 --> 00:34:25.080
 
going to interrogate your device but um
 

	
 
00:34:25.080 --> 00:34:27.599
 
it it just means that it's the reading
 

	
 
00:34:27.599 --> 00:34:29.639
 
of the device by a piece of equipment
 

	
 
00:34:29.639 --> 00:34:32.460
 
called a programmer the terminology is
 

	
 
00:34:32.460 --> 00:34:34.619
 
so confusing but uh but the device that
 

	
 
00:34:34.619 --> 00:34:37.080
 
reads it is called a programmer and the
 

	
 
00:34:37.080 --> 00:34:39.599
 
programmer gets the information those
 

	
 
00:34:39.599 --> 00:34:41.580
 
are have shown to be totally insecure
 

	
 
00:34:41.580 --> 00:34:44.040
 
also where people have sold programmers
 

	
 
00:34:44.040 --> 00:34:46.080
 
to the like into the market from
 

	
 
00:34:46.080 --> 00:34:48.659
 
hospitals that had thousands of patients
 

	
 
00:34:48.659 --> 00:34:53.159
 
data on them um fascinating stuff but in
 

	
 
00:34:53.159 --> 00:34:54.659
 
in this instance
 

	
 
00:34:54.659 --> 00:34:57.180
 
um I wanted to highlight the fact that
 

	
 
00:34:57.180 --> 00:35:00.240
 
um that my medical saga continues and
 

	
 
00:35:00.240 --> 00:35:02.580
 
that every time that I have something
 

	
 
00:35:02.580 --> 00:35:04.560
 
new in my life I realize there are a
 

	
 
00:35:04.560 --> 00:35:06.119
 
whole aspects of this that need to be
 

	
 
00:35:06.119 --> 00:35:09.560
 
explored so this week before I came here
 

	
 
00:35:09.560 --> 00:35:12.240
 
I realized that I needed to find out
 

	
 
00:35:12.240 --> 00:35:13.440
 
something urgently about my
 

	
 
00:35:13.440 --> 00:35:14.839
 
defibrillator
 

	
 
00:35:14.839 --> 00:35:16.859
 
and so I needed to get my device
 

	
 
00:35:16.859 --> 00:35:19.740
 
interrogated but when I got my device
 

	
 
00:35:19.740 --> 00:35:22.500
 
replaced the last time which is right
 

	
 
00:35:22.500 --> 00:35:25.440
 
when this picture was taken I was really
 

	
 
00:35:25.440 --> 00:35:27.839
 
concerned with the possibility that my
 

	
 
00:35:27.839 --> 00:35:29.820
 
device would be maliciously hacked I
 

	
 
00:35:29.820 --> 00:35:33.000
 
told you about my work on outreachy
 

	
 
00:35:33.000 --> 00:35:35.400
 
a lot of people don't like work on
 

	
 
00:35:35.400 --> 00:35:39.420
 
diversity programs they they think that
 

	
 
00:35:39.420 --> 00:35:43.140
 
they are misguided and despite the fact
 

	
 
00:35:43.140 --> 00:35:47.300
 
that that the
 

	
 
00:35:47.300 --> 00:35:51.839
 
studies show the impact that um that
 

	
 
00:35:51.839 --> 00:35:53.940
 
underrepresentation has in the field and
 

	
 
00:35:53.940 --> 00:35:56.640
 
despite the fact that the tech industry
 

	
 
00:35:56.640 --> 00:36:00.240
 
is very obviously misrepresented
 

	
 
00:36:00.240 --> 00:36:03.420
 
um the people are it's a very polarizing
 

	
 
00:36:03.420 --> 00:36:05.820
 
issue and so I I've actually had a lot
 

	
 
00:36:05.820 --> 00:36:07.980
 
of threats related to my work on this
 

	
 
00:36:07.980 --> 00:36:12.480
 
including rape and death threat
 

	
 
00:36:12.480 --> 00:36:14.040
 
um and I'd like to not think about it
 

	
 
00:36:14.040 --> 00:36:18.300
 
too often but in getting a new device I
 

	
 
00:36:18.300 --> 00:36:21.359
 
um I did not want these my device to do
 

	
 
00:36:21.359 --> 00:36:23.880
 
what all of these devices do which is to
 

	
 
00:36:23.880 --> 00:36:26.900
 
broadcast incessantly all of the time
 

	
 
00:36:26.900 --> 00:36:29.460
 
and previously without very good
 

	
 
00:36:29.460 --> 00:36:32.280
 
encryption especially earlier on and so
 

	
 
00:36:32.280 --> 00:36:35.339
 
we're security protection and so I got
 

	
 
00:36:35.339 --> 00:36:38.339
 
the one device that was available in the
 

	
 
00:36:38.339 --> 00:36:41.520
 
U.S market where you could switch off
 

	
 
00:36:41.520 --> 00:36:43.680
 
the remote Telemetry the broadcasting
 

	
 
00:36:43.680 --> 00:36:45.480
 
component I got the only one device I
 

	
 
00:36:45.480 --> 00:36:47.520
 
called all the device manufacturers I
 

	
 
00:36:47.520 --> 00:36:49.380
 
had a great nurse practitioner who
 

	
 
00:36:49.380 --> 00:36:51.240
 
helped me out she and I sat in a
 

	
 
00:36:51.240 --> 00:36:52.500
 
conference room and we called all of the
 

	
 
00:36:52.500 --> 00:36:55.079
 
device manufacturers biotronic was the
 

	
 
00:36:55.079 --> 00:36:57.599
 
most hilarious because they said oh you
 

	
 
00:36:57.599 --> 00:36:59.280
 
don't have to worry about ours our
 

	
 
00:36:59.280 --> 00:37:02.040
 
device is hack proof and I was like
 

	
 
00:37:02.040 --> 00:37:04.320
 
really biochronic why do you think that
 

	
 
00:37:04.320 --> 00:37:06.839
 
you're hack proof oh because
 

	
 
00:37:06.839 --> 00:37:08.579
 
Medtronic has been shown to be
 

	
 
00:37:08.579 --> 00:37:11.339
 
vulnerable and uh Saint Jude has been
 

	
 
00:37:11.339 --> 00:37:13.320
 
shown to be you know uh guidance has
 

	
 
00:37:13.320 --> 00:37:15.119
 
been shown to be vulnerable but we've
 

	
 
00:37:15.119 --> 00:37:16.079
 
never I was like well that's because
 

	
 
00:37:16.079 --> 00:37:18.180
 
you're the fourth size and when people
 

	
 
00:37:18.180 --> 00:37:20.880
 
are showing the vulnerability of these
 

	
 
00:37:20.880 --> 00:37:22.200
 
devices they're not going to go with the
 

	
 
00:37:22.200 --> 00:37:23.460
 
fourth most popular they're going to go
 

	
 
00:37:23.460 --> 00:37:25.440
 
with the most popular could you send me
 

	
 
00:37:25.440 --> 00:37:28.020
 
some devices and I'll I'll get some
 

	
 
00:37:28.020 --> 00:37:29.760
 
volunteers and we'll test it I'm still
 

	
 
00:37:29.760 --> 00:37:31.380
 
waiting
 

	
 
00:37:31.380 --> 00:37:33.540
 
um but uh but I didn't get a biotronic
 

	
 
00:37:33.540 --> 00:37:35.579
 
device I got a device manufacturer that
 

	
 
00:37:35.579 --> 00:37:37.680
 
that I could switch off the radio
 

	
 
00:37:37.680 --> 00:37:39.839
 
telemetry so my device is not
 

	
 
00:37:39.839 --> 00:37:41.640
 
broadcasting which means that I can't
 

	
 
00:37:41.640 --> 00:37:44.579
 
use like um uh like they have a lot of
 

	
 
00:37:44.579 --> 00:37:45.960
 
black boxes that people can have in
 

	
 
00:37:45.960 --> 00:37:47.700
 
their homes that will monitor their
 

	
 
00:37:47.700 --> 00:37:49.020
 
devices
 

	
 
00:37:49.020 --> 00:37:50.820
 
um but it also means that when I got
 

	
 
00:37:50.820 --> 00:37:53.280
 
this device that company is a very large
 

	
 
00:37:53.280 --> 00:37:55.079
 
European company with a very small
 

	
 
00:37:55.079 --> 00:37:56.760
 
presence in the United States but they
 

	
 
00:37:56.760 --> 00:37:58.320
 
were very present in the United States
 

	
 
00:37:58.320 --> 00:38:00.359
 
when I got my device
 

	
 
00:38:00.359 --> 00:38:02.160
 
um and it was great because it's a very
 

	
 
00:38:02.160 --> 00:38:05.400
 
high quality device and when I got it uh
 

	
 
00:38:05.400 --> 00:38:07.980
 
I got it years ago and it still has
 

	
 
00:38:07.980 --> 00:38:10.460
 
enough battery life for 10 to 15 years
 

	
 
00:38:10.460 --> 00:38:13.500
 
which is a very long time and it's very
 

	
 
00:38:13.500 --> 00:38:15.359
 
exciting because it means I won't need
 

	
 
00:38:15.359 --> 00:38:17.760
 
surgery for that period of time so that
 

	
 
00:38:17.760 --> 00:38:20.880
 
would be just wonderful however when I
 

	
 
00:38:20.880 --> 00:38:23.040
 
needed to get my device interrogated I
 

	
 
00:38:23.040 --> 00:38:26.119
 
found out that the device
 

	
 
00:38:26.119 --> 00:38:29.400
 
manufacturer representative who is the
 

	
 
00:38:29.400 --> 00:38:33.119
 
one who has this programmer in New York
 

	
 
00:38:33.119 --> 00:38:35.220
 
had gone out of the country
 

	
 
00:38:35.220 --> 00:38:38.880
 
and guess what there was no backup rep
 

	
 
00:38:38.880 --> 00:38:41.280
 
no one there was literally nowhere I
 

	
 
00:38:41.280 --> 00:38:43.740
 
could go in New York City some hospitals
 

	
 
00:38:43.740 --> 00:38:45.300
 
have the devices but none of them were
 

	
 
00:38:45.300 --> 00:38:47.400
 
available for me to go to
 

	
 
00:38:47.400 --> 00:38:50.099
 
I could not get the information off of
 

	
 
00:38:50.099 --> 00:38:53.160
 
my defibrillator I just was out of luck
 

	
 
00:38:53.160 --> 00:38:55.440
 
and I was just suddenly put in that same
 

	
 
00:38:55.440 --> 00:38:57.900
 
position as those Vision patients I
 

	
 
00:38:57.900 --> 00:38:59.520
 
could really feel I mean it's very
 

	
 
00:38:59.520 --> 00:39:01.200
 
different situation I'm still functional
 

	
 
00:39:01.200 --> 00:39:04.680
 
it's a or I mean I still my heart is
 

	
 
00:39:04.680 --> 00:39:06.900
 
still is not completely reliant on this
 

	
 
00:39:06.900 --> 00:39:09.300
 
defibrillator it's preventative but I I
 

	
 
00:39:09.300 --> 00:39:12.060
 
could unders I could taste that how how
 

	
 
00:39:12.060 --> 00:39:15.420
 
hard that is and the realization that I
 

	
 
00:39:15.420 --> 00:39:18.780
 
may need to get surgery to replace a
 

	
 
00:39:18.780 --> 00:39:20.760
 
perfectly functional device simply
 

	
 
00:39:20.760 --> 00:39:23.160
 
because this manufacturer has decreased
 

	
 
00:39:23.160 --> 00:39:24.960
 
their presence what good is a
 

	
 
00:39:24.960 --> 00:39:28.320
 
defibrillator if if it can't be if you
 

	
 
00:39:28.320 --> 00:39:29.760
 
can't get the information you need when
 

	
 
00:39:29.760 --> 00:39:32.339
 
you need it it's not um it's not all
 

	
 
00:39:32.339 --> 00:39:33.720
 
Bleak it's really fascinating there's
 

	
 
00:39:33.720 --> 00:39:35.040
 
some really excellent work that's been
 

	
 
00:39:35.040 --> 00:39:36.980
 
happening in the insulin pump space
 

	
 
00:39:36.980 --> 00:39:40.680
 
where people have actually exploited old
 

	
 
00:39:40.680 --> 00:39:42.960
 
insulin pumps and the fact that they
 

	
 
00:39:42.960 --> 00:39:45.300
 
have a security vulnerability and they
 

	
 
00:39:45.300 --> 00:39:47.880
 
use it to create another device that
 

	
 
00:39:47.880 --> 00:39:50.099
 
talks to their insulin pump to deliver
 

	
 
00:39:50.099 --> 00:39:52.740
 
insulin in a much more precise Way open
 

	
 
00:39:52.740 --> 00:39:55.079
 
API yes and it's a really amazing
 

	
 
00:39:55.079 --> 00:39:58.760
 
movement and so I want to like you know
 

	
 
00:39:58.760 --> 00:40:01.140
 
amazing things happen when you let
 

	
 
00:40:01.140 --> 00:40:03.240
 
patients actually take control of their
 

	
 
00:40:03.240 --> 00:40:05.700
 
devices the stories in the insulin Pub
 

	
 
00:40:05.700 --> 00:40:09.000
 
space are amazing because there are kids
 

	
 
00:40:09.000 --> 00:40:11.460
 
that have insulin pumps whose parents
 

	
 
00:40:11.460 --> 00:40:13.859
 
are Technical and are able to precisely
 

	
 
00:40:13.859 --> 00:40:16.560
 
monitor their insulin delivery one story
 

	
 
00:40:16.560 --> 00:40:20.760
 
that I heard was a kid who uh who had
 

	
 
00:40:20.760 --> 00:40:23.400
 
gone to the nurse's office at school
 

	
 
00:40:23.400 --> 00:40:25.980
 
almost every day for a whole Academic
 

	
 
00:40:25.980 --> 00:40:29.460
 
Year and then after using this was only
 

	
 
00:40:29.460 --> 00:40:31.680
 
in the nurse's office like three or four
 

	
 
00:40:31.680 --> 00:40:34.680
 
times it's the amazing stuff and it this
 

	
 
00:40:34.680 --> 00:40:36.480
 
is life life changing right and this is
 

	
 
00:40:36.480 --> 00:40:38.339
 
what happens when we allow patients to
 

	
 
00:40:38.339 --> 00:40:40.619
 
engage in their care and allow people to
 

	
 
00:40:40.619 --> 00:40:42.780
 
control their technology and as I said
 

	
 
00:40:42.780 --> 00:40:44.400
 
it's not just medical devices medical
 

	
 
00:40:44.400 --> 00:40:46.560
 
devices are poignant but we have all of
 

	
 
00:40:46.560 --> 00:40:49.200
 
these ways that we can take control of
 

	
 
00:40:49.200 --> 00:40:50.339
 
our technology if we have the
 

	
 
00:40:50.339 --> 00:40:52.980
 
opportunity we can get together and we
 

	
 
00:40:52.980 --> 00:40:56.220
 
can form the um the organizations that
 

	
 
00:40:56.220 --> 00:40:58.500
 
can do this work we don't have to rely
 

	
 
00:40:58.500 --> 00:41:00.839
 
on these particular companies who like
 

	
 
00:41:00.839 --> 00:41:03.060
 
my medical medical device manufacturer
 

	
 
00:41:03.060 --> 00:41:06.480
 
may just not be tuned into are concern
 

	
 
00:41:06.480 --> 00:41:08.880
 
we may be in a part of the world where
 

	
 
00:41:08.880 --> 00:41:10.500
 
that company doesn't really have an
 

	
 
00:41:10.500 --> 00:41:12.599
 
interest or doesn't have expertise
 

	
 
00:41:12.599 --> 00:41:15.180
 
we may that company may not have a very
 

	
 
00:41:15.180 --> 00:41:18.119
 
diverse team the um if you've heard the
 

	
 
00:41:18.119 --> 00:41:19.680
 
an amazing
 

	
 
00:41:19.680 --> 00:41:23.579
 
um there's an amazing uh story about the
 

	
 
00:41:23.579 --> 00:41:25.079
 
that was all over Twitter a few years
 

	
 
00:41:25.079 --> 00:41:27.540
 
ago of a um
 

	
 
00:41:27.540 --> 00:41:29.220
 
soap soap dispensers and there are
 

	
 
00:41:29.220 --> 00:41:30.420
 
actually multiple brands of soap
 

	
 
00:41:30.420 --> 00:41:32.940
 
dispensers where if someone with light
 

	
 
00:41:32.940 --> 00:41:34.920
 
skin puts their hand under the soap
 

	
 
00:41:34.920 --> 00:41:37.920
 
dispenser it works great but if someone
 

	
 
00:41:37.920 --> 00:41:40.140
 
with dark skin puts their hand under the
 

	
 
00:41:40.140 --> 00:41:41.880
 
same soap dispenser nothing happens
 

	
 
00:41:41.880 --> 00:41:43.680
 
because they were relied on light
 

	
 
00:41:43.680 --> 00:41:45.900
 
reflection in order to determine whether
 

	
 
00:41:45.900 --> 00:41:48.260
 
to dispense soap and they're just
 

	
 
00:41:48.260 --> 00:41:50.700
 
obviously it was known with dark skin on
 

	
 
00:41:50.700 --> 00:41:52.740
 
that testing team otherwise they would
 

	
 
00:41:52.740 --> 00:41:55.740
 
have known right so we need to make sure
 

	
 
00:41:55.740 --> 00:41:57.900
 
that we are engaged with the creation of
 

	
 
00:41:57.900 --> 00:41:59.520
 
our technology that our technology has
 

	
 
00:41:59.520 --> 00:42:01.200
 
created diversely and that we don't
 

	
 
00:42:01.200 --> 00:42:03.599
 
leave it up to these companies who are
 

	
 
00:42:03.599 --> 00:42:06.240
 
only interested in their profit margins
 

	
 
00:42:06.240 --> 00:42:07.859
 
you know like
 

	
 
00:42:07.859 --> 00:42:09.359
 
they don't want disasters to happen
 

	
 
00:42:09.359 --> 00:42:10.920
 
because their profit margins are often
 

	
 
00:42:10.920 --> 00:42:13.740
 
aligned with public health but their
 

	
 
00:42:13.740 --> 00:42:18.119
 
goal is their profits so what can you do
 

	
 
00:42:18.119 --> 00:42:21.300
 
first of all please you're here so I
 

	
 
00:42:21.300 --> 00:42:22.560
 
think you're probably doing this already
 

	
 
00:42:22.560 --> 00:42:24.780
 
but have a dialogue about the big
 

	
 
00:42:24.780 --> 00:42:26.880
 
solutions that are possible I am
 

	
 
00:42:26.880 --> 00:42:30.359
 
astounded still as an American that gdpr
 

	
 
00:42:30.359 --> 00:42:34.079
 
happened and filled with gratitude for
 

	
 
00:42:34.079 --> 00:42:35.820
 
the protection that it is spilled over
 

	
 
00:42:35.820 --> 00:42:38.280
 
to the United States and if you would
 

	
 
00:42:38.280 --> 00:42:40.320
 
ask many people prior to it we would
 

	
 
00:42:40.320 --> 00:42:43.020
 
have said it was not possible there is a
 

	
 
00:42:43.020 --> 00:42:45.240
 
possibility for Mass reform if we look
 

	
 
00:42:45.240 --> 00:42:48.300
 
in every selection every way right if we
 

	
 
00:42:48.300 --> 00:42:50.160
 
look towards advocating for better
 

	
 
00:42:50.160 --> 00:42:54.300
 
legislation requiring the publication of
 

	
 
00:42:54.300 --> 00:42:57.000
 
of source code and giving users rights
 

	
 
00:42:57.000 --> 00:42:59.460
 
we can talk about making sure that we as
 

	
 
00:42:59.460 --> 00:43:02.460
 
consumers buy copy left of products we
 

	
 
00:43:02.460 --> 00:43:05.400
 
can talk about how we can we can create
 

	
 
00:43:05.400 --> 00:43:08.400
 
solutions that we can rely on and none
 

	
 
00:43:08.400 --> 00:43:10.740
 
of the solutions that will move us to a
 

	
 
00:43:10.740 --> 00:43:12.599
 
world with software Freedom will happen
 

	
 
00:43:12.599 --> 00:43:15.420
 
overnight none of them are easy they are
 

	
 
00:43:15.420 --> 00:43:17.460
 
all hard I was talking to somebody about
 

	
 
00:43:17.460 --> 00:43:21.240
 
this recently and I I said ah yes it's
 

	
 
00:43:21.240 --> 00:43:23.280
 
like trying to ask everyone to give up
 

	
 
00:43:23.280 --> 00:43:25.859
 
Amazon how do we do that now right none
 

	
 
00:43:25.859 --> 00:43:28.380
 
of these things are easy but they are
 

	
 
00:43:28.380 --> 00:43:29.940
 
important and they are Broad and
 

	
 
00:43:29.940 --> 00:43:31.319
 
sweeping and they are only going to
 

	
 
00:43:31.319 --> 00:43:33.960
 
happen with coordinated dialogue
 

	
 
00:43:33.960 --> 00:43:36.960
 
you everyone here in this room and
 

	
 
00:43:36.960 --> 00:43:40.740
 
listening on the live stream you are the
 

	
 
00:43:40.740 --> 00:43:44.160
 
tech savvy population you are the top
 

	
 
00:43:44.160 --> 00:43:47.160
 
knowledgeable people it is time for all
 

	
 
00:43:47.160 --> 00:43:49.740
 
of us technologists to stop relying on
 

	
 
00:43:49.740 --> 00:43:52.619
 
big tech for our Solutions I was in a
 

	
 
00:43:52.619 --> 00:43:54.619
 
meeting with some of the most
 

	
 
00:43:54.619 --> 00:43:58.079
 
influential Tech rights organizations in
 

	
 
00:43:58.079 --> 00:44:00.060
 
the world and they are advocating
 

	
 
00:44:00.060 --> 00:44:02.760
 
against Google by using Google Docs and
 

	
 
00:44:02.760 --> 00:44:06.420
 
Google infrastructure we are using all
 

	
 
00:44:06.420 --> 00:44:07.740
 
of these solutions that big tech
 

	
 
00:44:07.740 --> 00:44:09.420
 
provides us because they are convenient
 

	
 
00:44:09.420 --> 00:44:11.099
 
but they are not in our long-term
 

	
 
00:44:11.099 --> 00:44:13.260
 
interests and we have Alternatives that
 

	
 
00:44:13.260 --> 00:44:15.540
 
are ready now if you want to collaborate
 

	
 
00:44:15.540 --> 00:44:17.460
 
on a document we at software Freedom
 

	
 
00:44:17.460 --> 00:44:19.020
 
Conservancy maintain an ether pad which
 

	
 
00:44:19.020 --> 00:44:20.700
 
etherpad is also a software Freedom
 

	
 
00:44:20.700 --> 00:44:23.339
 
Conservancy member project you can use
 

	
 
00:44:23.339 --> 00:44:27.380
 
video chat using uh jitsi this is the
 

	
 
00:44:27.380 --> 00:44:29.400
 
meat.jit.c is the link
 

	
 
00:44:29.400 --> 00:44:31.079
 
um I really have to give a plug for a
 

	
 
00:44:31.079 --> 00:44:32.339
 
big blue button because it's designed
 

	
 
00:44:32.339 --> 00:44:34.680
 
for academic use and I think you should
 

	
 
00:44:34.680 --> 00:44:37.920
 
all join the charge to get this
 

	
 
00:44:37.920 --> 00:44:40.079
 
University to switch to big blue button
 

	
 
00:44:40.079 --> 00:44:42.720
 
it is perfect for that solution I have
 

	
 
00:44:42.720 --> 00:44:44.460
 
loved teaching classes on it and I think
 

	
 
00:44:44.460 --> 00:44:46.940
 
it works great and it's very stable
 

	
 
00:44:46.940 --> 00:44:48.720
 
and then
 

	
 
00:44:48.720 --> 00:44:50.760
 
go ahead and if you have old devices
 

	
 
00:44:50.760 --> 00:44:52.619
 
just play and put an alternate
 

	
 
00:44:52.619 --> 00:44:54.660
 
Distribution on it as many of you have
 

	
 
00:44:54.660 --> 00:44:56.460
 
if you have a phone try putting lineage
 

	
 
00:44:56.460 --> 00:44:58.740
 
or something else on it if you've got a
 

	
 
00:44:58.740 --> 00:45:00.540
 
laptop if you're just trying it out for
 

	
 
00:45:00.540 --> 00:45:02.760
 
the first time Ubuntu or Debian is
 

	
 
00:45:02.760 --> 00:45:04.500
 
really really great and you can save old
 

	
 
00:45:04.500 --> 00:45:06.599
 
equipment from going into landfills and
 

	
 
00:45:06.599 --> 00:45:08.940
 
make them perfectly useful if more
 

	
 
00:45:08.940 --> 00:45:11.280
 
people use it we have this like amazing
 

	
 
00:45:11.280 --> 00:45:14.880
 
spiraling situation where we don't have
 

	
 
00:45:14.880 --> 00:45:16.740
 
the buy-in for a software Freedom
 

	
 
00:45:16.740 --> 00:45:18.599
 
Solutions and so those Solutions
 

	
 
00:45:18.599 --> 00:45:21.780
 
continue to degrade and they get a
 

	
 
00:45:21.780 --> 00:45:23.099
 
little bit worse and a little bit worse
 

	
 
00:45:23.099 --> 00:45:25.319
 
over time because people say oh it's
 

	
 
00:45:25.319 --> 00:45:27.540
 
just so convenient I'm going to use you
 

	
 
00:45:27.540 --> 00:45:29.220
 
know I'm gonna I'm gonna use the the
 

	
 
00:45:29.220 --> 00:45:31.440
 
Apple product or I'm going to use um you
 

	
 
00:45:31.440 --> 00:45:34.920
 
know the the Google suite and over time
 

	
 
00:45:34.920 --> 00:45:37.920
 
we're just making more of that happen so
 

	
 
00:45:37.920 --> 00:45:40.859
 
we have to we have to buy into it the
 

	
 
00:45:40.859 --> 00:45:42.420
 
other thing I have to ask each and every
 

	
 
00:45:42.420 --> 00:45:44.579
 
one of you to do
 

	
 
00:45:44.579 --> 00:45:47.160
 
when you buy something if you see a
 

	
 
00:45:47.160 --> 00:45:49.560
 
license notice in it that says you have
 

	
 
00:45:49.560 --> 00:45:50.819
 
rights with respect to some of the
 

	
 
00:45:50.819 --> 00:45:52.680
 
software in this device and you get the
 

	
 
00:45:52.680 --> 00:45:55.800
 
manual that has the licenses in it if it
 

	
 
00:45:55.800 --> 00:45:57.180
 
says
 

	
 
00:45:57.180 --> 00:45:59.880
 
if it says ask for the source code by
 

	
 
00:45:59.880 --> 00:46:02.940
 
emailing this address please do it ask
 

	
 
00:46:02.940 --> 00:46:05.520
 
for it because right now only people who
 

	
 
00:46:05.520 --> 00:46:07.500
 
are really interested in modifying their
 

	
 
00:46:07.500 --> 00:46:09.660
 
software in a very intent way will ask
 

	
 
00:46:09.660 --> 00:46:11.520
 
and then companies it's very easy for
 

	
 
00:46:11.520 --> 00:46:13.680
 
them to ignore it even though the people
 

	
 
00:46:13.680 --> 00:46:15.599
 
who are asking are the ones who are
 

	
 
00:46:15.599 --> 00:46:16.740
 
going to make software that everyone
 

	
 
00:46:16.740 --> 00:46:18.540
 
else is going to use
 

	
 
00:46:18.540 --> 00:46:20.460
 
because only one person or a few people
 

	
 
00:46:20.460 --> 00:46:22.319
 
a handful of people asks the company
 

	
 
00:46:22.319 --> 00:46:23.819
 
thinks nobody cares and they're not
 

	
 
00:46:23.819 --> 00:46:25.560
 
taking it seriously and that's one of
 

	
 
00:46:25.560 --> 00:46:26.579
 
the things that we see over and over
 

	
 
00:46:26.579 --> 00:46:29.760
 
again until uh we contact them being the
 

	
 
00:46:29.760 --> 00:46:30.960
 
software Freedom conservancy and they
 

	
 
00:46:30.960 --> 00:46:32.520
 
get nervous that we might take action if
 

	
 
00:46:32.520 --> 00:46:34.800
 
they don't listen to us nothing nothing
 

	
 
00:46:34.800 --> 00:46:36.540
 
happens and the reason why we file that
 

	
 
00:46:36.540 --> 00:46:39.420
 
consumer rights suit was basically so
 

	
 
00:46:39.420 --> 00:46:41.400
 
that anyone who asked for the source
 

	
 
00:46:41.400 --> 00:46:43.740
 
code will be taken seriously
 

	
 
00:46:43.740 --> 00:46:45.839
 
um and then please support and engage in
 

	
 
00:46:45.839 --> 00:46:47.339
 
the organizations that are trying to
 

	
 
00:46:47.339 --> 00:46:49.500
 
make these changes possible
 

	
 
00:46:49.500 --> 00:46:51.599
 
um there's Ulysses on this you know
 

	
 
00:46:51.599 --> 00:46:54.480
 
that's active here and I understand they
 

	
 
00:46:54.480 --> 00:46:56.819
 
have a like an open source job fair that
 

	
 
00:46:56.819 --> 00:46:58.740
 
happens in this very building
 

	
 
00:46:58.740 --> 00:47:00.119
 
um like engage in these local
 

	
 
00:47:00.119 --> 00:47:01.560
 
organizations because this is how we're
 

	
 
00:47:01.560 --> 00:47:02.940
 
going to build the infrastructure that
 

	
 
00:47:02.940 --> 00:47:05.220
 
will make a change it's funny because
 

	
 
00:47:05.220 --> 00:47:08.339
 
when I was a student there was software
 

	
 
00:47:08.339 --> 00:47:10.339
 
Freedom like you could easily replace
 

	
 
00:47:10.339 --> 00:47:12.599
 
your the software on any of your devices
 

	
 
00:47:12.599 --> 00:47:15.359
 
and it was super easy you had a fully
 

	
 
00:47:15.359 --> 00:47:17.099
 
free device that you had complete
 

	
 
00:47:17.099 --> 00:47:18.300
 
control over
 

	
 
00:47:18.300 --> 00:47:20.339
 
um but it was it was it was kind of hard
 

	
 
00:47:20.339 --> 00:47:21.900
 
to do and it was kind of a niche thing
 

	
 
00:47:21.900 --> 00:47:24.960
 
and now free and open source software is
 

	
 
00:47:24.960 --> 00:47:27.540
 
everywhere and in everything but we
 

	
 
00:47:27.540 --> 00:47:29.160
 
actually have far less software freedom
 

	
 
00:47:29.160 --> 00:47:31.079
 
than we ever had before because we can't
 

	
 
00:47:31.079 --> 00:47:33.300
 
do anything with any of our devices it's
 

	
 
00:47:33.300 --> 00:47:34.859
 
the lower layers that are free and open
 

	
 
00:47:34.859 --> 00:47:36.119
 
and the only way we're going to change
 

	
 
00:47:36.119 --> 00:47:38.220
 
that is by banding together and
 

	
 
00:47:38.220 --> 00:47:40.319
 
supporting these organizations so I
 

	
 
00:47:40.319 --> 00:47:41.520
 
think I've gone a little bit long but I
 

	
 
00:47:41.520 --> 00:47:44.160
 
think we have time for questions
 

	
 
00:47:44.160 --> 00:47:46.980
 
um great so thank you so much and I
 

	
 
00:47:46.980 --> 00:47:49.560
 
would love to hear your questions please
 

	
 
00:47:49.560 --> 00:47:52.140
 
are you moderating the questions
 

	
 
00:47:52.140 --> 00:47:59.780
 
okay thank you
 

	
 
00:47:59.780 --> 00:48:04.079
 
no you might have to just come here
 

	
 
00:48:04.079 --> 00:48:07.200
 
let's open something it's collaborative
 

	
 
00:48:07.200 --> 00:48:09.839
 
collaborative okay I don't have a
 

	
 
00:48:09.839 --> 00:48:12.599
 
microphone so if you would like to ask a
 

	
 
00:48:12.599 --> 00:48:13.980
 
question please
 

	
 
00:48:13.980 --> 00:48:15.300
 
um
 

	
 
00:48:15.300 --> 00:48:17.660
 
speak very loudly
 

	
 
00:48:17.660 --> 00:48:21.540
 
yes floor is open there please go ahead
 

	
 
00:48:21.540 --> 00:48:28.940
 
Shout
 

	
 
00:48:28.940 --> 00:48:41.400
 
your Hardware security researcher
 

	
 
00:48:41.400 --> 00:48:42.839
 
yes
 

	
 
00:48:42.839 --> 00:48:45.420
 
please all Hardware security researchers
 

	
 
00:48:45.420 --> 00:48:49.760
 
please email compliance at
 

	
 
00:48:49.760 --> 00:48:52.079
 
sfconservancy.org we have a lot of work
 

	
 
00:48:52.079 --> 00:48:54.599
 
that we would love for you to do
 

	
 
00:48:54.599 --> 00:48:56.880
 
um yeah there's I mean there's there's
 

	
 
00:48:56.880 --> 00:48:59.700
 
so much there's so much and um you know
 

	
 
00:48:59.700 --> 00:49:02.220
 
we are we are a tiny organization we
 

	
 
00:49:02.220 --> 00:49:05.099
 
have uh six people on staff
 

	
 
00:49:05.099 --> 00:49:06.540
 
um and we run our internship program
 

	
 
00:49:06.540 --> 00:49:10.079
 
that has 130 people every year we have
 

	
 
00:49:10.079 --> 00:49:13.020
 
our 50 member projects that are building
 

	
 
00:49:13.020 --> 00:49:15.300
 
Alternatives and we're we do the
 

	
 
00:49:15.300 --> 00:49:17.339
 
lawsuits and protect copy left and we do
 

	
 
00:49:17.339 --> 00:49:19.079
 
all that with a really small staff and
 

	
 
00:49:19.079 --> 00:49:20.819
 
we rely on a lot of volunteers and
 

	
 
00:49:20.819 --> 00:49:22.859
 
that's really important because we're
 

	
 
00:49:22.859 --> 00:49:25.440
 
funded by the public primarily and
 

	
 
00:49:25.440 --> 00:49:28.079
 
grants and um and and a huge amount of
 

	
 
00:49:28.079 --> 00:49:29.700
 
our work is done by volunteers and
 

	
 
00:49:29.700 --> 00:49:31.980
 
that's important not just because
 

	
 
00:49:31.980 --> 00:49:34.020
 
um it gets the work done but it's also
 

	
 
00:49:34.020 --> 00:49:35.579
 
because it shows us that this work is
 

	
 
00:49:35.579 --> 00:49:38.220
 
important it's not enough that I think
 

	
 
00:49:38.220 --> 00:49:41.460
 
it's important it's it it has to be that
 

	
 
00:49:41.460 --> 00:49:43.560
 
we as a community think that this is
 

	
 
00:49:43.560 --> 00:49:45.000
 
important and can work together so I'd
 

	
 
00:49:45.000 --> 00:49:49.619
 
love to talk to you about that
 

	
 
00:49:49.619 --> 00:49:52.200
 
someone else question
 

	
 
00:49:52.200 --> 00:50:00.540
 
of time these
 

	
 
00:50:00.540 --> 00:50:03.839
 
how
 

	
 
00:50:03.839 --> 00:50:05.819
 
how can company
 

	
 
00:50:05.819 --> 00:50:07.319
 
thank you how can companies be
 

	
 
00:50:07.319 --> 00:50:09.599
 
incentivized to um to publish their
 

	
 
00:50:09.599 --> 00:50:10.920
 
source code
 

	
 
00:50:10.920 --> 00:50:13.680
 
um and how can we get them to do it
 

	
 
00:50:13.680 --> 00:50:15.300
 
um you know on their own and I've been
 

	
 
00:50:15.300 --> 00:50:18.060
 
wondering this for forever I thought I
 

	
 
00:50:18.060 --> 00:50:19.740
 
you know honestly I was so naive when I
 

	
 
00:50:19.740 --> 00:50:21.359
 
started this work I really thought that
 

	
 
00:50:21.359 --> 00:50:24.180
 
this is one of those areas where the
 

	
 
00:50:24.180 --> 00:50:26.880
 
corporate interests and the public good
 

	
 
00:50:26.880 --> 00:50:29.220
 
were aligned I really thought that the
 

	
 
00:50:29.220 --> 00:50:32.119
 
business case for open source
 

	
 
00:50:32.119 --> 00:50:36.119
 
would carry the day and that in fact and
 

	
 
00:50:36.119 --> 00:50:38.880
 
I think I think that The Originators of
 

	
 
00:50:38.880 --> 00:50:41.700
 
the software Freedom ideology also
 

	
 
00:50:41.700 --> 00:50:43.740
 
thought that and so many of the early
 

	
 
00:50:43.740 --> 00:50:46.079
 
developers especially for example the
 

	
 
00:50:46.079 --> 00:50:47.760
 
Linux kernel developers and other
 

	
 
00:50:47.760 --> 00:50:50.099
 
original projects like that that were so
 

	
 
00:50:50.099 --> 00:50:52.859
 
ideological and so forward-thinking were
 

	
 
00:50:52.859 --> 00:50:55.319
 
so excited when they started when their
 

	
 
00:50:55.319 --> 00:50:57.720
 
collaboration yield amazing results and
 

	
 
00:50:57.720 --> 00:50:59.760
 
those results started getting adopted by
 

	
 
00:50:59.760 --> 00:51:01.920
 
technology companies they it was
 

	
 
00:51:01.920 --> 00:51:03.960
 
suddenly like we've made this like we've
 

	
 
00:51:03.960 --> 00:51:06.540
 
this has happened because we've created
 

	
 
00:51:06.540 --> 00:51:08.099
 
something so useful that companies want
 

	
 
00:51:08.099 --> 00:51:10.559
 
to use it and then companies hired all
 

	
 
00:51:10.559 --> 00:51:12.900
 
of those people and now a very high
 

	
 
00:51:12.900 --> 00:51:16.200
 
percentage of those developers work at
 

	
 
00:51:16.200 --> 00:51:18.059
 
companies to work on those products and
 

	
 
00:51:18.059 --> 00:51:20.160
 
many of them work on things that they
 

	
 
00:51:20.160 --> 00:51:21.480
 
think are important to improve the
 

	
 
00:51:21.480 --> 00:51:22.800
 
software and many of them are still
 

	
 
00:51:22.800 --> 00:51:25.140
 
ideological but the idea that we could
 

	
 
00:51:25.140 --> 00:51:28.680
 
do well by doing good was flawed because
 

	
 
00:51:28.680 --> 00:51:31.859
 
we have put so many of our resources in
 

	
 
00:51:31.859 --> 00:51:36.300
 
into into corporate interest into into
 

	
 
00:51:36.300 --> 00:51:38.220
 
things that companies find either
 

	
 
00:51:38.220 --> 00:51:42.059
 
palatable or profitable and what becomes
 

	
 
00:51:42.059 --> 00:51:45.420
 
overlooked is our ability as a public to
 

	
 
00:51:45.420 --> 00:51:48.059
 
do with our devices what we want to our
 

	
 
00:51:48.059 --> 00:51:50.040
 
ability to stay free from surveillance
 

	
 
00:51:50.040 --> 00:51:52.500
 
our ability to make sure that you know
 

	
 
00:51:52.500 --> 00:51:54.960
 
we're not only not being spied on but
 

	
 
00:51:54.960 --> 00:51:58.440
 
that we can use our devices not only for
 

	
 
00:51:58.440 --> 00:52:00.540
 
their intended purpose or other purposes
 

	
 
00:52:00.540 --> 00:52:04.380
 
right I it's currently difficult to find
 

	
 
00:52:04.380 --> 00:52:06.000
 
a product on the market that doesn't
 

	
 
00:52:06.000 --> 00:52:08.400
 
phone home like there are smart
 

	
 
00:52:08.400 --> 00:52:10.619
 
toothbrushes where they're taking video
 

	
 
00:52:10.619 --> 00:52:12.839
 
of your teeth to send back to a
 

	
 
00:52:12.839 --> 00:52:15.180
 
centralized company and then also taking
 

	
 
00:52:15.180 --> 00:52:17.280
 
video of everything else in your house
 

	
 
00:52:17.280 --> 00:52:19.800
 
and these companies are trying to
 

	
 
00:52:19.800 --> 00:52:21.420
 
collect as much information as they can
 

	
 
00:52:21.420 --> 00:52:23.160
 
because they want to be able to Pivot
 

	
 
00:52:23.160 --> 00:52:24.540
 
whatever business model that they can
 

	
 
00:52:24.540 --> 00:52:26.880
 
and this is so Insidious that it's very
 

	
 
00:52:26.880 --> 00:52:28.680
 
hard to predict what the interests will
 

	
 
00:52:28.680 --> 00:52:30.059
 
be of those companies in the long run
 

	
 
00:52:30.059 --> 00:52:31.800
 
and what we have found is that without
 

	
 
00:52:31.800 --> 00:52:35.160
 
text checks and balances the free and
 

	
 
00:52:35.160 --> 00:52:36.839
 
open source software is just exploited
 

	
 
00:52:36.839 --> 00:52:40.319
 
and what we need is to have a public
 

	
 
00:52:40.319 --> 00:52:42.960
 
focused component of it there we used to
 

	
 
00:52:42.960 --> 00:52:44.880
 
people used to say
 

	
 
00:52:44.880 --> 00:52:46.859
 
from like the old days and I know that
 

	
 
00:52:46.859 --> 00:52:48.839
 
some of you here are have been involved
 

	
 
00:52:48.839 --> 00:52:50.520
 
in the community for a long time and
 

	
 
00:52:50.520 --> 00:52:52.440
 
some of you are new and haven't
 

	
 
00:52:52.440 --> 00:52:54.240
 
experienced it a lot but in the old days
 

	
 
00:52:54.240 --> 00:52:56.640
 
people would say free software is an
 

	
 
00:52:56.640 --> 00:52:59.460
 
ideological movement and open source is
 

	
 
00:52:59.460 --> 00:53:01.680
 
commercial and I used to fight so hard
 

	
 
00:53:01.680 --> 00:53:05.040
 
to say that's not true because open
 

	
 
00:53:05.040 --> 00:53:07.859
 
source sounds like it's just about
 

	
 
00:53:07.859 --> 00:53:10.800
 
seeing the code but everyone would tell
 

	
 
00:53:10.800 --> 00:53:12.240
 
you that it's not open source if you
 

	
 
00:53:12.240 --> 00:53:14.339
 
don't have the ability to modify it and
 

	
 
00:53:14.339 --> 00:53:15.900
 
free software it sounds like it's just
 

	
 
00:53:15.900 --> 00:53:17.040
 
about price
 

	
 
00:53:17.040 --> 00:53:19.140
 
but it is about rights and it's really
 

	
 
00:53:19.140 --> 00:53:21.119
 
about the same thing if you look at the
 

	
 
00:53:21.119 --> 00:53:23.819
 
definitions they're they effectively say
 

	
 
00:53:23.819 --> 00:53:26.940
 
the same things in the end but what was
 

	
 
00:53:26.940 --> 00:53:30.599
 
true about that that I missed is that is
 

	
 
00:53:30.599 --> 00:53:33.859
 
that we can't have it all we have to
 

	
 
00:53:33.859 --> 00:53:36.420
 
prioritize the public good we have to
 

	
 
00:53:36.420 --> 00:53:38.280
 
prioritize our ability to take control
 

	
 
00:53:38.280 --> 00:53:40.380
 
of our of our technology
 

	
 
00:53:40.380 --> 00:53:44.040
 
and I don't know I I guess I'd say that
 

	
 
00:53:44.040 --> 00:53:46.440
 
we've tried that experiment of trying to
 

	
 
00:53:46.440 --> 00:53:48.599
 
make it interesting and exciting for
 

	
 
00:53:48.599 --> 00:53:50.220
 
companies and what happens is they
 

	
 
00:53:50.220 --> 00:53:52.319
 
engage only as much as they have to they
 

	
 
00:53:52.319 --> 00:53:53.940
 
give up only as much as they absolutely
 

	
 
00:53:53.940 --> 00:53:56.040
 
have to so the only way to incentivize
 

	
 
00:53:56.040 --> 00:53:58.260
 
them is to legislate it so that they
 

	
 
00:53:58.260 --> 00:53:59.760
 
must do it
 

	
 
00:53:59.760 --> 00:54:02.940
 
or we incentivize them by every single
 

	
 
00:54:02.940 --> 00:54:05.640
 
one of us only buys products that have
 

	
 
00:54:05.640 --> 00:54:07.619
 
copy left it software in them and we
 

	
 
00:54:07.619 --> 00:54:09.300
 
tell companies that we're doing it we
 

	
 
00:54:09.300 --> 00:54:11.040
 
asked for the source code when they
 

	
 
00:54:11.040 --> 00:54:13.079
 
don't provide it we say well I'm never
 

	
 
00:54:13.079 --> 00:54:14.640
 
going to buy your device again
 

	
 
00:54:14.640 --> 00:54:16.200
 
and I'm telling everybody else I'm
 

	
 
00:54:16.200 --> 00:54:18.300
 
writing an article to my local paper I'm
 

	
 
00:54:18.300 --> 00:54:19.980
 
going to find an alternative where I can
 

	
 
00:54:19.980 --> 00:54:21.180
 
get the source code and I'm going to
 

	
 
00:54:21.180 --> 00:54:22.680
 
support it I think I think it's the only
 

	
 
00:54:22.680 --> 00:54:25.020
 
way because otherwise we're just kidding
 

	
 
00:54:25.020 --> 00:54:29.059
 
ourselves
 

	
 
00:54:29.059 --> 00:54:31.500
 
okay I think there's time for one more
 

	
 
00:54:31.500 --> 00:54:32.819
 
question
 

	
 
00:54:32.819 --> 00:54:40.800
 
please
 

	
 
00:54:40.800 --> 00:54:43.500
 
oh this is such a great question how do
 

	
 
00:54:43.500 --> 00:54:45.900
 
you manage the risks and liability what
 

	
 
00:54:45.900 --> 00:54:47.099
 
if somebody working on your
 

	
 
00:54:47.099 --> 00:54:49.980
 
defibrillator gets it wrong and the
 

	
 
00:54:49.980 --> 00:54:52.380
 
secret answer like the real answer to
 

	
 
00:54:52.380 --> 00:54:55.260
 
this question is that software is full
 

	
 
00:54:55.260 --> 00:54:57.180
 
of liability because software is
 

	
 
00:54:57.180 --> 00:54:59.520
 
vulnerable and just because something is
 

	
 
00:54:59.520 --> 00:55:02.819
 
free and open source doesn't mean that
 

	
 
00:55:02.819 --> 00:55:05.579
 
it is any any more vulnerable in fact
 

	
 
00:55:05.579 --> 00:55:07.440
 
it's the opposite way around and
 

	
 
00:55:07.440 --> 00:55:10.319
 
security researchers have found that
 

	
 
00:55:10.319 --> 00:55:12.180
 
devices that have free and open source
 

	
 
00:55:12.180 --> 00:55:14.640
 
software there's like a more complicated
 

	
 
00:55:14.640 --> 00:55:15.900
 
answer to this that I'm going to skip
 

	
 
00:55:15.900 --> 00:55:17.819
 
but uh but they call what you're talking
 

	
 
00:55:17.819 --> 00:55:20.460
 
about security through obscurity so if
 

	
 
00:55:20.460 --> 00:55:22.380
 
you don't publish the source code then
 

	
 
00:55:22.380 --> 00:55:24.720
 
you're safe but in fact that's not the
 

	
 
00:55:24.720 --> 00:55:27.240
 
only like there are many ways to you can
 

	
 
00:55:27.240 --> 00:55:28.800
 
talk to the general in the back there
 

	
 
00:55:28.800 --> 00:55:32.160
 
are so many ways to or I'm sorry for
 

	
 
00:55:32.160 --> 00:55:33.540
 
generating the person in the back I
 

	
 
00:55:33.540 --> 00:55:35.280
 
don't know why I did that I apologize uh
 

	
 
00:55:35.280 --> 00:55:37.319
 
but um but there are so many ways that
 

	
 
00:55:37.319 --> 00:55:40.440
 
you can that you can you can show a
 

	
 
00:55:40.440 --> 00:55:42.599
 
device be vulnerable and exploited and
 

	
 
00:55:42.599 --> 00:55:45.059
 
so having real Security on devices
 

	
 
00:55:45.059 --> 00:55:46.740
 
having
 

	
 
00:55:46.740 --> 00:55:48.900
 
um you know having encryption having
 

	
 
00:55:48.900 --> 00:55:51.660
 
real security not this not security
 

	
 
00:55:51.660 --> 00:55:53.760
 
theater I mean that's really where it's
 

	
 
00:55:53.760 --> 00:55:56.819
 
at I for example I want the software on
 

	
 
00:55:56.819 --> 00:55:58.680
 
my device to be published and available
 

	
 
00:55:58.680 --> 00:56:01.440
 
for review but I want there to be I
 

	
 
00:56:01.440 --> 00:56:03.660
 
don't want any I want there to be either
 

	
 
00:56:03.660 --> 00:56:06.000
 
a password or encryption or some way
 

	
 
00:56:06.000 --> 00:56:07.920
 
that only my device can tell and that
 

	
 
00:56:07.920 --> 00:56:09.540
 
and that's and that's real because
 

	
 
00:56:09.540 --> 00:56:12.420
 
previously these devices had no had none
 

	
 
00:56:12.420 --> 00:56:13.920
 
of that before but this device the
 

	
 
00:56:13.920 --> 00:56:15.660
 
software wasn't published and so
 

	
 
00:56:15.660 --> 00:56:17.579
 
researchers show that you could just
 

	
 
00:56:17.579 --> 00:56:19.859
 
cause them to shock people unnecessarily
 

	
 
00:56:19.859 --> 00:56:21.540
 
you could get information off of those
 

	
 
00:56:21.540 --> 00:56:23.819
 
devices so
 

	
 
00:56:23.819 --> 00:56:25.859
 
the question is like how do we manage
 

	
 
00:56:25.859 --> 00:56:28.380
 
our software liability and it's scary
 

	
 
00:56:28.380 --> 00:56:31.079
 
stuff but having the software public
 

	
 
00:56:31.079 --> 00:56:32.819
 
means that it can be reviewed and it can
 

	
 
00:56:32.819 --> 00:56:34.500
 
be tested and yes there might be times
 

	
 
00:56:34.500 --> 00:56:35.819
 
where
 

	
 
00:56:35.819 --> 00:56:37.920
 
um where folks who are malicious may be
 

	
 
00:56:37.920 --> 00:56:40.079
 
able to find an exploit by Examining The
 

	
 
00:56:40.079 --> 00:56:41.940
 
Source Code but because there are so
 

	
 
00:56:41.940 --> 00:56:43.619
 
many exploits available without access
 

	
 
00:56:43.619 --> 00:56:45.059
 
to the source code
 

	
 
00:56:45.059 --> 00:56:47.579
 
it's just one of the benefits vastly
 

	
 
00:56:47.579 --> 00:56:49.079
 
outweigh the
 

	
 
00:56:49.079 --> 00:56:52.020
 
um you know the risks in my in my view
 

	
 
00:56:52.020 --> 00:56:54.540
 
and as we develop more infrastructure
 

	
 
00:56:54.540 --> 00:56:56.040
 
around free and open source software
 

	
 
00:56:56.040 --> 00:56:57.180
 
projects we'll find that to be the case
 

	
 
00:56:57.180 --> 00:56:59.099
 
an example perfect example of this is
 

	
 
00:56:59.099 --> 00:57:00.660
 
the Linux kernel which is considered to
 

	
 
00:57:00.660 --> 00:57:04.740
 
be one of the most secure kernels and
 

	
 
00:57:04.740 --> 00:57:08.339
 
that has been free and open for
 

	
 
00:57:08.339 --> 00:57:12.059
 
about 30 years
 

	
 
00:57:12.059 --> 00:57:14.520
 
oh I said well I I did we said one more
 

	
 
00:57:14.520 --> 00:57:16.319
 
can I do more okay one more before but
 

	
 
00:57:16.319 --> 00:57:20.760
 
yeah okay
 

	
 
00:57:20.760 --> 00:57:22.859
 
how does right to repair ah how does
 

	
 
00:57:22.859 --> 00:57:24.180
 
right to repair fit into the goals of
 

	
 
00:57:24.180 --> 00:57:25.800
 
the software Freedom Conservancy if it
 

	
 
00:57:25.800 --> 00:57:28.859
 
were not abundant yet from my talk
 

	
 
00:57:28.859 --> 00:57:30.960
 
software freedom is the software right
 

	
 
00:57:30.960 --> 00:57:32.220
 
to repair
 

	
 
00:57:32.220 --> 00:57:33.599
 
so
 

	
 
00:57:33.599 --> 00:57:36.359
 
in order to be able to repair any modern
 

	
 
00:57:36.359 --> 00:57:40.260
 
equipment we need software Freedom you
 

	
 
00:57:40.260 --> 00:57:42.480
 
cannot effectively repair anything
 

	
 
00:57:42.480 --> 00:57:45.000
 
without being able to have the software
 

	
 
00:57:45.000 --> 00:57:47.400
 
right to repair and what's cool about
 

	
 
00:57:47.400 --> 00:57:49.319
 
copy left licensing and why I spent so
 

	
 
00:57:49.319 --> 00:57:52.200
 
much time on the Vizio suit is that we
 

	
 
00:57:52.200 --> 00:57:54.180
 
have a right to repair in all of these
 

	
 
00:57:54.180 --> 00:57:55.619
 
Linux devices
 

	
 
00:57:55.619 --> 00:57:58.619
 
I mean the Vizio TVs had I forget how
 

	
 
00:57:58.619 --> 00:57:59.400
 
many
 

	
 
00:57:59.400 --> 00:58:01.260
 
um different kinds of software on it I
 

	
 
00:58:01.260 --> 00:58:04.859
 
think 22 22 copy lifted projects on it
 

	
 
00:58:04.859 --> 00:58:06.960
 
it wasn't just the Linux kernel loads of
 

	
 
00:58:06.960 --> 00:58:09.359
 
software that give us these rights the
 

	
 
00:58:09.359 --> 00:58:11.280
 
rights to get complete and corresponding
 

	
 
00:58:11.280 --> 00:58:12.720
 
source code and the scripts to control
 

	
 
00:58:12.720 --> 00:58:15.420
 
installation so we should be able to do
 

	
 
00:58:15.420 --> 00:58:17.520
 
something about this but we haven't been
 

	
 
00:58:17.520 --> 00:58:19.079
 
able to yet in part because companies
 

	
 
00:58:19.079 --> 00:58:20.819
 
just don't do the right thing they don't
 

	
 
00:58:20.819 --> 00:58:22.980
 
they don't think about the fact that
 

	
 
00:58:22.980 --> 00:58:25.619
 
they have to publish their source code
 

	
 
00:58:25.619 --> 00:58:27.839
 
before they go to market then they go to
 

	
 
00:58:27.839 --> 00:58:30.540
 
market and they scramble in general we
 

	
 
00:58:30.540 --> 00:58:33.059
 
we've talked to loads and loads of
 

	
 
00:58:33.059 --> 00:58:35.099
 
companies about their non-compliance and
 

	
 
00:58:35.099 --> 00:58:37.020
 
what turns out is that often as I said
 

	
 
00:58:37.020 --> 00:58:38.220
 
they don't even have the software
 

	
 
00:58:38.220 --> 00:58:40.020
 
themselves because they never ask for it
 

	
 
00:58:40.020 --> 00:58:41.700
 
from their vendors to begin with and
 

	
 
00:58:41.700 --> 00:58:43.140
 
they didn't put if they developed it
 

	
 
00:58:43.140 --> 00:58:45.119
 
in-house they did put the process in
 

	
 
00:58:45.119 --> 00:58:46.920
 
place to begin with so they don't have
 

	
 
00:58:46.920 --> 00:58:50.339
 
the infrastructure in place they don't
 

	
 
00:58:50.339 --> 00:58:52.559
 
even employ the employees that worked on
 

	
 
00:58:52.559 --> 00:58:53.940
 
the developers that worked on that
 

	
 
00:58:53.940 --> 00:58:56.579
 
software back then those people have
 

	
 
00:58:56.579 --> 00:58:58.559
 
often left the company and moved on to
 

	
 
00:58:58.559 --> 00:59:00.839
 
other projects and so they just don't
 

	
 
00:59:00.839 --> 00:59:03.000
 
even have the resources to be able to
 

	
 
00:59:03.000 --> 00:59:04.859
 
find that software later which is
 

	
 
00:59:04.859 --> 00:59:06.240
 
terrifying because it means that if
 

	
 
00:59:06.240 --> 00:59:07.680
 
there's a problem with their products
 

	
 
00:59:07.680 --> 00:59:09.540
 
they basically have to recall them
 

	
 
00:59:09.540 --> 00:59:11.220
 
there's nothing left that that can be
 

	
 
00:59:11.220 --> 00:59:13.260
 
done so in order for us to make sure
 

	
 
00:59:13.260 --> 00:59:15.240
 
that that changes we have to be louder
 

	
 
00:59:15.240 --> 00:59:17.339
 
about it and we have to make these
 

	
 
00:59:17.339 --> 00:59:18.720
 
companies realize that there is
 

	
 
00:59:18.720 --> 00:59:20.119
 
liability
 

	
 
00:59:20.119 --> 00:59:22.740
 
for their you know for their
 

	
 
00:59:22.740 --> 00:59:24.359
 
non-compliance because that will
 

	
 
00:59:24.359 --> 00:59:27.240
 
incentivize them to comply
 

	
 
00:59:27.240 --> 00:59:35.960
 
foreign
 

	
 
00:59:35.960 --> 00:59:40.079
 
are evoking but I was told that yeah we
 

	
 
00:59:40.079 --> 00:59:41.819
 
should close the session after one hour
 

	
 
00:59:41.819 --> 00:59:43.619
 
maybe there are students that are still
 

	
 
00:59:43.619 --> 00:59:45.960
 
having to do some exams I don't know
 

	
 
00:59:45.960 --> 00:59:48.119
 
wishing them good luck in that case of
 

	
 
00:59:48.119 --> 00:59:51.480
 
course but uh most of all I would like
 

	
 
00:59:51.480 --> 00:59:54.540
 
you to invite you to share with me the
 

	
 
00:59:54.540 --> 01:00:02.339
 
Applause for Aaron once more
 

	
 
01:00:02.339 --> 01:00:04.980
 
and you know you still have to put four
 

	
 
01:00:04.980 --> 01:00:06.180
 
more
 

	
 
01:00:06.180 --> 01:00:08.460
 
uh in two days I think the second yeah
 

	
 
01:00:08.460 --> 01:00:11.579
 
two days from now when you will get this
 

	
 
01:00:11.579 --> 01:00:14.760
 
Armory uh award from our University
 

	
 
01:00:14.760 --> 01:00:16.980
 
someone else will give it to you I would
 

	
 
01:00:16.980 --> 01:00:18.900
 
love to do it but that's uh we
 

	
 
01:00:18.900 --> 01:00:23.880
 
definitely
 

	
 
01:00:23.880 --> 01:00:25.200
 
um
 

	
 
01:00:25.200 --> 01:00:28.380
 
being here with Ken thanks so much
 

	
 
01:00:28.380 --> 01:00:31.380
 
foreign
 

	
conservancy/static/docs/2023-02-02_Sandler-Karen_KU-Leuven_Honorary-Doctorate.en.txt
Show inline comments
 
WEBVTT
 
Kind: captions
 
Language: en
 

	
 

	
 

	
 
00:00:01.560 --> 00:00:03.720
 
Karen Sandler is a lawyer
 

	
 
00:00:03.720 --> 00:00:07.520
 
and Executive Director
 
of the Software Freedom Conservancy,
 

	
 
00:00:07.520 --> 00:00:11.720
 
a non-profit organisation
 
devoted to ethical technology
 

	
 
00:00:11.720 --> 00:00:14.840
 
and free and open source software.
 

	
 
00:00:14.840 --> 00:00:20.480
 
Karen Sandler is an adjunct lecturer
 
at Colombia Law School, where she studied,
 

	
 
00:00:20.480 --> 00:00:21.640
 
and is a visiting professor
 

	
 
00:00:21.640 --> 00:00:24.400
 
at the University of California,
 
Santa Cruz.
 

	
 
00:00:24.400 --> 00:00:29.280
 
In addition to her law degree, she holds
 
a Bachelor of Science in Engineering
 

	
 
00:00:29.280 --> 00:00:40.840
 
from the Cooper Union
 
for the Advancement of Science and Art.
 

	
 
00:00:40.840 --> 00:00:45.400
 
Karen Sandler is an American lawyer
 
and software expert
 

	
 
00:00:45.400 --> 00:00:49.800
 
who promotes
 
free and open source software.
 

	
 
00:00:49.800 --> 00:00:53.760
 
That's software whose source code
 
is freely available to consult,
 

	
 
00:00:53.760 --> 00:00:58.640
 
adapt and disseminate.
 

	
 
00:00:58.640 --> 00:01:02.160
 
If the coronavirus crisis
 
made one thing clear,
 

	
 
00:01:02.160 --> 00:01:06.440
 
it’s that software is fundamental
 
to our society.
 

	
 
00:01:06.440 --> 00:01:11.120
 
We really need it,
 
certainly in the past few years.
 

	
 
00:01:11.120 --> 00:01:14.720
 
That goes even more for medical software,
 

	
 
00:01:14.720 --> 00:01:18.240
 
which gives people the opportunity
 
to lead a normal life,
 

	
 
00:01:18.240 --> 00:01:21.640
 
even if they have a certain illness
 
or condition.
 

	
 
00:01:21.640 --> 00:01:24.240
 
For example, Karen Sandler's pacemaker.
 

	
 
00:01:24.240 --> 00:01:26.880
 
If she didn’t have one,
 
she’d be at greater risk,
 

	
 
00:01:26.880 --> 00:01:30.640
 
and she would never have been able
 
to do what she's doing now.
 

	
 
00:01:30.640 --> 00:01:32.600
 
And she's certainly not alone.
 

	
 
00:01:32.600 --> 00:01:37.040
 
There are others in similar situations.
 

	
 
00:01:37.040 --> 00:01:39.840
 
She had a pacemaker put in,
 

	
 
00:01:39.840 --> 00:01:44.200
 
and when she wanted to find out
 
if it was safe and secure,
 

	
 
00:01:44.200 --> 00:01:47.280
 
she also wanted to see its source code.
 

	
 
00:01:47.280 --> 00:01:49.320
 
Unfortunately, that wasn’t possible,
 

	
 
00:01:49.320 --> 00:01:58.400
 
which demonstrates the importance
 
of free and open source software.
 

	
 
00:01:58.400 --> 00:02:03.440
 
If the source code for software
 
is in the hands of one company,
 

	
 
00:02:03.440 --> 00:02:07.400
 
then we're all dependent
 
on that company's goodwill.
 

	
 
00:02:07.400 --> 00:02:10.800
 
They can say of their own accord:
 
we'll solve this, not that.
 

	
 
00:02:10.800 --> 00:02:13.680
 
We have the means to do this,
 
but not that.
 

	
 
00:02:13.680 --> 00:02:17.480
 
A company can always go bankrupt,
 
the source code then disappears,
 

	
 
00:02:17.480 --> 00:02:19.920
 
and society can no longer use it.
 

	
 
00:02:19.920 --> 00:02:23.240
 
That’s what open and free software is all about.
 

	
 
00:02:23.240 --> 00:02:27.440
 
Anyone can access the source code,
 
and everyone can disseminate it.
 

	
 
00:02:27.440 --> 00:02:33.640
 
And that's what Karen Sandler stands for.
 

	
 
00:02:33.640 --> 00:02:40.560
 
Karen Sandler also fights discrimination
 
in the world of technology
 

	
 
00:02:40.560 --> 00:02:43.560
 
and pushes for more inclusivity
 

	
 
00:02:43.560 --> 00:02:46.800
 
through the programme Outreachy,
 
amongst other efforts.
 

	
 
00:02:46.800 --> 00:02:51.600
 
Outreachy organises internships
 
for minorities or women,
 

	
 
00:02:51.600 --> 00:02:57.120
 
to help them get more involved in the world
 
of technology and software.
 

	
 
00:02:57.120 --> 00:03:01.120
 
Karen Sandler inspires us, as students,
 
because she is ambitious
 

	
 
00:03:01.120 --> 00:03:03.640
 
and fights passionately for her cause.
 

	
 
00:03:03.640 --> 00:03:06.880
 
Her personal story about the pacemaker
 

	
 
00:03:06.880 --> 00:03:11.160
 
actually serves as a metaphor
 
for all the technology and software
 

	
 
00:03:11.160 --> 00:03:15.560
 
we rely on in modern society.
 

	
 
00:03:15.560 --> 00:03:19.280
 
Its safety is of major importance.
 

	
 
00:03:19.280 --> 00:03:23.920
 
It’s essential for software
 
to be free and open source,
 

	
 
00:03:23.920 --> 00:03:27.320
 
so we can check whether it's safe
 

	
 
00:03:27.320 --> 00:03:33.520
 
and see whether there is
 
any room for improvement.
 

	
 
00:03:33.520 --> 00:03:35.600
 
For all of these reasons, Rector,
 

	
 
00:03:35.600 --> 00:03:38.680
 
on behalf of the Academic Council,
 
we request
 

	
 
00:03:38.680 --> 00:03:44.200
 
that you grant Karen Sandler
 
the KU Leuven honorary doctorate.
 

	
conservancy/static/docs/2023-02-02_Sandler-Karen_KU-Leuven_Honorary-Doctorate.nl.txt
Show inline comments
 
WEBVTT
 
Kind: captions
 
Language: nl
 

	
 

	
 

	
 
00:00:01.560 --> 00:00:03.720
 
Karen Sandler is advocaat
 

	
 
00:00:03.720 --> 00:00:07.520
 
en executive director
 
van de Software Freedom Conservancy,
 

	
 
00:00:07.520 --> 00:00:11.720
 
een non-profitorganisatie
 
die ijvert voor ethische technologie
 

	
 
00:00:11.720 --> 00:00:14.840
 
en voor vrije en opensourcesoftware.
 

	
 
00:00:14.840 --> 00:00:18.640
 
Karen Sandler is adjunct-lector
 
aan Colombia Law School,
 

	
 
00:00:18.640 --> 00:00:20.480
 
waar ze ook zelf studeerde,
 

	
 
00:00:20.480 --> 00:00:24.400
 
en gastprofessor aan
 
de University of California, Santa Cruz.
 

	
 
00:00:24.400 --> 00:00:29.280
 
Ze behaalde naast haar rechtendiploma
 
ook een Bachelor of Science in Engineering
 

	
 
00:00:29.280 --> 00:00:40.840
 
aan de Cooper Union
 
for the Advancement of Science and Art.
 

	
 
00:00:40.840 --> 00:00:45.400
 
Karen Sandler is een Amerikaanse juriste
 
en software-experte
 

	
 
00:00:45.400 --> 00:00:49.800
 
die zich inzet
 
voor vrije en opensourcesoftware.
 

	
 
00:00:49.800 --> 00:00:53.760
 
Dat is software waarvan je de broncode
 
vrij kan raadplegen,
 

	
 
00:00:53.760 --> 00:00:58.640
 
aanpassen en verspreiden.
 

	
 
00:00:58.640 --> 00:01:02.160
 
Als er één iets duidelijk is geworden
 
door heel de coronacrisis,
 

	
 
00:01:02.160 --> 00:01:06.440
 
is het wel dat software heel
 
fundamenteel is voor onze maatschappij.
 

	
 
00:01:06.440 --> 00:01:11.120
 
We hebben dat echt nodig,
 
zeker de afgelopen paar jaren.
 

	
 
00:01:11.120 --> 00:01:14.720
 
Dat geldt des te meer
 
voor bijvoorbeeld medische software,
 

	
 
00:01:14.720 --> 00:01:18.240
 
die mensen de kans geeft
 
om een normaal leven te leiden,
 

	
 
00:01:18.240 --> 00:01:21.640
 
ook al lijden zij aan een bepaalde ziekte,
 
een bepaalde aandoening.
 

	
 
00:01:21.640 --> 00:01:24.240
 
Bijvoorbeeld de pacemaker
 
van Karen Sandler.
 

	
 
00:01:24.240 --> 00:01:26.880
 
Als zij die niet had,
 
dan was er veel meer risico voor haar
 

	
 
00:01:26.880 --> 00:01:30.640
 
en had ze ook nooit kunnen doen
 
wat ze nu allemaal aan het doen is.
 

	
 
00:01:30.640 --> 00:01:32.600
 
En zij is zeker geen geïsoleerd geval.
 

	
 
00:01:32.600 --> 00:01:37.040
 
Er zijn nog meer mensen
 
die in zulke situaties zitten.
 

	
 
00:01:37.040 --> 00:01:39.840
 
Zij heeft een pacemaker laten installeren
 

	
 
00:01:39.840 --> 00:01:44.200
 
en toen zij wou nagaan
 
of die wel veilig en goed was,
 

	
 
00:01:44.200 --> 00:01:47.280
 
wou zij ook de broncode daarvan bekijken.
 

	
 
00:01:47.280 --> 00:01:49.320
 
Helaas bleek dat niet mogelijk,
 

	
 
00:01:49.320 --> 00:01:58.400
 
wat wel wijst op het belang van
 
vrije en opensourcesoftware.
 

	
 
00:01:58.400 --> 00:02:03.440
 
Als die software dan, die broncode
 
bij één bepaald bedrijf zit,
 

	
 
00:02:03.440 --> 00:02:07.400
 
dan hangen wij allemaal een beetje af
 
van de goodwill van dat bedrijf.
 

	
 
00:02:07.400 --> 00:02:10.800
 
Die kunnen dan eigenlijk eigenhandig
 
gaan zeggen: dit lossen we op, dit niet.
 

	
 
00:02:10.800 --> 00:02:13.680
 
Hiervoor hebben we de middelen,
 
hiervoor niet.
 

	
 
00:02:13.680 --> 00:02:17.480
 
En een bedrijf kan ook altijd failliet
 
gaan en dan is die broncode weg
 

	
 
00:02:17.480 --> 00:02:19.920
 
en hebben we daar niks meer aan
 
als maatschappij.
 

	
 
00:02:19.920 --> 00:02:23.240
 
En dat is waar open en free software
 
voor staat.
 

	
 
00:02:23.240 --> 00:02:27.440
 
Iedereen kan aan die broncode,
 
iedereen kan die ook verspreiden.
 

	
 
00:02:27.440 --> 00:02:33.640
 
Dat is ook waar Karen Sandler
 
heel hard voor staat.
 

	
 
00:02:33.640 --> 00:02:36.800
 
Karen Sandler zet zich daarnaast ook in
 

	
 
00:02:36.800 --> 00:02:40.560
 
om discriminatie tegen te gaan
 
in de technologiewereld
 

	
 
00:02:40.560 --> 00:02:43.560
 
en voor meer inclusiviteit te zorgen.
 

	
 
00:02:43.560 --> 00:02:46.800
 
Dat doet zij onder andere
 
via het programma Outreachy
 

	
 
00:02:46.800 --> 00:02:51.600
 
dat stages organiseert
 
voor minderheden of voor vrouwen
 

	
 
00:02:51.600 --> 00:02:57.120
 
en hen op die manier meer betrekt in
 
de technologie- en in de softwarewereld.
 

	
 
00:02:57.120 --> 00:03:01.120
 
Karen Sandler inspireert ons als studenten
 
omdat zij gedreven is
 

	
 
00:03:01.120 --> 00:03:03.640
 
en vol passie strijdt voor haar zaak.
 

	
 
00:03:03.640 --> 00:03:06.880
 
Haar persoonlijke verhaal
 
over de pacemaker
 

	
 
00:03:06.880 --> 00:03:11.160
 
geldt eigenlijk als metafoor
 
voor alle technologie en software
 

	
 
00:03:11.160 --> 00:03:15.560
 
waar wij mee te maken krijgen
 
in onze hedendaagse maatschappij.
 

	
 
00:03:15.560 --> 00:03:19.280
 
De veiligheid daarvan is van groot belang.
 

	
 
00:03:19.280 --> 00:03:22.720
 
Daarom is
 
vrije en opensourcesoftware
 

	
 
00:03:22.720 --> 00:03:27.320
 
erg belangrijk: om te controleren
 
of die wel veilig is,
 

	
 
00:03:27.320 --> 00:03:33.520
 
en of er geen verbeterpunten
 
aangebracht kunnen worden.
 

	
 
00:03:33.520 --> 00:03:35.600
 
Om al deze redenen, mijnheer de rector,
 

	
 
00:03:35.600 --> 00:03:38.680
 
verzoeken wij u,
 
op voordracht van de Academische Raad,
 

	
 
00:03:38.680 --> 00:03:44.200
 
het eredoctoraat van de KU Leuven
 
te verlenen aan mevrouw Karen Sandler.
 

	
conservancy/supporters/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import Supporter
 

	
 

	
 
@admin.register(Supporter)
 
class SupporterAdmin(admin.ModelAdmin):
 
    list_display = ('display_name', 'display_until_date')
 

	
conservancy/worldmap/admin.py
Show inline comments
 
from django.contrib import admin
 

	
 
from .models import EarthLocation
 

	
 

	
 
@admin.register(EarthLocation)
 
class EarthLocationAdmin(admin.ModelAdmin):
 
    list_display = ("label", "html_map_link")
 

	
conservancy/worldmap/models.py
Show inline comments
 
from django.db import models
 

	
 

	
 
class EarthLocation(models.Model):
 
    """Represents latitude and longitude, with a label"""
 

	
 
    label = models.CharField(max_length=300, unique=True)
 
    latitude = models.DecimalField(max_digits=9, decimal_places=6)
 
    longitude = models.DecimalField(max_digits=9, decimal_places=6)
 

	
 
    date_created = models.DateTimeField(auto_now_add=True)
 
    date_last_modified = models.DateTimeField(auto_now=True)
 

	
 
    class Meta:
 
        unique_together = (("latitude", "longitude"),)
 

	
 
    def __str__(self):
 
        return self.label
 

	
 
    def google_maps_link(self):
 
        return ("http://maps.google.com/maps?ll=%s,%s&z=15"
 
                % (self.latitude, self.longitude))
 

	
 
    default_map_link = google_maps_link
 

	
 
    def html_map_link(self): # for Admin, fixme: fix_ampersands
 
        return '<a href="%s">map link</a>' % self.default_map_link()
 
    html_map_link.allow_tags = True
 

	
0 comments (0 inline, 0 general)