Introdução
Neste relatório, serão analisados as avaliações dos episódios e das temporadas de três séries de TV: Friends, Desperate Housewives e House. As perguntas as serem respondidas incluem qual das séries é mais bem avaliada, qual possui episódios de qualidade mais irregular, qual das séries ou temporadas tem episódios mais sem graça e o que tende a ser melhor: inícios ou finais de séries/temporadas.
Importando os dados
O primeiro passo desta análise é importar os dados a serem utilizados e filtrar as séries de interesse.
episodes = read_csv(here("data/series_from_imdb.csv"),
progress = FALSE,
col_types = cols(.default = col_double(),
series_name = col_character(),
episode = col_character(),
url = col_character(),
season = col_character())) %>%
filter(series_name %in% c("Friends", "Desperate Housewives", "House"))
Error in read_csv(here("data/series_from_imdb.csv"), progress = FALSE, :
não foi possível encontrar a função "%>%"
Perguntas
Qual das séries tem episódios de qualidade mais irregular segundo o IMDB? A diferença é grande? Pequena?

Os gráficos acima exibem a relação entre o episódio e a avaliação dada pelo usuários por temporada em cada uma das três séries. A série que possui maior variação de avaliação dos usuários é House, seguindo de Friends e Desperate Housewives. A diferença entre os episódios de House variam de 7.6 a 9.4, com a maior parte das avaliações entre 8.0 e 9.2. A avaliação dos episódios de Friends variam entre 7.5 e 9.5, possuindo maior concentração das notas entre 8.0 e 9.0. Desperate Housewives possui maior concentração de avaliações entre 7.7 e 8.2, possuindo episódios com notas mais regulares entre as três.
Qual das séries ou temporadas tem episódios mais sem graça? (Um episódio é sem graça se ninguém nem ama nem odeia ele)
Os episódios foram considerados sem graça de acordo com a proporção de votos iguais a 5 (considerados neutros) em relação ao número total de votos.
episodes = episodes %>%
mutate(
rank_odiados = row_number(r1), # maior = mais odiado
rank_amados = row_number(r10), # maior = mais amado
rank_sem_graca = row_number(r5), # maior = mais sem graca,
amado_odiado = rank_amados * rank_odiados) # maior = mais amado E odiado
episodes %>% group_by(series_name) %>%
ggplot(aes(
x = r5,
y = season,
color = series_name,
label = season_ep,
size = rank_sem_graca
)) +
geom_point(alpha = .5) +
geom_text(nudge_x = .001, nudge_y = -.01) +
labs(y = "Temporadas", x = "Proporção de votos neutros") +
guides(color=guide_legend("Série"), size = guide_legend("Nível de chatice"))

Friends é a série que possui mais episódios sem graça, seguido por House e Desperate Housewives. Dentre as temporadas da série, as que possuem episódios mais sem graça são as temporadas 4 e 10. O episódio mais chato de todos os tempos de acordo com os votos dos usuários é S8E16 - The One Where Joey Tells Rachel, onde Joey conta para Rachel que está apaixonado por ela, provavelmente uma parcela das pessoas torciam pelo casal, enquanto a outra torcia por Rachel e Ross. O segundo episódio mais chato da série é S4E22 - The One with the Worst Best Man Ever, onde os três personagens masculinos discutem sobre quem será o padrinho de casamento dos outros e Joey acaba perdendo o anel de casamento. Esse episódio ser considerado o segundo mais chato me surpreendeu pois nele também ocorre o chá de bebê da Phoebe (que considero a personagem mais engraçada do seriado) e tem cenas bem engraçadas. O terceiro episódio mais chato é também da série Friends, o S10E12 - The One With Phoebe’s Wedding, onde Phoebe se casa, apesar de tudo dar errado o episódio quase todo, motivo que pode ter causado essa posição de chatice do episódio.
Episódios no início/fim da temporada são mais bem avaliados que os no meio? O que tende a ser melhor? Inícios ou finais de séries/temporadas?
episodes %>% group_by(series_name) %>%
ggplot(aes(x = season_ep, y = user_rating, color = series_name)) +
geom_jitter(width = .1, size = .5, alpha = .5) +
geom_line() +
labs(x = "Episódios", y = "Avaliação") +
facet_wrap(~ season) +
guides(color=guide_legend("Série"))

Pelo gráfico acima, pode-se observar que as melhores avaliações de uma temporada estão normalmente em seus episódios finais, com exceção de algumas temporadas: 3ª, 5ª e 7ª temporadas de Desperate Housewives e a 2ª e 5ª temporadas de Friends, que tiveram as melhores avaliações na metade de suas temporadas; 4ª remporada de House e 8ª de Friends tiveram as melhores avaliações em seus inícios de temporadas. As séries Friends e Desperate Housewives tiveram suas melhores avaliações de episódio nas temporadas finais. House teve melhores episódios no meio da série, nas temporadas 4, 5 e 6.
Qual o episódio mais detestado?

House lidera de longe os episódios mais odiados pelo IMDb. O episódio mais odiado é o S7E18 - The Dig e a razão só saberei quando terminar a série. (Estou na quinta temporada e postarei a minha opinião sobre o episódio assim que assisti-lo!). O episódio mais odiado de Friends também é o S8E16 - The One Where Joey Tells Rachel, o que Joey conta para Rachel que está apaixonado por ela. Coincidentemente, o episódio mais odiado de Desperate Housewives também possui a mesma numeração do episódio de Friends: S8E16 - You Take for Granted, onde Mike Delfino, um dos personagens principais e mais queridos (na minha opinião) morre, por um motivo banal e na calçada de casa. Este com certeza mereceu o título de mais odiado da série inteira.
E amado?
episodes %>% group_by(series_name) %>%
ggplot(aes(
x = r10,
y = season,
color = series_name,
label = season_ep,
size = rank_amados)) +
geom_point(alpha = .5) +
geom_text(nudge_x = .001, nudge_y = -.01) +
labs(y = "Temporadas", x = "Proporção de votos amados") +
guides(color=guide_legend("Série"), size = guide_legend("Nível de amor"))

Friends possui os episódios mais amados dentre as demais série, destacando-se três episódios da primeira temporada: S1E3 - The One With the Thumb, onde Phoebe vai ganhando mais dinheiro conforme vai fazendo boas ações, S1E4 - The One with George Stephanopoulos, em que os meninos levam Ross para sair e esquecer o aniversário de casamento com a ex esposa e S1E22 - The One with the Ick Factor, onde tem o namorado novo da Monica e Chandler descobrindo que ninguém do trabalho gosta dele.
LS0tCnRpdGxlOiAiQW7DoWxpc2Ugc29icmUgYXZhbGlhw6fDtWVzIGRlIHPDqXJpZXMgZGUgVFYgcGVsbyBJTURiIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShoZXJlKQp0aGVtZV9zZXQodGhlbWVfYncoKSkKYGBgCiMjIEludHJvZHXDp8OjbwoKTmVzdGUgcmVsYXTDs3Jpbywgc2Vyw6NvIGFuYWxpc2Fkb3MgYXMgYXZhbGlhw6fDtWVzIGRvcyBlcGlzw7NkaW9zIGUgZGFzIHRlbXBvcmFkYXMgZGUgdHLDqnMgc8OpcmllcyBkZSBUVjogRnJpZW5kcywgRGVzcGVyYXRlIEhvdXNld2l2ZXMgZSBIb3VzZS4gQXMgcGVyZ3VudGFzIGFzIHNlcmVtIHJlc3BvbmRpZGFzIGluY2x1ZW0gcXVhbCBkYXMgc8OpcmllcyDDqSBtYWlzIGJlbSBhdmFsaWFkYSwgcXVhbCBwb3NzdWkgZXBpc8OzZGlvcyBkZSBxdWFsaWRhZGUgbWFpcyBpcnJlZ3VsYXIsIHF1YWwgZGFzIHPDqXJpZXMgb3UgdGVtcG9yYWRhcyB0ZW0gZXBpc8OzZGlvcyBtYWlzIHNlbSBncmHDp2EgZSBvIHF1ZSB0ZW5kZSBhIHNlciBtZWxob3I6IGluw61jaW9zIG91IGZpbmFpcyBkZSBzw6lyaWVzL3RlbXBvcmFkYXMuCgojIyMjIEltcG9ydGFuZG8gb3MgZGFkb3MKCk8gcHJpbWVpcm8gcGFzc28gZGVzdGEgYW7DoWxpc2Ugw6kgaW1wb3J0YXIgb3MgZGFkb3MgYSBzZXJlbSB1dGlsaXphZG9zIGUgZmlsdHJhciBhcyBzw6lyaWVzIGRlIGludGVyZXNzZS4KCmBgYHtyfQplcGlzb2RlcyA9IHJlYWRfY3N2KGhlcmUoImRhdGEvc2VyaWVzX2Zyb21faW1kYi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKC5kZWZhdWx0ID0gY29sX2RvdWJsZSgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc19uYW1lID0gY29sX2NoYXJhY3RlcigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaXNvZGUgPSBjb2xfY2hhcmFjdGVyKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uID0gY29sX2NoYXJhY3RlcigpKSkgJT4lIAogICAgZmlsdGVyKHNlcmllc19uYW1lICVpbiUgYygiRnJpZW5kcyIsICJEZXNwZXJhdGUgSG91c2V3aXZlcyIsICJIb3VzZSIpKQpgYGAKCiMjIFBlcmd1bnRhcwoKIyMjIFF1YWwgZGFzIHPDqXJpZXMgw6kgbWFpcyBiZW0gYXZhbGlhZGEgbm8gSU1EQj8gQSBkaWZlcmVuw6dhIMOpIGdyYW5kZT8gUGVxdWVuYT8gTXVkYSBkZSBhY29yZG8gY29tIGFzIHRlbXBvcmFkYXMgZGEgc8OpcmllPyAKCiAgTyBjcml0w6lyaW8gcGFyYSBlc2NvbGhhIGRhIHPDqXJpZSBtYWlzIGJlbSBhdmFsaWFkYSBmb2kgZXNjb2xoaWRvIGRlIGFjb3JkbyBjb20gYSBtw6lkaWEgZG8gdmFsb3IgZGEgcHJvcG9yw6fDo28gZGUgdXN1w6FyaW9zIHF1ZSB2b3RhcmFtIG5vdGEgbcOheGltYSBlbSBjYWRhIGVwaXPDs2Rpby4KICAKYGBge3J9CmVwaXNvZGVzICU+JSBncm91cF9ieShzZXJpZXNfbmFtZSwgc2Vhc29uKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl9ieV9zZXJpZSA9IG1lZGlhbihyMTApKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzZWFzb24sIHkgPSBtZWRpYW5fYnlfc2VyaWUgKjEwMCwgY29sb3IgPSBzZXJpZXNfbmFtZSwgZ3JvdXA9c2VyaWVzX25hbWUpKSArCiAgZ2VvbV9saW5lKHN0YXQ9J2lkZW50aXR5JykgKwogIGdlb21fcG9pbnQoKSArCiAgbGFicyh4ID0gIlRlbXBvcmFkYXMiLCB5ID0gIk3DqWRpYSBkZSBwcm9wb3LDp8OjbyBkZSBub3RhcyBtw6F4aW1hcyAoJSkiKSAgKwogIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQoIlPDqXJpZSIpKQpgYGAKICAKICBObyBncsOhZmljbyDDqSBwb3Nzw612ZWwgdmlzdWFsaXphciBhIHJlbGHDp8OjbyBlbnRyZSBhcyB0ZW1wb3JhZGFzIGRhcyBzw6lyaWVzIGUgYSBtw6lkaWEgZG8gdmFsb3IgZGEgcHJvcG9yw6fDo28gZGUgdXN1w6FyaW9zIHF1ZSB2b3RhcmFtIG5vdGEgbcOheGltYSBlbSBjYWRhIGVwaXPDs2RpbyBubyBkZWNvcnJlciBkYXMgdGVtcG9yYWRhcy4gCiAgQSBzw6lyaWUgbWFpcyBiZW0gdm90YWRhIMOpICoqRnJpZW5kcyoqLCBwb3NzdWluZG8gbWFpcyBub3RhcyBtw6F4aW1hcyBkZW50cmUgYXMgZGVtYWlzIGF2YWxpYcOnw7VlcyBwb3IgZXBpc8OzZGlvLiBFc3RlIHNlcmlhZG8gbGlkZXJvdSBhcyBkZW1haXMgcHJpbmNpcGFsbWVudGUgZHVyYW50ZSBhcyB0ZW1wb3JhZGFzIDEgZSAzLCBwb3NzdWluZG8gcXVhc2UgMzUlIGRhcyBub3RhcyBjb20gdmFsb3IgbcOheGltby4gTm90YS1zZSBxdWUsIGEgcGFydGlyIGRhIDPCqiB0ZW1wb3JhZGEsIGVzc2EgcHJvcG9yw6fDo28gZGltaW51aXUgZHJhc3RpY2FtZW50ZSwgY2hlZ2FuZG8gYSBzZXUgbcOtbmltbyBuYSA1wqogdGVtcG9yYWRhLCBjb20gdmFsb3IgaWd1YWwgYSAyOCUuIFVtYSBwb3Nzw612ZWwgcmF6w6NvIHBhcmEgZXNzYSBxdWVkYSBzZXJpYSBvIHTDqXJtaW5vIGRvIGNhc2FsIFJhY2hlbCBlIFJvc3MgZSBvIG5vdm8gbmFtb3JvIGRlIFJvc3MgY29tIEVtaWx5LgogICoqSG91c2UqKiBvY3Vwb3UgYSBzZWd1bmRhIHBvc2nDp8OjbyBkbyByYW5raW5nLCBjb20gYXZhbGlhw6fDo28gY3Jlc2NldGUgYW8gbG9uZ28gZGFzIHRlbXBvcmFkYXMgZSBkb21pbmFuZG8gYXMgbWVsaG9yZXMgYXZhbGlhw6fDtWVzIGR1cmFudGUgNCB0ZW1wb3JhZGFzOiA0wqosIDXCqiwgNsKqIGEgN8KqLiBBY3JlZGl0byBxdWUgYSBxdWVkYSBuYSA4wqogdGVtcG9yYWRhIHNlIGRldmEgcGVsYXMgKiphbGVydGEgZGUgc3BvaWxlcioqIG1vcnRlcyBkZSBwZXJzb25hZ2VucyBpbXBvcnRhbnRlcyBkYSBzw6lyaWUuCiAgKipEZXNwZXJhdGUgSG91c2V3aXZlcyoqIGZpY291IGVtIMO6bHRpbW8gbHVnYXIsIHBvc3N1aW5kbyBhdmFsaWHDp8OjbyBjcmVzY2VudGUgY29tIGV4Y2XDp8OjbyBwcmluY2lwYWxtZW50ZSBkYSA2wqogdGVtcG9yYWRhLCBxdWUgdGV2ZSBvIHZhbG9yIG3DrW5pbW8gZW50cmUgdG9kYXMgYXMgdGVtcG9yYWRhcyBkZSB0b2RhcyBhcyBzw6lyaWVzLiBBY3JlZGl0byBxdWUgZXN0YSBxdWVkYSBvY29ycmV1IGRldmlkbyBhbyBtaXN0w6lyaW8gZW52b2x2ZW5kbyBvIGVzdHJhbmd1bGFkb3IgZGUgRmFpcnZpZXcsIGFsw6ltIGRhIGNhdMOhc3Ryb2ZlIGVudm9sdmVuZG8gYSBxdWVkYSBkZSB1bSBhdmnDo28gZGVudHJvIGRvIGNvbmRvbcOtbmlvIG9uZGUgYXMgcHJpbmNpcGFpcyBwZXJzb25hZ2VucyByZXNpZGVtLgogIAojIyMgIFF1YWwgZGFzIHPDqXJpZXMgdGVtIGVwaXPDs2Rpb3MgZGUgcXVhbGlkYWRlIG1haXMgaXJyZWd1bGFyIHNlZ3VuZG8gbyBJTURCPyBBIGRpZmVyZW7Dp2Egw6kgZ3JhbmRlPyBQZXF1ZW5hPyAKCmBgYHtyfQplcGlzb2RlcyAlPiUgCiAgZ3JvdXBfYnkoc2VyaWVzX25hbWUpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gc2VyaWVzX25hbWUsIHkgPSB1c2VyX3JhdGluZykpICsgCiAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAuNSwgb3V0bGllci5jb2xvciA9IE5BKSArICAgCiAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBzaXplID0gMiwgYWxwaGEgPSAuNSwgY29sb3IgPSAicHVycGxlIikgKwogIGxhYnMoeCA9ICJTw6lyaWVzIiwgeSA9ICJBdmFsaWHDp8OjbyBubyBJTURCIikKYGBgCiAgT3MgZ3LDoWZpY29zIGFjaW1hIGV4aWJlbSBhIHJlbGHDp8OjbyBlbnRyZSBvIGVwaXPDs2RpbyBlIGEgYXZhbGlhw6fDo28gZGFkYSBwZWxvIHVzdcOhcmlvcyBwb3IgdGVtcG9yYWRhIGVtIGNhZGEgdW1hIGRhcyB0csOqcyBzw6lyaWVzLiAKICBBIHPDqXJpZSBxdWUgcG9zc3VpIG1haW9yIHZhcmlhw6fDo28gZGUgYXZhbGlhw6fDo28gZG9zIHVzdcOhcmlvcyDDqSAqKkhvdXNlKiosIHNlZ3VpbmRvIGRlICoqRnJpZW5kcyoqIGUgKipEZXNwZXJhdGUgSG91c2V3aXZlcyoqLiBBIGRpZmVyZW7Dp2EgZW50cmUgb3MgZXBpc8OzZGlvcyBkZSBIb3VzZSB2YXJpYW0gZGUgNy42IGEgOS40LCBjb20gYSBtYWlvciBwYXJ0ZSBkYXMgYXZhbGlhw6fDtWVzIGVudHJlICA4LjAgZSA5LjIuIEEgYXZhbGlhw6fDo28gZG9zIGVwaXPDs2Rpb3MgZGUgRnJpZW5kcyB2YXJpYW0gZW50cmUgNy41IGUgOS41LCBwb3NzdWluZG8gbWFpb3IgY29uY2VudHJhw6fDo28gZGFzIG5vdGFzIGVudHJlIDguMCBlIDkuMC4gRGVzcGVyYXRlIEhvdXNld2l2ZXMgcG9zc3VpIG1haW9yIGNvbmNlbnRyYcOnw6NvIGRlIGF2YWxpYcOnw7VlcyBlbnRyZSA3LjcgZSA4LjIsIHBvc3N1aW5kbyBlcGlzw7NkaW9zIGNvbSBub3RhcyBtYWlzIHJlZ3VsYXJlcyBlbnRyZSBhcyB0csOqcy4KCiMjIyBRdWFsIGRhcyBzw6lyaWVzIG91IHRlbXBvcmFkYXMgdGVtIGVwaXPDs2Rpb3MgbWFpcyBzZW0gZ3Jhw6dhPyAoVW0gZXBpc8OzZGlvIMOpIHNlbSBncmHDp2Egc2UgbmluZ3XDqW0gbmVtIGFtYSBuZW0gb2RlaWEgZWxlKSAKCiAgT3MgZXBpc8OzZGlvcyBmb3JhbSBjb25zaWRlcmFkb3Mgc2VtIGdyYcOnYSBkZSBhY29yZG8gY29tIGEgcHJvcG9yw6fDo28gZGUgdm90b3MgaWd1YWlzIGEgNSAoY29uc2lkZXJhZG9zIG5ldXRyb3MpIGVtIHJlbGHDp8OjbyBhbyBuw7ptZXJvIHRvdGFsIGRlIHZvdG9zLiAKCmBgYHtyfQplcGlzb2RlcyA9ICBlcGlzb2RlcyAlPiUKICAgIG11dGF0ZSgKICAgICAgICByYW5rX29kaWFkb3MgPSByb3dfbnVtYmVyKHIxKSwgIyBtYWlvciA9IG1haXMgb2RpYWRvCiAgICAgICAgcmFua19hbWFkb3MgPSByb3dfbnVtYmVyKHIxMCksICMgbWFpb3IgPSBtYWlzIGFtYWRvCiAgICAgICAgcmFua19zZW1fZ3JhY2EgPSByb3dfbnVtYmVyKHI1KSwgIyBtYWlvciA9IG1haXMgc2VtIGdyYWNhLAogICAgICAgIGFtYWRvX29kaWFkbyA9IHJhbmtfYW1hZG9zICogcmFua19vZGlhZG9zKSAjIG1haW9yID0gbWFpcyBhbWFkbyBFIG9kaWFkbwoKZXBpc29kZXMgJT4lIGdyb3VwX2J5KHNlcmllc19uYW1lKSAlPiUKICAgIGdncGxvdChhZXMoCiAgICAgICAgeCA9IHI1LAogICAgICAgIHkgPSBzZWFzb24sCiAgICAgICAgY29sb3IgPSBzZXJpZXNfbmFtZSwKICAgICAgICBsYWJlbCA9IHNlYXNvbl9lcCwKICAgICAgICBzaXplID0gcmFua19zZW1fZ3JhY2EKICAgICkpICsKICAgIGdlb21fcG9pbnQoYWxwaGEgPSAuNSkgKwogICAgZ2VvbV90ZXh0KG51ZGdlX3ggPSAuMDAxLCBudWRnZV95ID0gLS4wMSkgKwogIGxhYnMoeSA9ICJUZW1wb3JhZGFzIiwgeCA9ICJQcm9wb3LDp8OjbyBkZSB2b3RvcyBuZXV0cm9zIikgKwogIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQoIlPDqXJpZSIpLCBzaXplID0gZ3VpZGVfbGVnZW5kKCJOw612ZWwgZGUgY2hhdGljZSIpKQpgYGAKICAKICAqKkZyaWVuZHMqKiDDqSBhIHPDqXJpZSBxdWUgcG9zc3VpIG1haXMgZXBpc8OzZGlvcyBzZW0gZ3Jhw6dhLCBzZWd1aWRvIHBvciBIb3VzZSBlIERlc3BlcmF0ZSBIb3VzZXdpdmVzLiBEZW50cmUgYXMgdGVtcG9yYWRhcyBkYSBzw6lyaWUsIGFzIHF1ZSBwb3NzdWVtIGVwaXPDs2Rpb3MgbWFpcyBzZW0gZ3Jhw6dhIHPDo28gYXMgdGVtcG9yYWRhcyA0IGUgMTAuIE8gZXBpc8OzZGlvIG1haXMgY2hhdG8gZGUgdG9kb3Mgb3MgdGVtcG9zIGRlIGFjb3JkbyBjb20gb3Mgdm90b3MgZG9zIHVzdcOhcmlvcyDDqSAqKlM4RTE2IC0gVGhlIE9uZSBXaGVyZSBKb2V5IFRlbGxzIFJhY2hlbCoqLCBvbmRlIEpvZXkgY29udGEgcGFyYSBSYWNoZWwgcXVlIGVzdMOhIGFwYWl4b25hZG8gcG9yIGVsYSwgcHJvdmF2ZWxtZW50ZSB1bWEgcGFyY2VsYSBkYXMgcGVzc29hcyB0b3JjaWFtIHBlbG8gY2FzYWwsIGVucXVhbnRvIGEgb3V0cmEgdG9yY2lhIHBvciBSYWNoZWwgZSBSb3NzLiBPIHNlZ3VuZG8gZXBpc8OzZGlvIG1haXMgY2hhdG8gZGEgc8OpcmllIMOpICoqUzRFMjIgLSBUaGUgT25lIHdpdGggdGhlIFdvcnN0IEJlc3QgTWFuIEV2ZXIqKiwgb25kZSBvcyB0csOqcyBwZXJzb25hZ2VucyBtYXNjdWxpbm9zIGRpc2N1dGVtIHNvYnJlIHF1ZW0gc2Vyw6EgbyBwYWRyaW5obyBkZSBjYXNhbWVudG8gZG9zIG91dHJvcyBlIEpvZXkgYWNhYmEgcGVyZGVuZG8gbyBhbmVsIGRlIGNhc2FtZW50by4gRXNzZSBlcGlzw7NkaW8gc2VyIGNvbnNpZGVyYWRvIG8gc2VndW5kbyBtYWlzIGNoYXRvIG1lIHN1cnByZWVuZGV1IHBvaXMgbmVsZSB0YW1iw6ltIG9jb3JyZSBvIGNow6EgZGUgYmViw6ogZGEgUGhvZWJlIChxdWUgY29uc2lkZXJvIGEgcGVyc29uYWdlbSBtYWlzIGVuZ3Jhw6dhZGEgZG8gc2VyaWFkbykgZSB0ZW0gY2VuYXMgYmVtIGVuZ3Jhw6dhZGFzLiBPIHRlcmNlaXJvIGVwaXPDs2RpbyBtYWlzIGNoYXRvIMOpIHRhbWLDqW0gZGEgc8OpcmllIEZyaWVuZHMsIG8gKipTMTBFMTIgLSBUaGUgT25lIFdpdGggUGhvZWJlJ3MgV2VkZGluZyoqLCBvbmRlIFBob2ViZSBzZSBjYXNhLCBhcGVzYXIgZGUgdHVkbyBkYXIgZXJyYWRvIG8gZXBpc8OzZGlvIHF1YXNlIHRvZG8sIG1vdGl2byBxdWUgcG9kZSB0ZXIgY2F1c2FkbyBlc3NhIHBvc2nDp8OjbyBkZSBjaGF0aWNlIGRvIGVwaXPDs2Rpby4gCiAgCiMjIyBFcGlzw7NkaW9zIG5vIGluw61jaW8vZmltIGRhIHRlbXBvcmFkYSBzw6NvIG1haXMgYmVtIGF2YWxpYWRvcyBxdWUgb3Mgbm8gbWVpbz8gTyBxdWUgdGVuZGUgYSBzZXIgbWVsaG9yPyBJbsOtY2lvcyBvdSBmaW5haXMgZGUgc8Opcmllcy90ZW1wb3JhZGFzPwoKYGBge3J9CmVwaXNvZGVzICU+JSBncm91cF9ieShzZXJpZXNfbmFtZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2Vhc29uX2VwLCB5ID0gdXNlcl9yYXRpbmcsIGNvbG9yID0gc2VyaWVzX25hbWUpKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgc2l6ZSA9IC41LCBhbHBoYSA9IC41KSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJFcGlzw7NkaW9zIiwgeSA9ICJBdmFsaWHDp8OjbyIpICsKICBmYWNldF93cmFwKH4gc2Vhc29uKSArCiAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCgiU8OpcmllIikpCmBgYAoKICBQZWxvIGdyw6FmaWNvIGFjaW1hLCBwb2RlLXNlIG9ic2VydmFyIHF1ZSBhcyBtZWxob3JlcyBhdmFsaWHDp8O1ZXMgZGUgdW1hIHRlbXBvcmFkYSBlc3TDo28gbm9ybWFsbWVudGUgZW0gc2V1cyBlcGlzw7NkaW9zIGZpbmFpcywgY29tIGV4Y2XDp8OjbyBkZSBhbGd1bWFzIHRlbXBvcmFkYXM6IDPCqiwgNcKqIGUgN8KqIHRlbXBvcmFkYXMgZGUgRGVzcGVyYXRlIEhvdXNld2l2ZXMgZSBhIDLCqiBlIDXCqiB0ZW1wb3JhZGFzIGRlIEZyaWVuZHMsIHF1ZSB0aXZlcmFtIGFzIG1lbGhvcmVzIGF2YWxpYcOnw7VlcyBuYSBtZXRhZGUgZGUgc3VhcyB0ZW1wb3JhZGFzOyA0wqogcmVtcG9yYWRhIGRlIEhvdXNlIGUgOMKqIGRlIEZyaWVuZHMgdGl2ZXJhbSBhcyBtZWxob3JlcyBhdmFsaWHDp8O1ZXMgZW0gc2V1cyBpbsOtY2lvcyBkZSB0ZW1wb3JhZGFzLgogIEFzIHPDqXJpZXMgRnJpZW5kcyBlIERlc3BlcmF0ZSBIb3VzZXdpdmVzIHRpdmVyYW0gc3VhcyBtZWxob3JlcyBhdmFsaWHDp8O1ZXMgZGUgZXBpc8OzZGlvIG5hcyB0ZW1wb3JhZGFzIGZpbmFpcy4gSG91c2UgdGV2ZSBtZWxob3JlcyBlcGlzw7NkaW9zIG5vIG1laW8gZGEgc8OpcmllLCBuYXMgdGVtcG9yYWRhcyA0LCA1IGUgNi4KCiMjIyBRdWFsIG8gZXBpc8OzZGlvIG1haXMgZGV0ZXN0YWRvPyAKCmBgYHtyfQplcGlzb2RlcyAlPiUgZ3JvdXBfYnkoc2VyaWVzX25hbWUpICU+JQogICAgZ2dwbG90KGFlcygKICAgICAgICB4ID0gcjEsCiAgICAgICAgeSA9IHNlYXNvbiwKICAgICAgICBjb2xvciA9IHNlcmllc19uYW1lLAogICAgICAgIGxhYmVsID0gc2Vhc29uX2VwLAogICAgICAgIHNpemUgPSByYW5rX29kaWFkb3MpKSArCiAgICBnZW9tX3BvaW50KGFscGhhID0gLjUpICsKICAgIGdlb21fdGV4dChudWRnZV94ID0gLjAwMSwgbnVkZ2VfeSA9IC0uMDEpICsKICBsYWJzKHkgPSAiVGVtcG9yYWRhcyIsIHggPSAiUHJvcG9yw6fDo28gZGUgdm90b3Mgb2RpYWRvcyIpICsKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKCJTw6lyaWUiKSwgc2l6ZSA9IGd1aWRlX2xlZ2VuZCgiTsOtdmVsIGRlIMOzZGlvIikpCmBgYAoKICBIb3VzZSBsaWRlcmEgZGUgbG9uZ2Ugb3MgZXBpc8OzZGlvcyBtYWlzIG9kaWFkb3MgcGVsbyBJTURiLiBPIGVwaXPDs2RpbyBtYWlzIG9kaWFkbyDDqSBvICoqUzdFMTggLSBUaGUgRGlnKiogZSBhIHJhesOjbyBzw7Mgc2FiZXJlaSBxdWFuZG8gdGVybWluYXIgYSBzw6lyaWUuIChFc3RvdSBuYSBxdWludGEgdGVtcG9yYWRhIGUgcG9zdGFyZWkgYSBtaW5oYSBvcGluacOjbyBzb2JyZSBvIGVwaXPDs2RpbyBhc3NpbSBxdWUgYXNzaXN0aS1sbyEpLiBPIGVwaXPDs2RpbyBtYWlzIG9kaWFkbyBkZSBGcmllbmRzIHRhbWLDqW0gw6kgbyAqKlM4RTE2IC0gVGhlIE9uZSBXaGVyZSBKb2V5IFRlbGxzIFJhY2hlbCoqLCBvIHF1ZSBKb2V5IGNvbnRhIHBhcmEgUmFjaGVsIHF1ZSBlc3TDoSBhcGFpeG9uYWRvIHBvciBlbGEuIENvaW5jaWRlbnRlbWVudGUsIG8gZXBpc8OzZGlvIG1haXMgb2RpYWRvIGRlIERlc3BlcmF0ZSBIb3VzZXdpdmVzIHRhbWLDqW0gcG9zc3VpIGEgbWVzbWEgbnVtZXJhw6fDo28gZG8gZXBpc8OzZGlvIGRlIEZyaWVuZHM6ICoqUzhFMTYgLSBZb3UgVGFrZSBmb3IgR3JhbnRlZCoqLCBvbmRlIE1pa2UgRGVsZmlubywgdW0gZG9zIHBlcnNvbmFnZW5zIHByaW5jaXBhaXMgZSBtYWlzIHF1ZXJpZG9zIChuYSBtaW5oYSBvcGluacOjbykgbW9ycmUsIHBvciB1bSBtb3Rpdm8gYmFuYWwgZSBuYSBjYWzDp2FkYSBkZSBjYXNhLiBFc3RlIGNvbSBjZXJ0ZXphIG1lcmVjZXUgbyB0w610dWxvIGRlIG1haXMgb2RpYWRvIGRhIHPDqXJpZSBpbnRlaXJhLgoKIyMjIEUgYW1hZG8/IAoKYGBge3J9CmVwaXNvZGVzICU+JSBncm91cF9ieShzZXJpZXNfbmFtZSkgJT4lCiAgICBnZ3Bsb3QoYWVzKAogICAgICAgIHggPSByMTAsCiAgICAgICAgeSA9IHNlYXNvbiwKICAgICAgICBjb2xvciA9IHNlcmllc19uYW1lLAogICAgICAgIGxhYmVsID0gc2Vhc29uX2VwLAogICAgICAgIHNpemUgPSByYW5rX2FtYWRvcykpICsKICAgIGdlb21fcG9pbnQoYWxwaGEgPSAuNSkgKwogICAgZ2VvbV90ZXh0KG51ZGdlX3ggPSAuMDAxLCBudWRnZV95ID0gLS4wMSkgKwogIGxhYnMoeSA9ICJUZW1wb3JhZGFzIiwgeCA9ICJQcm9wb3LDp8OjbyBkZSB2b3RvcyBhbWFkb3MiKSArCiAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCgiU8OpcmllIiksIHNpemUgPSBndWlkZV9sZWdlbmQoIk7DrXZlbCBkZSBhbW9yIikpCmBgYAogIAogIEZyaWVuZHMgcG9zc3VpIG9zIGVwaXPDs2Rpb3MgbWFpcyBhbWFkb3MgZGVudHJlIGFzIGRlbWFpcyBzw6lyaWUsIGRlc3RhY2FuZG8tc2UgdHLDqnMgZXBpc8OzZGlvcyBkYSBwcmltZWlyYSB0ZW1wb3JhZGE6ICoqUzFFMyAtIFRoZSBPbmUgV2l0aCB0aGUgVGh1bWIqKiwgb25kZSBQaG9lYmUgdmFpIGdhbmhhbmRvIG1haXMgZGluaGVpcm8gY29uZm9ybWUgdmFpIGZhemVuZG8gYm9hcyBhw6fDtWVzLCAqKlMxRTQgLSBUaGUgT25lIHdpdGggR2VvcmdlIFN0ZXBoYW5vcG91bG9zKiosIGVtIHF1ZSBvcyBtZW5pbm9zIGxldmFtIFJvc3MgcGFyYSBzYWlyIGUgZXNxdWVjZXIgbyBhbml2ZXJzw6FyaW8gZGUgY2FzYW1lbnRvIGNvbSBhIGV4IGVzcG9zYSBlICoqUzFFMjIgLSBUaGUgT25lIHdpdGggdGhlIEljayBGYWN0b3IqKiwgb25kZSB0ZW0gbyBuYW1vcmFkbyBub3ZvIGRhIE1vbmljYSBlIENoYW5kbGVyIGRlc2NvYnJpbmRvIHF1ZSBuaW5ndcOpbSBkbyB0cmFiYWxobyBnb3N0YSBkZWxlLgo=