Intro to EDSL

This notebook provides example code for base components of EDSL, an open-source library for simulating surveys, experiments and other research with AI agents and large language models. Details on the code below are provided in accompanying slides: How to use EDSL.

Technical setup

Before running the code below, please ensure that you have installed the EDSL library and either activated remote inference from your Coop account or stored API keys for the language models that you want to use with EDSL.

Documentation

Please also see our documentation page for tips, tutorials and more demo notebooks on using EDSL.

Simple example

We start by selecting a question type and constructing a question in the relevant template:

[1]:
from edsl import QuestionMultipleChoice

q = QuestionMultipleChoice(
    question_name = "marvel_movies",
    question_text = "Do you enjoy Marvel movies?",
    question_options = ["Yes", "No", "I do not know"]
)

We administer a question by calling the run() method. This generates a dataset of Results including the model’s response to the question:

[2]:
results = q.run()

results.select("marvel_movies")
Remote Job Log (2024-12-14 08:37:16)
Remote inference activated. Sending job to server...
Your survey is running at the Expected Parrot server...
Job sent to server. (Job uuid=d321721d-4e3a-42af-9bc2-9f492e5dcaaa).
Job status: queued - last update: 2024-12-14 08:37:03 AM
Job status: running - last update: 2024-12-14 08:37:06 AM
Job status: running - last update: 2024-12-14 08:37:09 AM
Job status: running - last update: 2024-12-14 08:37:12 AM
[2]:
answer.marvel_movies
I do not know

Designing AI agents

We can create personas for agents to answer the question:

[3]:
from edsl import AgentList, Agent

personas = ["comic book collector", "movie critic"]

a = AgentList(
    Agent(traits = {"persona": p}) for p in personas
)

Selecting language models

We can select language models to generate the responses (in the example above we did not specify a model, so GPT 4 preview was used by default):

[4]:
from edsl import ModelList, Model

models = ["gpt-4o", "claude-3-5-sonnet-20240620"]

m = ModelList(
    Model(m) for m in ["gpt-4o", "claude-3-5-sonnet-20240620"]
)

Generating results

We add agents and models to a question when running it:

[5]:
results = q.by(a).by(m).run()

results.select("model", "persona", "marvel_movies")
Remote Job Log (2024-12-14 08:39:59)
Remote inference activated. Sending job to server...
Your survey is running at the Expected Parrot server...
Job sent to server. (Job uuid=96b8fad4-e884-4370-8cf5-3ddc5ffa5f37).
Job status: queued - last update: 2024-12-14 08:39:43 AM
Job status: running - last update: 2024-12-14 08:39:46 AM
Job status: running - last update: 2024-12-14 08:39:50 AM
Job status: running - last update: 2024-12-14 08:39:53 AM
Job status: running - last update: 2024-12-14 08:39:56 AM
[5]:
model.model agent.persona answer.marvel_movies
gpt-4o comic book collectorYes
claude-3-5-sonnet-20240620comic book collectorYes
gpt-4o movie critic Yes
claude-3-5-sonnet-20240620movie critic Yes

Parameterizing questions

We can use Scenario objects to add data or content to questions:

[6]:
q1 = QuestionMultipleChoice(
    question_name = "politically_motivated",
    question_text = """
    Read the following movie review and determine whether it is politically motivated.
    Movie: {{ title }}
    Review: {{ review }}
    """,
    question_options = ["Yes", "No", "I do not know"]
)

EDSL comes with methods for generating scenarios from many data sources, including PDFs, CSVs, docs, images, tables, lists, dicts:

[7]:
from edsl import Scenario

example_review = {
    "year": 2014,
    "title": "Captain America: The Winter Soldier",
    "review": """
    Part superhero flick, part 70s political thriller.
    It's a bold mix that pays off, delivering a scathing
    critique of surveillance states wrapped in spandex
    and shield-throwing action.
    """
}

s = Scenario.from_dict(example_review)
[8]:
results = q1.by(s).by(a).by(m).run()

(
    results.filter("persona == 'movie critic'")
    .sort_by("model")
    .select("model", "year", "title", "politically_motivated")
)
Remote Job Log (2024-12-14 08:42:05)
Remote inference activated. Sending job to server...
Your survey is running at the Expected Parrot server...
Job sent to server. (Job uuid=8b1fcef8-684c-4696-a533-d2b7811fb281).
Job status: queued - last update: 2024-12-14 08:41:45 AM
Job status: queued - last update: 2024-12-14 08:41:49 AM
Job status: running - last update: 2024-12-14 08:41:52 AM
Job status: running - last update: 2024-12-14 08:41:55 AM
Job status: running - last update: 2024-12-14 08:41:58 AM
Job status: running - last update: 2024-12-14 08:42:01 AM
[8]:
model.model scenario.yearscenario.title answer.politically_motivated
claude-3-5-sonnet-20240620 2014Captain America: The Winter SoldierNo
gpt-4o 2014Captain America: The Winter SoldierYes

Comments

Questions automatically include a “comment” field. This can be useful for understanding the context of a response, or debugging a non-response.

[9]:
(
    results.filter("persona == 'movie critic'")
    .sort_by("model")
    .select("model", "politically_motivated", "politically_motivated_comment")
)
[9]:
model.model answer.politically_motivated comment.politically_motivated_comment
claude-3-5-sonnet-20240620No While the review mentions political themes, it doesn't appear to be politically motivated itself. It's a straightforward assessment of the film's genre blend and thematic content without pushing any particular political agenda.
gpt-4o Yes The review explicitly mentions a "scathing critique of surveillance states," indicating a political perspective on the film's themes.

Combining questions in a survey

We can combine questions in a ``Survey` <https://docs.expectedparrot.com/en/latest/surveys.html>`__ to administer them together. Here we create some variations on the above question to compare responses:

[10]:
from edsl import QuestionYesNo

q2 = QuestionYesNo(
    question_name = "yn",
    question_text = """
    Read the following movie review and determine whether it is politically motivated.
    Movie: {{ title }}
    Review: {{ review }}
    """
)
[11]:
from edsl import QuestionLinearScale

q3 = QuestionLinearScale(
    question_name = "ls",
    question_text = """
    Read the following movie review and indicate whether it is politically motivated.
    Movie: {{ title }}
    Review: {{ review }}
    """,
    question_options = [0,1,2,3,4,5],
    option_labels = {0:"Not at all", 5:"Very much"}
)
[12]:
from edsl import QuestionList

q4 = QuestionList(
    question_name = "favorites",
    question_text = "List your favorite Marvel movies.",
    max_list_items = 3
)

Survey rules & logic

We can add skip/stop and other rules, and “memory” of other questions in a survey:

[13]:
from edsl import Survey

survey = Survey(questions = [q2, q3, q4])

survey = survey.add_stop_rule(q3, "ls < 3")
[14]:
results = survey.by(s).by(a).by(m).run()
Remote Job Log (2024-12-14 08:46:18)
Remote inference activated. Sending job to server...
Your survey is running at the Expected Parrot server...
Job sent to server. (Job uuid=b239f5bb-27dc-4834-9741-babfc0b5f8c9).
Job status: queued - last update: 2024-12-14 08:45:59 AM
Job status: running - last update: 2024-12-14 08:46:02 AM
Job status: running - last update: 2024-12-14 08:46:05 AM
Job status: running - last update: 2024-12-14 08:46:09 AM
Job status: running - last update: 2024-12-14 08:46:12 AM
Job status: running - last update: 2024-12-14 08:46:15 AM
[15]:
(
    results.filter("persona == 'comic book collector'")
    .select("model", "persona", "yn", "ls", "favorites")
    .print(pretty_labels = {
        "answer.yn": "Yes/No version",
        "answer.ls": "Linear scale version",
        "answer.favorites": "Favorites"
    })
)
[15]:
model.model agent.persona Yes/No version Linear scale versionFavorites
gpt-4o comic book collectorYes 3['Guardians of the Galaxy', 'Spider-Man: Into the Spider-Verse', 'Avengers: Endgame']
claude-3-5-sonnet-20240620comic book collectorNo 2

Working with results as datasets

EDSL provides built-in methods for analyzing results, e.g., as SQL tables, dataframes:

[16]:
results.sql("select model, persona, yn, ls, favorites from self")
[16]:
model persona yn lsfavorites
gpt-4o comic book collectorYes 3['Guardians of the Galaxy', 'Spider-Man: Into the Spider-Verse', 'Avengers: Endgame']
claude-3-5-sonnet-20240620comic book collectorNo 2
gpt-4o movie critic Yes 3['Avengers: Endgame', 'Black Panther', 'Guardians of the Galaxy']
claude-3-5-sonnet-20240620movie critic No 0
[17]:
results.to_pandas()
[17]:
answer.yn answer.ls answer.favorites scenario.year scenario.title scenario.review agent.agent_instruction agent.agent_name agent.persona model.frequency_penalty ... question_options.ls_question_options question_type.favorites_question_type question_type.yn_question_type question_type.ls_question_type comment.yn_comment comment.ls_comment comment.favorites_comment generated_tokens.ls_generated_tokens generated_tokens.yn_generated_tokens generated_tokens.favorites_generated_tokens
0 Yes 3 ['Guardians of the Galaxy', 'Spider-Man: Into ... 2014 Captain America: The Winter Soldier \n Part superhero flick, part 70s political... You are answering questions as if you were a h... Agent_9 comic book collector 0 ... [0, 1, 2, 3, 4, 5] list yes_no linear_scale While the review highlights the film's action ... The review suggests that the movie delivers a ... These movies capture the essence of what makes... 3 \nThe review suggests that the movie delive... Yes\n\nWhile the review highlights the film's ... ["Guardians of the Galaxy", "Spider-Man: Into ...
1 No 2 NaN 2014 Captain America: The Winter Soldier \n Part superhero flick, part 70s political... You are answering questions as if you were a h... Agent_10 comic book collector 0 ... [0, 1, 2, 3, 4, 5] list yes_no linear_scale Comment: As a comic book collector, I don't se... Task was cancelled. Task was cancelled. NaN No\n\nComment: As a comic book collector, I do... NaN
2 Yes 3 ['Avengers: Endgame', 'Black Panther', 'Guardi... 2014 Captain America: The Winter Soldier \n Part superhero flick, part 70s political... You are answering questions as if you were a h... Agent_11 movie critic 0 ... [0, 1, 2, 3, 4, 5] list yes_no linear_scale The review mentions a "scathing critique of su... The review acknowledges the film's critique of... These films stand out due to their compelling ... 3 \nThe review acknowledges the film's critiq... Yes\n\nThe review mentions a "scathing critiqu... ["Avengers: Endgame", "Black Panther", "Guardi...
3 No 0 NaN 2014 Captain America: The Winter Soldier \n Part superhero flick, part 70s political... You are answering questions as if you were a h... Agent_12 movie critic 0 ... [0, 1, 2, 3, 4, 5] list yes_no linear_scale Comment: This review does not appear to be pol... Task was cancelled. Task was cancelled. NaN No\n\nComment: This review does not appear to ... NaN

4 rows × 48 columns

[18]:
results.to_csv("marvel_movies_survey.csv")
[18]:

FileStore

key value
path marvel_movies_survey.csv
base64_stringYW5zd2VyLnluLGFuc3dlci5scyxhbnN3ZXIuZmF2b3JpdGVzLHNjZW5hcmlvLnllYXIsc2NlbmFyaW8udGl0bGUsc2NlbmFyaW8ucmV2aWV3LGFnZW50LmFnZW50X2luc3RydWN0aW9uLGFnZW50LmFnZW50X25hbWUsYWdlbnQucGVyc29uYSxtb2RlbC5mcmVxdWVuY3lfcGVuYWx0eSxtb2RlbC5sb2dwcm9icyxtb2RlbC5tYXhfdG9rZW5zLG1vZGVsLm1vZGVsLG1vZGVsLnRlbXBlcmF0dXJlLG1vZGVsLnRvcF9wLG1vZGVsLnByZXNlbmNlX3BlbmFsdHksbW9kZWwudG9wX2xvZ3Byb2JzLHByb21wdC55bl91c2VyX3Byb21wdCxwcm9tcHQubHNfdXNlcl9wcm9tcHQscHJvbXB0LmZhdm9yaXRlc19zeXN0ZW1fcHJvbXB0LHByb21wdC5mYXZvcml0ZXNfdXNlcl9wcm9tcHQscHJvbXB0LmxzX3N5c3RlbV9wcm9tcHQscHJvbXB0LnluX3N5c3RlbV9wcm9tcHQscmF3X21vZGVsX3Jlc3BvbnNlLmxzX3Jhd19tb2RlbF9yZXNwb25zZSxyYXdfbW9kZWxfcmVzcG9uc2UubHNfb25lX3VzZF9idXlzLHJhd19tb2RlbF9yZXNwb25zZS5mYXZvcml0ZXNfY29zdCxyYXdfbW9kZWxfcmVzcG9uc2UueW5fb25lX3VzZF9idXlzLHJhd19tb2RlbF9yZXNwb25zZS5sc19jb3N0LHJhd19tb2RlbF9yZXNwb25zZS5mYXZvcml0ZXNfb25lX3VzZF9idXlzLHJhd19tb2RlbF9yZXNwb25zZS5mYXZvcml0ZXNfcmF3X21vZGVsX3Jlc3BvbnNlLHJhd19tb2RlbF9yZXNwb25zZS55bl9yYXdfbW9kZWxfcmVzcG9uc2UscmF3X21vZGVsX3Jlc3BvbnNlLnluX2Nvc3QsaXRlcmF0aW9uLml0ZXJhdGlvbixxdWVzdGlvbl90ZXh0LnluX3F1ZXN0aW9uX3RleHQscXVlc3Rpb25fdGV4dC5sc19xdWVzdGlvbl90ZXh0LHF1ZXN0aW9uX3RleHQuZmF2b3JpdGVzX3F1ZXN0aW9uX3RleHQscXVlc3Rpb25fb3B0aW9ucy55bl9xdWVzdGlvbl9vcHRpb25zLHF1ZXN0aW9uX29wdGlvbnMuZmF2b3JpdGVzX3F1ZXN0aW9uX29wdGlvbnMscXVlc3Rpb25fb3B0aW9ucy5sc19xdWVzdGlvbl9vcHRpb25zLHF1ZXN0aW9uX3R5cGUuZmF2b3JpdGVzX3F1ZXN0aW9uX3R5cGUscXVlc3Rpb25fdHlwZS55bl9xdWVzdGlvbl90eXBlLHF1ZXN0aW9uX3R5cGUubHNfcXVlc3Rpb25fdHlwZSxjb21tZW50LnluX2NvbW1lbnQsY29tbWVudC5sc19jb21tZW50LGNvbW1lbnQuZmF2b3JpdGVzX2NvbW1lbnQsZ2VuZXJhdGVkX3Rva2Vucy5sc19nZW5lcmF0ZWRfdG9rZW5zLGdlbmVyYXRlZF90b2tlbnMueW5fZ2VuZXJhdGVkX3Rva2VucyxnZW5lcmF0ZWRfdG9rZW5zLmZhdm9yaXRlc19nZW5lcmF0ZWRfdG9rZW5zDQpZZXMsMywiWydHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eScsICdTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UnLCAnQXZlbmdlcnM6IEVuZGdhbWUnXSIsMjAxNCxDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllciwiCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgICIsWW91IGFyZSBhbnN3ZXJpbmcgcXVlc3Rpb25zIGFzIGlmIHlvdSB3ZXJlIGEgaHVtYW4uIERvIG5vdCBicmVhayBjaGFyYWN0ZXIuLEFnZW50XzksY29taWMgYm9vayBjb2xsZWN0b3IsMCxGYWxzZSwxMDAwLGdwdC00bywwLjUsMSwwLDMsIgoKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiBDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllcgogICAgUmV2aWV3OiAKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgCiAgICAKCiAgICAKTm8KICAgIApZZXMKICAgIAoKT25seSAxIG9wdGlvbiBtYXkgYmUgc2VsZWN0ZWQuClBsZWFzZSByZXNwb25kIHdpdGgganVzdCB5b3VyIGFuc3dlci4gCgoKQWZ0ZXIgdGhlIGFuc3dlciwgeW91IGNhbiBwdXQgYSBjb21tZW50IGV4cGxhaW5pbmcgeW91ciByZXNwb25zZS4iLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IENhcHRhaW4gQW1lcmljYTogVGhlIFdpbnRlciBTb2xkaWVyCiAgICBSZXZpZXc6IAogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAKICAgIAoKMCA6IE5vdCBhdCBhbGwKCjEgOiAKCjIgOiAKCjMgOiAKCjQgOiAKCjUgOiBWZXJ5IG11Y2gKCk9ubHkgMSBvcHRpb24gbWF5IGJlIHNlbGVjdGVkLgoKUmVzcG9uZCBvbmx5IHdpdGggdGhlIGNvZGUgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlIG9wdGlvbnMuIEUuZy4sICIiMSIiIG9yICIiNSIiIGJ5IGl0c2VsZi4KCkFmdGVyIHRoZSBhbnN3ZXIsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHdoeSB5b3UgY2hvc2UgdGhhdCBvcHRpb24gb24gdGhlIG5leHQgbGluZS4iLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ2NvbWljIGJvb2sgY29sbGVjdG9yJ30sIkxpc3QgeW91ciBmYXZvcml0ZSBNYXJ2ZWwgbW92aWVzLgoKClRoZSBsaXN0IG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIDMgaXRlbXMuCgpSZXR1cm4geW91ciBhbnN3ZXJzIG9uIG9uZSBsaW5lLCBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHlvdXIgcmVzcG9uc2VzLCB3aXRoIHNxdWFyZSBicmFja2V0cyBhbmQgZWFjaCBhbnN3ZXIgaW4gcXVvdGVzIEUuZy4sIFsiIkEiIiwgIiJCIiIsICIiQyIiXQoKQWZ0ZXIgdGhlIGFuc3dlcnMsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgY2hvaWNlIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdjb21pYyBib29rIGNvbGxlY3Rvcid9LFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ2NvbWljIGJvb2sgY29sbGVjdG9yJ30sInsnaWQnOiAnY2hhdGNtcGwtQWVNbDhNNGpQRFBVMjlYWVlZRmR3N3RmdWpIQjAnLCAnY2hvaWNlcyc6IFt7J2ZpbmlzaF9yZWFzb24nOiAnc3RvcCcsICdpbmRleCc6IDAsICdsb2dwcm9icyc6IE5vbmUsICdtZXNzYWdlJzogeydjb250ZW50JzogIiIzICBcblRoZSByZXZpZXcgc3VnZ2VzdHMgdGhhdCB0aGUgbW92aWUgZGVsaXZlcnMgYSBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzLCBpbmRpY2F0aW5nIGEgcG9saXRpY2FsIGFuZ2xlLCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGJlIG92ZXJ3aGVsbWluZ2x5IGZvY3VzZWQgb24gcG9saXRpY3MgYWxvbmUuIiIsICdyZWZ1c2FsJzogTm9uZSwgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ2F1ZGlvJzogTm9uZSwgJ2Z1bmN0aW9uX2NhbGwnOiBOb25lLCAndG9vbF9jYWxscyc6IE5vbmV9fV0sICdjcmVhdGVkJzogMTczNDE4Mzk3MCwgJ21vZGVsJzogJ2dwdC00by0yMDI0LTA4LTA2JywgJ29iamVjdCc6ICdjaGF0LmNvbXBsZXRpb24nLCAnc2VydmljZV90aWVyJzogTm9uZSwgJ3N5c3RlbV9maW5nZXJwcmludCc6ICdmcF9mNzg1ZWI1ZjQ3JywgJ3VzYWdlJzogeydjb21wbGV0aW9uX3Rva2Vucyc6IDMyLCAncHJvbXB0X3Rva2Vucyc6IDE5MCwgJ3RvdGFsX3Rva2Vucyc6IDIyMiwgJ2NvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMnOiB7J2FjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMCwgJ2F1ZGlvX3Rva2Vucyc6IDAsICdyZWFzb25pbmdfdG9rZW5zJzogMCwgJ3JlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMH0sICdwcm9tcHRfdG9rZW5zX2RldGFpbHMnOiB7J2F1ZGlvX3Rva2Vucyc6IDAsICdjYWNoZWRfdG9rZW5zJzogMH19fSIsMTI1Ny44NjE2MzUyMjAxMjU3LDAuMDAxMDcsMTM1MS4zNTEzNTEzNTEzNTE1LDAuMDAwNzk1LDkzNC41Nzk0MzkyNTIzMzY0LCJ7J2lkJzogJ2NoYXRjbXBsLUFlTWw5aGhtVGdvWXo3Rk90UklLYVZMbU5tYlUzJywgJ2Nob2ljZXMnOiBbeydmaW5pc2hfcmVhc29uJzogJ3N0b3AnLCAnaW5kZXgnOiAwLCAnbG9ncHJvYnMnOiBOb25lLCAnbWVzc2FnZSc6IHsnY29udGVudCc6ICdbIiJHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eSIiLCAiIlNwaWRlci1NYW46IEludG8gdGhlIFNwaWRlci1WZXJzZSIiLCAiIkF2ZW5nZXJzOiBFbmRnYW1lIiJdXG5cblRoZXNlIG1vdmllcyBjYXB0dXJlIHRoZSBlc3NlbmNlIG9mIHdoYXQgbWFrZXMgTWFydmVsIHNvIGNhcHRpdmF0aW5nOiBhIGJsZW5kIG9mIGh1bW9yLCBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgYW5kIGVwaWMgYmF0dGxlcy4gUGx1cywgIiJTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UiIiBpcyBhIHZpc3VhbCBtYXN0ZXJwaWVjZSB0aGF0IGJyaW5ncyBjb21pYyBib29rIGFydCB0byBsaWZlIGluIGEgd2F5IHRoYXRcJ3MgbmV2ZXIgYmVlbiBkb25lIGJlZm9yZS4nLCAncmVmdXNhbCc6IE5vbmUsICdyb2xlJzogJ2Fzc2lzdGFudCcsICdhdWRpbyc6IE5vbmUsICdmdW5jdGlvbl9jYWxsJzogTm9uZSwgJ3Rvb2xfY2FsbHMnOiBOb25lfX1dLCAnY3JlYXRlZCc6IDE3MzQxODM5NzEsICdtb2RlbCc6ICdncHQtNG8tMjAyNC0wOC0wNicsICdvYmplY3QnOiAnY2hhdC5jb21wbGV0aW9uJywgJ3NlcnZpY2VfdGllcic6IE5vbmUsICdzeXN0ZW1fZmluZ2VycHJpbnQnOiAnZnBfYTc5ZDhkYWMxZicsICd1c2FnZSc6IHsnY29tcGxldGlvbl90b2tlbnMnOiA4MCwgJ3Byb21wdF90b2tlbnMnOiAxMDgsICd0b3RhbF90b2tlbnMnOiAxODgsICdjb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzJzogeydhY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDAsICdhdWRpb190b2tlbnMnOiAwLCAncmVhc29uaW5nX3Rva2Vucyc6IDAsICdyZWplY3RlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDB9LCAncHJvbXB0X3Rva2Vuc19kZXRhaWxzJzogeydhdWRpb190b2tlbnMnOiAwLCAnY2FjaGVkX3Rva2Vucyc6IDB9fX0iLCJ7J2lkJzogJ2NoYXRjbXBsLUFlTWw4RlpYRmV2SEZlajZ5TXJNOE1FbGdlblBjJywgJ2Nob2ljZXMnOiBbeydmaW5pc2hfcmVhc29uJzogJ3N0b3AnLCAnaW5kZXgnOiAwLCAnbG9ncHJvYnMnOiBOb25lLCAnbWVzc2FnZSc6IHsnY29udGVudCc6ICdZZXNcblxuV2hpbGUgdGhlIHJldmlldyBoaWdobGlnaHRzIHRoZSBmaWxtXCdzIGFjdGlvbiBhbmQgc3VwZXJoZXJvIGVsZW1lbnRzLCBpdCBhbHNvIG1lbnRpb25zIGEgIiJzY2F0aGluZyBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzLCIiIHdoaWNoIHN1Z2dlc3RzIGEgcG9saXRpY2FsIHRoZW1lIG9yIG1lc3NhZ2Ugd2l0aGluIHRoZSBtb3ZpZS4nLCAncmVmdXNhbCc6IE5vbmUsICdyb2xlJzogJ2Fzc2lzdGFudCcsICdhdWRpbyc6IE5vbmUsICdmdW5jdGlvbl9jYWxsJzogTm9uZSwgJ3Rvb2xfY2FsbHMnOiBOb25lfX1dLCAnY3JlYXRlZCc6IDE3MzQxODM5NzAsICdtb2RlbCc6ICdncHQtNG8tMjAyNC0wOC0wNicsICdvYmplY3QnOiAnY2hhdC5jb21wbGV0aW9uJywgJ3NlcnZpY2VfdGllcic6IE5vbmUsICdzeXN0ZW1fZmluZ2VycHJpbnQnOiAnZnBfYTc5ZDhkYWMxZicsICd1c2FnZSc6IHsnY29tcGxldGlvbl90b2tlbnMnOiAzNywgJ3Byb21wdF90b2tlbnMnOiAxNDgsICd0b3RhbF90b2tlbnMnOiAxODUsICdjb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzJzogeydhY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDAsICdhdWRpb190b2tlbnMnOiAwLCAncmVhc29uaW5nX3Rva2Vucyc6IDAsICdyZWplY3RlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDB9LCAncHJvbXB0X3Rva2Vuc19kZXRhaWxzJzogeydhdWRpb190b2tlbnMnOiAwLCAnY2FjaGVkX3Rva2Vucyc6IDB9fX0iLDAuMDAwNzQsMCwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZToge3sgdGl0bGUgfX0KICAgIFJldmlldzoge3sgcmV2aWV3IH19CiAgICAiLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIixMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4sIlsnTm8nLCAnWWVzJ10iLCwiWzAsIDEsIDIsIDMsIDQsIDVdIixsaXN0LHllc19ubyxsaW5lYXJfc2NhbGUsIldoaWxlIHRoZSByZXZpZXcgaGlnaGxpZ2h0cyB0aGUgZmlsbSdzIGFjdGlvbiBhbmQgc3VwZXJoZXJvIGVsZW1lbnRzLCBpdCBhbHNvIG1lbnRpb25zIGEgIiJzY2F0aGluZyBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzLCIiIHdoaWNoIHN1Z2dlc3RzIGEgcG9saXRpY2FsIHRoZW1lIG9yIG1lc3NhZ2Ugd2l0aGluIHRoZSBtb3ZpZS4iLCJUaGUgcmV2aWV3IHN1Z2dlc3RzIHRoYXQgdGhlIG1vdmllIGRlbGl2ZXJzIGEgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcywgaW5kaWNhdGluZyBhIHBvbGl0aWNhbCBhbmdsZSwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBvdmVyd2hlbG1pbmdseSBmb2N1c2VkIG9uIHBvbGl0aWNzIGFsb25lLiIsIlRoZXNlIG1vdmllcyBjYXB0dXJlIHRoZSBlc3NlbmNlIG9mIHdoYXQgbWFrZXMgTWFydmVsIHNvIGNhcHRpdmF0aW5nOiBhIGJsZW5kIG9mIGh1bW9yLCBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgYW5kIGVwaWMgYmF0dGxlcy4gUGx1cywgIiJTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UiIiBpcyBhIHZpc3VhbCBtYXN0ZXJwaWVjZSB0aGF0IGJyaW5ncyBjb21pYyBib29rIGFydCB0byBsaWZlIGluIGEgd2F5IHRoYXQncyBuZXZlciBiZWVuIGRvbmUgYmVmb3JlLiIsIjMgIApUaGUgcmV2aWV3IHN1Z2dlc3RzIHRoYXQgdGhlIG1vdmllIGRlbGl2ZXJzIGEgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcywgaW5kaWNhdGluZyBhIHBvbGl0aWNhbCBhbmdsZSwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBvdmVyd2hlbG1pbmdseSBmb2N1c2VkIG9uIHBvbGl0aWNzIGFsb25lLiIsIlllcwoKV2hpbGUgdGhlIHJldmlldyBoaWdobGlnaHRzIHRoZSBmaWxtJ3MgYWN0aW9uIGFuZCBzdXBlcmhlcm8gZWxlbWVudHMsIGl0IGFsc28gbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggc3VnZ2VzdHMgYSBwb2xpdGljYWwgdGhlbWUgb3IgbWVzc2FnZSB3aXRoaW4gdGhlIG1vdmllLiIsIlsiIkd1YXJkaWFucyBvZiB0aGUgR2FsYXh5IiIsICIiU3BpZGVyLU1hbjogSW50byB0aGUgU3BpZGVyLVZlcnNlIiIsICIiQXZlbmdlcnM6IEVuZGdhbWUiIl0KClRoZXNlIG1vdmllcyBjYXB0dXJlIHRoZSBlc3NlbmNlIG9mIHdoYXQgbWFrZXMgTWFydmVsIHNvIGNhcHRpdmF0aW5nOiBhIGJsZW5kIG9mIGh1bW9yLCBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgYW5kIGVwaWMgYmF0dGxlcy4gUGx1cywgIiJTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UiIiBpcyBhIHZpc3VhbCBtYXN0ZXJwaWVjZSB0aGF0IGJyaW5ncyBjb21pYyBib29rIGFydCB0byBsaWZlIGluIGEgd2F5IHRoYXQncyBuZXZlciBiZWVuIGRvbmUgYmVmb3JlLiINCk5vLDIsLDIwMTQsQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIsIgogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAiLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLixBZ2VudF8xMCxjb21pYyBib29rIGNvbGxlY3RvciwwLEZhbHNlLDEwMDAsY2xhdWRlLTMtNS1zb25uZXQtMjAyNDA2MjAsMC41LDEsMCwzLCIKCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZTogQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIKICAgIFJldmlldzogCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgIAogICAgCgogICAgCk5vCiAgICAKWWVzCiAgICAKCk9ubHkgMSBvcHRpb24gbWF5IGJlIHNlbGVjdGVkLgpQbGVhc2UgcmVzcG9uZCB3aXRoIGp1c3QgeW91ciBhbnN3ZXIuIAoKCkFmdGVyIHRoZSBhbnN3ZXIsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgcmVzcG9uc2UuIiwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBpbmRpY2F0ZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiBDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllcgogICAgUmV2aWV3OiAKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgCiAgICAKCjAgOiBOb3QgYXQgYWxsCgoxIDogCgoyIDogCgozIDogCgo0IDogCgo1IDogVmVyeSBtdWNoCgpPbmx5IDEgb3B0aW9uIG1heSBiZSBzZWxlY3RlZC4KClJlc3BvbmQgb25seSB3aXRoIHRoZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBvcHRpb25zLiBFLmcuLCAiIjEiIiBvciAiIjUiIiBieSBpdHNlbGYuCgpBZnRlciB0aGUgYW5zd2VyLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgeW91IGNob3NlIHRoYXQgb3B0aW9uIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdjb21pYyBib29rIGNvbGxlY3Rvcid9LCJMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4KCgpUaGUgbGlzdCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiAzIGl0ZW1zLgoKUmV0dXJuIHlvdXIgYW5zd2VycyBvbiBvbmUgbGluZSwgaW4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB5b3VyIHJlc3BvbnNlcywgd2l0aCBzcXVhcmUgYnJhY2tldHMgYW5kIGVhY2ggYW5zd2VyIGluIHF1b3RlcyBFLmcuLCBbIiJBIiIsICIiQiIiLCAiIkMiIl0KCkFmdGVyIHRoZSBhbnN3ZXJzLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB5b3VyIGNob2ljZSBvbiB0aGUgbmV4dCBsaW5lLiIsWW91IGFyZSBhbnN3ZXJpbmcgcXVlc3Rpb25zIGFzIGlmIHlvdSB3ZXJlIGEgaHVtYW4uIERvIG5vdCBicmVhayBjaGFyYWN0ZXIuIFlvdXIgdHJhaXRzOiB7J3BlcnNvbmEnOiAnY29taWMgYm9vayBjb2xsZWN0b3InfSxZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdjb21pYyBib29rIGNvbGxlY3Rvcid9LCxOQSwsNjAxLjY4NzE3NDk5MTM1ODEsLE5BLCwieydpZCc6ICdtc2dfMDFYRktSWHBTZ3Q1Y21XblZ2eW1VM1FxJywgJ2NvbnRlbnQnOiBbeyd0ZXh0JzogIiJOb1xuXG5Db21tZW50OiBBcyBhIGNvbWljIGJvb2sgY29sbGVjdG9yLCBJIGRvbid0IHNlZSBhbnkgb3ZlcnQgcG9saXRpY2FsIG1vdGl2YXRpb24gaW4gdGhpcyByZXZpZXcuIEl0J3MgZGlzY3Vzc2luZyB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCB0aGVtZXMsIHdoaWNoIGFyZSBpbmhlcmVudCB0byB0aGUgbW92aWUgaXRzZWxmIHJhdGhlciB0aGFuIHB1c2hpbmcgYSBzcGVjaWZpYyBwb2xpdGljYWwgYWdlbmRhLiBUaGUgbWVudGlvbiBvZiBzdXJ2ZWlsbGFuY2UgY3JpdGlxdWUgaXMgcHJlc2VudGVkIGFzIHBhcnQgb2YgdGhlIGZpbG0ncyBwbG90LCBub3QgYXMgdGhlIHJldmlld2VyJ3MgcGVyc29uYWwgcG9saXRpY2FsIHN0YW5jZS4iIiwgJ3R5cGUnOiAndGV4dCd9XSwgJ21vZGVsJzogJ2NsYXVkZS0zLTUtc29ubmV0LTIwMjQwNjIwJywgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ3N0b3BfcmVhc29uJzogJ2VuZF90dXJuJywgJ3N0b3Bfc2VxdWVuY2UnOiBOb25lLCAndHlwZSc6ICdtZXNzYWdlJywgJ3VzYWdlJzogeydpbnB1dF90b2tlbnMnOiAxNjksICdvdXRwdXRfdG9rZW5zJzogNzd9fSIsMC4wMDE2NjE5OTMyMTEwMzA5MDI5LDAsIgogICAgUmVhZCB0aGUgZm9sbG93aW5nIG1vdmllIHJldmlldyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIiwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBpbmRpY2F0ZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiB7eyB0aXRsZSB9fQogICAgUmV2aWV3OiB7eyByZXZpZXcgfX0KICAgICIsTGlzdCB5b3VyIGZhdm9yaXRlIE1hcnZlbCBtb3ZpZXMuLCJbJ05vJywgJ1llcyddIiwsIlswLCAxLCAyLCAzLCA0LCA1XSIsbGlzdCx5ZXNfbm8sbGluZWFyX3NjYWxlLCJDb21tZW50OiBBcyBhIGNvbWljIGJvb2sgY29sbGVjdG9yLCBJIGRvbid0IHNlZSBhbnkgb3ZlcnQgcG9saXRpY2FsIG1vdGl2YXRpb24gaW4gdGhpcyByZXZpZXcuIEl0J3MgZGlzY3Vzc2luZyB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCB0aGVtZXMsIHdoaWNoIGFyZSBpbmhlcmVudCB0byB0aGUgbW92aWUgaXRzZWxmIHJhdGhlciB0aGFuIHB1c2hpbmcgYSBzcGVjaWZpYyBwb2xpdGljYWwgYWdlbmRhLiBUaGUgbWVudGlvbiBvZiBzdXJ2ZWlsbGFuY2UgY3JpdGlxdWUgaXMgcHJlc2VudGVkIGFzIHBhcnQgb2YgdGhlIGZpbG0ncyBwbG90LCBub3QgYXMgdGhlIHJldmlld2VyJ3MgcGVyc29uYWwgcG9saXRpY2FsIHN0YW5jZS4iLFRhc2sgd2FzIGNhbmNlbGxlZC4sVGFzayB3YXMgY2FuY2VsbGVkLiwsIk5vCgpDb21tZW50OiBBcyBhIGNvbWljIGJvb2sgY29sbGVjdG9yLCBJIGRvbid0IHNlZSBhbnkgb3ZlcnQgcG9saXRpY2FsIG1vdGl2YXRpb24gaW4gdGhpcyByZXZpZXcuIEl0J3MgZGlzY3Vzc2luZyB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCB0aGVtZXMsIHdoaWNoIGFyZSBpbmhlcmVudCB0byB0aGUgbW92aWUgaXRzZWxmIHJhdGhlciB0aGFuIHB1c2hpbmcgYSBzcGVjaWZpYyBwb2xpdGljYWwgYWdlbmRhLiBUaGUgbWVudGlvbiBvZiBzdXJ2ZWlsbGFuY2UgY3JpdGlxdWUgaXMgcHJlc2VudGVkIGFzIHBhcnQgb2YgdGhlIGZpbG0ncyBwbG90LCBub3QgYXMgdGhlIHJldmlld2VyJ3MgcGVyc29uYWwgcG9saXRpY2FsIHN0YW5jZS4iLA0KWWVzLDMsIlsnQXZlbmdlcnM6IEVuZGdhbWUnLCAnQmxhY2sgUGFudGhlcicsICdHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eSddIiwyMDE0LENhcHRhaW4gQW1lcmljYTogVGhlIFdpbnRlciBTb2xkaWVyLCIKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4sQWdlbnRfMTEsbW92aWUgY3JpdGljLDAsRmFsc2UsMTAwMCxncHQtNG8sMC41LDEsMCwzLCIKCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZTogQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIKICAgIFJldmlldzogCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgIAogICAgCgogICAgCk5vCiAgICAKWWVzCiAgICAKCk9ubHkgMSBvcHRpb24gbWF5IGJlIHNlbGVjdGVkLgpQbGVhc2UgcmVzcG9uZCB3aXRoIGp1c3QgeW91ciBhbnN3ZXIuIAoKCkFmdGVyIHRoZSBhbnN3ZXIsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgcmVzcG9uc2UuIiwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBpbmRpY2F0ZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiBDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllcgogICAgUmV2aWV3OiAKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgCiAgICAKCjAgOiBOb3QgYXQgYWxsCgoxIDogCgoyIDogCgozIDogCgo0IDogCgo1IDogVmVyeSBtdWNoCgpPbmx5IDEgb3B0aW9uIG1heSBiZSBzZWxlY3RlZC4KClJlc3BvbmQgb25seSB3aXRoIHRoZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBvcHRpb25zLiBFLmcuLCAiIjEiIiBvciAiIjUiIiBieSBpdHNlbGYuCgpBZnRlciB0aGUgYW5zd2VyLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgeW91IGNob3NlIHRoYXQgb3B0aW9uIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdtb3ZpZSBjcml0aWMnfSwiTGlzdCB5b3VyIGZhdm9yaXRlIE1hcnZlbCBtb3ZpZXMuCgoKVGhlIGxpc3QgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gMyBpdGVtcy4KClJldHVybiB5b3VyIGFuc3dlcnMgb24gb25lIGxpbmUsIGluIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgeW91ciByZXNwb25zZXMsIHdpdGggc3F1YXJlIGJyYWNrZXRzIGFuZCBlYWNoIGFuc3dlciBpbiBxdW90ZXMgRS5nLiwgWyIiQSIiLCAiIkIiIiwgIiJDIiJdCgpBZnRlciB0aGUgYW5zd2VycywgeW91IGNhbiBwdXQgYSBjb21tZW50IGV4cGxhaW5pbmcgeW91ciBjaG9pY2Ugb24gdGhlIG5leHQgbGluZS4iLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ21vdmllIGNyaXRpYyd9LFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ21vdmllIGNyaXRpYyd9LCJ7J2lkJzogJ2NoYXRjbXBsLUFlTWw4djBJTFV0R282M25VTUFIVk5Hd2luWW9WJywgJ2Nob2ljZXMnOiBbeydmaW5pc2hfcmVhc29uJzogJ3N0b3AnLCAnaW5kZXgnOiAwLCAnbG9ncHJvYnMnOiBOb25lLCAnbWVzc2FnZSc6IHsnY29udGVudCc6ICIiMyAgXG5UaGUgcmV2aWV3IGFja25vd2xlZGdlcyB0aGUgZmlsbSdzIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIHdoaWNoIGNhbiBiZSBzZWVuIGFzIGEgcG9saXRpY2FsbHkgbW90aXZhdGVkIHRoZW1lLCB0aG91Z2ggaXQncyBiYWxhbmNlZCB3aXRoIHRoZSBlbnRlcnRhaW5tZW50IGFzcGVjdHMgb2YgYSBzdXBlcmhlcm8gbW92aWUuIiIsICdyZWZ1c2FsJzogTm9uZSwgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ2F1ZGlvJzogTm9uZSwgJ2Z1bmN0aW9uX2NhbGwnOiBOb25lLCAndG9vbF9jYWxscyc6IE5vbmV9fV0sICdjcmVhdGVkJzogMTczNDE4Mzk3MCwgJ21vZGVsJzogJ2dwdC00by0yMDI0LTA4LTA2JywgJ29iamVjdCc6ICdjaGF0LmNvbXBsZXRpb24nLCAnc2VydmljZV90aWVyJzogTm9uZSwgJ3N5c3RlbV9maW5nZXJwcmludCc6ICdmcF9hNzlkOGRhYzFmJywgJ3VzYWdlJzogeydjb21wbGV0aW9uX3Rva2Vucyc6IDM1LCAncHJvbXB0X3Rva2Vucyc6IDE4OSwgJ3RvdGFsX3Rva2Vucyc6IDIyNCwgJ2NvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMnOiB7J2FjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMCwgJ2F1ZGlvX3Rva2Vucyc6IDAsICdyZWFzb25pbmdfdG9rZW5zJzogMCwgJ3JlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMH0sICdwcm9tcHRfdG9rZW5zX2RldGFpbHMnOiB7J2F1ZGlvX3Rva2Vucyc6IDAsICdjYWNoZWRfdG9rZW5zJzogMH19fSIsMTIxNS44MDU0NzExMjQ2MiwwLjAwMTE1NzUsMTM5My43MjgyMjI5OTY1MTU2LDAuMDAwODIyNSw4NjMuOTMwODg1NTI5MTU3OCwieydpZCc6ICdjaGF0Y21wbC1BZU1sOXZMdkpSMVVVVXVqSjdOUWNjcm02cW02dycsICdjaG9pY2VzJzogW3snZmluaXNoX3JlYXNvbic6ICdzdG9wJywgJ2luZGV4JzogMCwgJ2xvZ3Byb2JzJzogTm9uZSwgJ21lc3NhZ2UnOiB7J2NvbnRlbnQnOiAnWyIiQXZlbmdlcnM6IEVuZGdhbWUiIiwgIiJCbGFjayBQYW50aGVyIiIsICIiR3VhcmRpYW5zIG9mIHRoZSBHYWxheHkiIl0gIFxuVGhlc2UgZmlsbXMgc3RhbmQgb3V0IGR1ZSB0byB0aGVpciBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgc3Ryb25nIGNoYXJhY3RlciBkZXZlbG9wbWVudCwgYW5kIGN1bHR1cmFsIGltcGFjdC4gIiJBdmVuZ2VyczogRW5kZ2FtZSIiIG1hc3RlcmZ1bGx5IGNvbmNsdWRlcyBhIGRlY2FkZS1sb25nIHNhZ2EsICIiQmxhY2sgUGFudGhlciIiIGJyZWFrcyBncm91bmQgd2l0aCBpdHMgY3VsdHVyYWwgc2lnbmlmaWNhbmNlIGFuZCBkaXJlY3Rpb24sIHdoaWxlICIiR3VhcmRpYW5zIG9mIHRoZSBHYWxheHkiIiBicmluZ3MgYSBmcmVzaCwgZnVuLCBhbmQgaXJyZXZlcmVudCB0b25lIHRvIHRoZSBzdXBlcmhlcm8gZ2VucmUuJywgJ3JlZnVzYWwnOiBOb25lLCAncm9sZSc6ICdhc3Npc3RhbnQnLCAnYXVkaW8nOiBOb25lLCAnZnVuY3Rpb25fY2FsbCc6IE5vbmUsICd0b29sX2NhbGxzJzogTm9uZX19XSwgJ2NyZWF0ZWQnOiAxNzM0MTgzOTcxLCAnbW9kZWwnOiAnZ3B0LTRvLTIwMjQtMDgtMDYnLCAnb2JqZWN0JzogJ2NoYXQuY29tcGxldGlvbicsICdzZXJ2aWNlX3RpZXInOiBOb25lLCAnc3lzdGVtX2ZpbmdlcnByaW50JzogJ2ZwX2E3OWQ4ZGFjMWYnLCAndXNhZ2UnOiB7J2NvbXBsZXRpb25fdG9rZW5zJzogODksICdwcm9tcHRfdG9rZW5zJzogMTA3LCAndG90YWxfdG9rZW5zJzogMTk2LCAnY29tcGxldGlvbl90b2tlbnNfZGV0YWlscyc6IHsnYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwLCAnYXVkaW9fdG9rZW5zJzogMCwgJ3JlYXNvbmluZ190b2tlbnMnOiAwLCAncmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwfSwgJ3Byb21wdF90b2tlbnNfZGV0YWlscyc6IHsnYXVkaW9fdG9rZW5zJzogMCwgJ2NhY2hlZF90b2tlbnMnOiAwfX19IiwieydpZCc6ICdjaGF0Y21wbC1BZU1sODRwelZYTG9zS0RBWjNySnJNQUtyMkR1SScsICdjaG9pY2VzJzogW3snZmluaXNoX3JlYXNvbic6ICdzdG9wJywgJ2luZGV4JzogMCwgJ2xvZ3Byb2JzJzogTm9uZSwgJ21lc3NhZ2UnOiB7J2NvbnRlbnQnOiAnWWVzXG5cblRoZSByZXZpZXcgbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggaW5kaWNhdGVzIGEgcG9saXRpY2FsIGVsZW1lbnQgaW4gdGhlIGZpbG1cJ3MgdGhlbWVzIGFuZCBzdWdnZXN0cyB0aGF0IHRoZSByZXZpZXcgaXMgYWNrbm93bGVkZ2luZyB0aGlzIHBvbGl0aWNhbCBhc3BlY3QuJywgJ3JlZnVzYWwnOiBOb25lLCAncm9sZSc6ICdhc3Npc3RhbnQnLCAnYXVkaW8nOiBOb25lLCAnZnVuY3Rpb25fY2FsbCc6IE5vbmUsICd0b29sX2NhbGxzJzogTm9uZX19XSwgJ2NyZWF0ZWQnOiAxNzM0MTgzOTcwLCAnbW9kZWwnOiAnZ3B0LTRvLTIwMjQtMDgtMDYnLCAnb2JqZWN0JzogJ2NoYXQuY29tcGxldGlvbicsICdzZXJ2aWNlX3RpZXInOiBOb25lLCAnc3lzdGVtX2ZpbmdlcnByaW50JzogJ2ZwX2E3OWQ4ZGFjMWYnLCAndXNhZ2UnOiB7J2NvbXBsZXRpb25fdG9rZW5zJzogMzUsICdwcm9tcHRfdG9rZW5zJzogMTQ3LCAndG90YWxfdG9rZW5zJzogMTgyLCAnY29tcGxldGlvbl90b2tlbnNfZGV0YWlscyc6IHsnYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwLCAnYXVkaW9fdG9rZW5zJzogMCwgJ3JlYXNvbmluZ190b2tlbnMnOiAwLCAncmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwfSwgJ3Byb21wdF90b2tlbnNfZGV0YWlscyc6IHsnYXVkaW9fdG9rZW5zJzogMCwgJ2NhY2hlZF90b2tlbnMnOiAwfX19IiwwLjAwMDcxNzUsMCwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZToge3sgdGl0bGUgfX0KICAgIFJldmlldzoge3sgcmV2aWV3IH19CiAgICAiLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIixMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4sIlsnTm8nLCAnWWVzJ10iLCwiWzAsIDEsIDIsIDMsIDQsIDVdIixsaXN0LHllc19ubyxsaW5lYXJfc2NhbGUsIlRoZSByZXZpZXcgbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggaW5kaWNhdGVzIGEgcG9saXRpY2FsIGVsZW1lbnQgaW4gdGhlIGZpbG0ncyB0aGVtZXMgYW5kIHN1Z2dlc3RzIHRoYXQgdGhlIHJldmlldyBpcyBhY2tub3dsZWRnaW5nIHRoaXMgcG9saXRpY2FsIGFzcGVjdC4iLCJUaGUgcmV2aWV3IGFja25vd2xlZGdlcyB0aGUgZmlsbSdzIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIHdoaWNoIGNhbiBiZSBzZWVuIGFzIGEgcG9saXRpY2FsbHkgbW90aXZhdGVkIHRoZW1lLCB0aG91Z2ggaXQncyBiYWxhbmNlZCB3aXRoIHRoZSBlbnRlcnRhaW5tZW50IGFzcGVjdHMgb2YgYSBzdXBlcmhlcm8gbW92aWUuIiwiVGhlc2UgZmlsbXMgc3RhbmQgb3V0IGR1ZSB0byB0aGVpciBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgc3Ryb25nIGNoYXJhY3RlciBkZXZlbG9wbWVudCwgYW5kIGN1bHR1cmFsIGltcGFjdC4gIiJBdmVuZ2VyczogRW5kZ2FtZSIiIG1hc3RlcmZ1bGx5IGNvbmNsdWRlcyBhIGRlY2FkZS1sb25nIHNhZ2EsICIiQmxhY2sgUGFudGhlciIiIGJyZWFrcyBncm91bmQgd2l0aCBpdHMgY3VsdHVyYWwgc2lnbmlmaWNhbmNlIGFuZCBkaXJlY3Rpb24sIHdoaWxlICIiR3VhcmRpYW5zIG9mIHRoZSBHYWxheHkiIiBicmluZ3MgYSBmcmVzaCwgZnVuLCBhbmQgaXJyZXZlcmVudCB0b25lIHRvIHRoZSBzdXBlcmhlcm8gZ2VucmUuIiwiMyAgClRoZSByZXZpZXcgYWNrbm93bGVkZ2VzIHRoZSBmaWxtJ3MgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcywgd2hpY2ggY2FuIGJlIHNlZW4gYXMgYSBwb2xpdGljYWxseSBtb3RpdmF0ZWQgdGhlbWUsIHRob3VnaCBpdCdzIGJhbGFuY2VkIHdpdGggdGhlIGVudGVydGFpbm1lbnQgYXNwZWN0cyBvZiBhIHN1cGVyaGVybyBtb3ZpZS4iLCJZZXMKClRoZSByZXZpZXcgbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggaW5kaWNhdGVzIGEgcG9saXRpY2FsIGVsZW1lbnQgaW4gdGhlIGZpbG0ncyB0aGVtZXMgYW5kIHN1Z2dlc3RzIHRoYXQgdGhlIHJldmlldyBpcyBhY2tub3dsZWRnaW5nIHRoaXMgcG9saXRpY2FsIGFzcGVjdC4iLCJbIiJBdmVuZ2VyczogRW5kZ2FtZSIiLCAiIkJsYWNrIFBhbnRoZXIiIiwgIiJHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eSIiXSAgClRoZXNlIGZpbG1zIHN0YW5kIG91dCBkdWUgdG8gdGhlaXIgY29tcGVsbGluZyBzdG9yeXRlbGxpbmcsIHN0cm9uZyBjaGFyYWN0ZXIgZGV2ZWxvcG1lbnQsIGFuZCBjdWx0dXJhbCBpbXBhY3QuICIiQXZlbmdlcnM6IEVuZGdhbWUiIiBtYXN0ZXJmdWxseSBjb25jbHVkZXMgYSBkZWNhZGUtbG9uZyBzYWdhLCAiIkJsYWNrIFBhbnRoZXIiIiBicmVha3MgZ3JvdW5kIHdpdGggaXRzIGN1bHR1cmFsIHNpZ25pZmljYW5jZSBhbmQgZGlyZWN0aW9uLCB3aGlsZSAiIkd1YXJkaWFucyBvZiB0aGUgR2FsYXh5IiIgYnJpbmdzIGEgZnJlc2gsIGZ1biwgYW5kIGlycmV2ZXJlbnQgdG9uZSB0byB0aGUgc3VwZXJoZXJvIGdlbnJlLiINCk5vLDAsLDIwMTQsQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIsIgogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAiLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLixBZ2VudF8xMixtb3ZpZSBjcml0aWMsMCxGYWxzZSwxMDAwLGNsYXVkZS0zLTUtc29ubmV0LTIwMjQwNjIwLDAuNSwxLDAsMywiCgogICAgUmVhZCB0aGUgZm9sbG93aW5nIG1vdmllIHJldmlldyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IENhcHRhaW4gQW1lcmljYTogVGhlIFdpbnRlciBTb2xkaWVyCiAgICBSZXZpZXc6IAogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAKICAgIAoKICAgIApObwogICAgClllcwogICAgCgpPbmx5IDEgb3B0aW9uIG1heSBiZSBzZWxlY3RlZC4KUGxlYXNlIHJlc3BvbmQgd2l0aCBqdXN0IHlvdXIgYW5zd2VyLiAKCgpBZnRlciB0aGUgYW5zd2VyLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB5b3VyIHJlc3BvbnNlLiIsIgogICAgUmVhZCB0aGUgZm9sbG93aW5nIG1vdmllIHJldmlldyBhbmQgaW5kaWNhdGUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZTogQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIKICAgIFJldmlldzogCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgIAogICAgCgowIDogTm90IGF0IGFsbAoKMSA6IAoKMiA6IAoKMyA6IAoKNCA6IAoKNSA6IFZlcnkgbXVjaAoKT25seSAxIG9wdGlvbiBtYXkgYmUgc2VsZWN0ZWQuCgpSZXNwb25kIG9ubHkgd2l0aCB0aGUgY29kZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGUgb3B0aW9ucy4gRS5nLiwgIiIxIiIgb3IgIiI1IiIgYnkgaXRzZWxmLgoKQWZ0ZXIgdGhlIGFuc3dlciwgeW91IGNhbiBwdXQgYSBjb21tZW50IGV4cGxhaW5pbmcgd2h5IHlvdSBjaG9zZSB0aGF0IG9wdGlvbiBvbiB0aGUgbmV4dCBsaW5lLiIsWW91IGFyZSBhbnN3ZXJpbmcgcXVlc3Rpb25zIGFzIGlmIHlvdSB3ZXJlIGEgaHVtYW4uIERvIG5vdCBicmVhayBjaGFyYWN0ZXIuIFlvdXIgdHJhaXRzOiB7J3BlcnNvbmEnOiAnbW92aWUgY3JpdGljJ30sIkxpc3QgeW91ciBmYXZvcml0ZSBNYXJ2ZWwgbW92aWVzLgoKClRoZSBsaXN0IG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIDMgaXRlbXMuCgpSZXR1cm4geW91ciBhbnN3ZXJzIG9uIG9uZSBsaW5lLCBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHlvdXIgcmVzcG9uc2VzLCB3aXRoIHNxdWFyZSBicmFja2V0cyBhbmQgZWFjaCBhbnN3ZXIgaW4gcXVvdGVzIEUuZy4sIFsiIkEiIiwgIiJCIiIsICIiQyIiXQoKQWZ0ZXIgdGhlIGFuc3dlcnMsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgY2hvaWNlIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdtb3ZpZSBjcml0aWMnfSxZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdtb3ZpZSBjcml0aWMnfSwsTkEsLDYxMy44NzYwNDE2MzM2OTAyLCxOQSwsInsnaWQnOiAnbXNnXzAxUjl5RFljdHZNamRUc1haMlVZMWJNNycsICdjb250ZW50JzogW3sndGV4dCc6ICIiTm9cblxuQ29tbWVudDogVGhpcyByZXZpZXcgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4gV2hpbGUgaXQgbWVudGlvbnMgYSBwb2xpdGljYWwgdGhlbWUgKGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMpLCB0aGUgcmV2aWV3IGZvY3VzZXMgcHJpbWFyaWx5IG9uIHRoZSBmaWxtJ3MgZ2VucmUgYmxlbmQgYW5kIG92ZXJhbGwgZWZmZWN0aXZlbmVzcy4gSXQgcmVhZHMgYXMgYSBzdGFuZGFyZCBtb3ZpZSBjcml0aWMgYW5hbHlzaXMgcHJhaXNpbmcgdGhlIGZpbG0ncyBzdWNjZXNzZnVsIGNvbWJpbmF0aW9uIG9mIHN1cGVyaGVybyBlbGVtZW50cyB3aXRoIHBvbGl0aWNhbCB0aHJpbGxlciB0aGVtZXMsIHJhdGhlciB0aGFuIHB1c2hpbmcgYW55IHBhcnRpY3VsYXIgcG9saXRpY2FsIGFnZW5kYS4iIiwgJ3R5cGUnOiAndGV4dCd9XSwgJ21vZGVsJzogJ2NsYXVkZS0zLTUtc29ubmV0LTIwMjQwNjIwJywgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ3N0b3BfcmVhc29uJzogJ2VuZF90dXJuJywgJ3N0b3Bfc2VxdWVuY2UnOiBOb25lLCAndHlwZSc6ICdtZXNzYWdlJywgJ3VzYWdlJzogeydpbnB1dF90b2tlbnMnOiAxNjgsICdvdXRwdXRfdG9rZW5zJzogNzV9fSIsMC4wMDE2Mjg5OTMzNjcwMzAxNDEsMCwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZToge3sgdGl0bGUgfX0KICAgIFJldmlldzoge3sgcmV2aWV3IH19CiAgICAiLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIixMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4sIlsnTm8nLCAnWWVzJ10iLCwiWzAsIDEsIDIsIDMsIDQsIDVdIixsaXN0LHllc19ubyxsaW5lYXJfc2NhbGUsIkNvbW1lbnQ6IFRoaXMgcmV2aWV3IGRvZXMgbm90IGFwcGVhciB0byBiZSBwb2xpdGljYWxseSBtb3RpdmF0ZWQuIFdoaWxlIGl0IG1lbnRpb25zIGEgcG9saXRpY2FsIHRoZW1lIChjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzKSwgdGhlIHJldmlldyBmb2N1c2VzIHByaW1hcmlseSBvbiB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCBvdmVyYWxsIGVmZmVjdGl2ZW5lc3MuIEl0IHJlYWRzIGFzIGEgc3RhbmRhcmQgbW92aWUgY3JpdGljIGFuYWx5c2lzIHByYWlzaW5nIHRoZSBmaWxtJ3Mgc3VjY2Vzc2Z1bCBjb21iaW5hdGlvbiBvZiBzdXBlcmhlcm8gZWxlbWVudHMgd2l0aCBwb2xpdGljYWwgdGhyaWxsZXIgdGhlbWVzLCByYXRoZXIgdGhhbiBwdXNoaW5nIGFueSBwYXJ0aWN1bGFyIHBvbGl0aWNhbCBhZ2VuZGEuIixUYXNrIHdhcyBjYW5jZWxsZWQuLFRhc2sgd2FzIGNhbmNlbGxlZC4sLCJObwoKQ29tbWVudDogVGhpcyByZXZpZXcgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4gV2hpbGUgaXQgbWVudGlvbnMgYSBwb2xpdGljYWwgdGhlbWUgKGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMpLCB0aGUgcmV2aWV3IGZvY3VzZXMgcHJpbWFyaWx5IG9uIHRoZSBmaWxtJ3MgZ2VucmUgYmxlbmQgYW5kIG92ZXJhbGwgZWZmZWN0aXZlbmVzcy4gSXQgcmVhZHMgYXMgYSBzdGFuZGFyZCBtb3ZpZSBjcml0aWMgYW5hbHlzaXMgcHJhaXNpbmcgdGhlIGZpbG0ncyBzdWNjZXNzZnVsIGNvbWJpbmF0aW9uIG9mIHN1cGVyaGVybyBlbGVtZW50cyB3aXRoIHBvbGl0aWNhbCB0aHJpbGxlciB0aGVtZXMsIHJhdGhlciB0aGFuIHB1c2hpbmcgYW55IHBhcnRpY3VsYXIgcG9saXRpY2FsIGFnZW5kYS4iLA0K
binary False
suffix csv
mime_type text/csv

Posting to the Coop

[19]:
from edsl import Notebook
[20]:
n = Notebook(path = "edsl_intro.ipynb")
[21]:
info = n.push(description = "Example survey: Using EDSL to analyze content", visibility = "public")
info
[21]:
{'description': 'Example survey: Using EDSL to analyze content',
 'object_type': 'notebook',
 'url': 'https://www.expectedparrot.com/content/2ed11d62-8e1a-44c3-976c-7de87cb28e6b',
 'uuid': '2ed11d62-8e1a-44c3-976c-7de87cb28e6b',
 'version': '0.1.39.dev1',
 'visibility': 'public'}

To update an object at the Coop:

[22]:
n = Notebook(path = "edsl_intro.ipynb") # resave
[23]:
n.patch(uuid = info["uuid"], value = n)
[23]:
{'status': 'success'}