1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-08-29 17:40:42 +02:00

Merge branch 'master' into patch-4

This commit is contained in:
Divay Prakash
2019-11-24 12:38:47 +05:30
committed by GitHub
44 changed files with 3332 additions and 302 deletions

View File

@@ -33,7 +33,7 @@ diretamente no shell.
# Exemplo simples de hello world:
echo Hello World!
# Cada comando começa com uma nova linha, ou após um ponto virgula:
# Cada comando começa com uma nova linha, ou após um ponto e vírgula:
echo 'Essa é a primeira linha'; echo 'Essa é a segunda linha'
# A declaração de variáveis é mais ou menos assim
@@ -41,14 +41,14 @@ Variavel="Alguma string"
# Mas não assim:
Variavel = "Alguma string"
# Bash interpretará Variavel como um comando e tentará executar e lhe retornar
# Bash interpretará Variavel como um comando e tentará executar e lhe retornará
# um erro porque o comando não pode ser encontrado.
# Ou assim:
Variavel= 'Alguma string'
# Bash interpretará 'Alguma string' como um comando e tentará executar e lhe retornar
# Bash interpretará 'Alguma string' como um comando e tentará executar e lhe retornará
# um erro porque o comando não pode ser encontrado. (Nesse caso a a parte 'Variavel='
# é vista com uma declaração de variável valida apenas para o escopo do comando 'Uma string').
# é vista com uma declaração de variável válida apenas para o escopo do comando 'Uma string').
# Usando a variável:
echo $Variavel
@@ -65,12 +65,12 @@ echo ${Variavel/Alguma/Uma}
# Substring de uma variável
Tamanho=7
echo ${Variavel:0:Tamanho}
# Isso retornará apenas os 7 primeiros caractéres da variável
# Isso retornará apenas os 7 primeiros caracteres da variável
# Valor padrão de uma variável
echo ${Foo:-"ValorPadraoSeFooNaoExistirOuEstiverVazia"}
# Isso funciona para nulo (Foo=) e (Foo=""); zero (Foo=0) retorna 0.
# Note que isso apenas retornar o valor padrão e não mudar o valor da variável.
# Note que isso apenas retornará o valor padrão e não mudará o valor da variável.
# Variáveis internas
# Tem algumas variáveis internas bem uteis, como
@@ -86,7 +86,7 @@ read Nome # Note que nós não precisamos declarar a variável
echo Ola, $Nome
# Nós temos a estrutura if normal:
# use 'man test' para mais infomações para as condicionais
# use 'man test' para mais informações para as condicionais
if [ $Nome -ne $USER ]
then
echo "Seu nome não é o seu username"
@@ -109,7 +109,7 @@ then
echo "Isso vai rodar se $Nome é Daniela ou Jose."
fi
# Expressões são denotadas com o seguinte formato
# Expressões são escritas com o seguinte formato
echo $(( 10 + 5))
# Diferentemente das outras linguagens de programação, bash é um shell, então ele
@@ -118,9 +118,9 @@ echo $(( 10 + 5))
ls
#Esse comando tem opções que controlam sua execução
ls -l # Lista todo arquivo e diretorio em linhas separadas
ls -l # Lista todo arquivo e diretório em linhas separadas
# Os resultados do comando anterior pode ser passado para outro comando como input.
# Os resultados do comando anterior podem ser passados para outro comando como input.
# O comando grep filtra o input com o padrão passado. É assim que listamos apenas
# os arquivos .txt no diretório atual:
ls -l | grep "\.txt"
@@ -241,7 +241,7 @@ head -n 10 arquivo.txt
sort arquivo.txt
# reporta ou omite as linhas repetidas, com -d você as reporta
uniq -d arquivo.txt
# exibe apenas a primeira coluna após o caráctere ','
# exibe apenas a primeira coluna após o caractere ','
cut -d ',' -f 1 arquivo.txt
# substitui todas as ocorrencias de 'okay' por 'legal' em arquivo.txt (é compativel com regex)
sed -i 's/okay/legal/g' file.txt

View File

@@ -382,3 +382,6 @@ Clojuredocs.org tem documentação com exemplos para quase todas as funções pr
Clojure-doc.org tem um bom número de artigos para iniciantes:
[http://clojure-doc.org/](http://clojure-doc.org/)
Clojure for the Brave and True é um livro de introdução ao Clojure e possui uma versão gratuita online:
[https://www.braveclojure.com/clojure-for-the-brave-and-true/](https://www.braveclojure.com/clojure-for-the-brave-and-true/)

View File

@@ -78,15 +78,17 @@ namespace Learning.CSharp
short fooShort = 10000;
ushort fooUshort = 10000;
// Integer - 32-bit integer
// Integer - inteiro de 32 bits
int fooInt = 1; // (-2,147,483,648 <= int <= 2,147,483,647)
uint fooUint = 1; // (0 <= uint <= 4,294,967,295)
//Números por padrão são int ou uint, dependendo do tamanho.
// Long - 64-bit integer
long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807)
ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615)
// Numbers default to being int or uint depending on size.
// L is used to denote that this variable value is of type long or ulong
// Números por padrão são int ou uint dependendo do tamanho.
// L é usado para denotar que o valor da variável é do tipo long ou ulong.
// Double - Double-precision 64-bit IEEE 754 Floating Point
double fooDouble = 123.4; // Precision: 15-16 digits
@@ -308,25 +310,26 @@ on a new line! ""Wow!"", the masses cried";
}
///////////////////////////////////////
// Converting Data Types And Typecasting
// Convertendo Data Types e Typecasting
///////////////////////////////////////
// Converting data
// Convertendo dados
// Convert String To Integer
// this will throw a FormatException on failure
int.Parse("123");//returns an integer version of "123"
// Converter String para Integer
// try parse will default to type default on failure
// in this case: 0
// isso vai jogar um erro FormatException quando houver falha
int.Parse("123");//retorna uma verão em Integer da String "123"
// try parse vai ir por padrão para o typo default quando houver uma falha
// nesse caso: 0
int tryInt;
if (int.TryParse("123", out tryInt)) // Function is boolean
if (int.TryParse("123", out tryInt)) // Função booleana
Console.WriteLine(tryInt); // 123
// Convert Integer To String
// Convert class has a number of methods to facilitate conversions
// Converter Integer para String
// A classe Convert possuí métodos para facilitar as conversões
Convert.ToString(123);
// or
// ou
tryInt.ToString();
// Casting
@@ -407,12 +410,12 @@ on a new line! ""Wow!"", the masses cried";
return result;
}
// You can narrow down the objects that are passed in
// Você pode pode restringir os objetos que são passados
public static void IterateAndPrint<T>(T toPrint) where T: IEnumerable<int>
{
// We can iterate, since T is a IEnumerable
// Nos podemos iterar, desde que T seja um "IEnumerable"
foreach (var item in toPrint)
// Item is an int
// Item é um inteiro
Console.WriteLine(item.ToString());
}
@@ -720,9 +723,9 @@ on a new line! ""Wow!"", the masses cried";
_speed -= decrement;
}
// properties get/set values
// when only data needs to be accessed, consider using properties.
// properties may have either get or set, or both
// propriedade recupera e/ou atribui valores (get/set).
// quando os dados precisam apenas ser acessados, considere o uso de propriedades.
// uma propriedade pode ter "get" ou "set", ou ambos.
private bool _hasTassles; // private variable
public bool HasTassles // public accessor
{

View File

@@ -14,15 +14,15 @@ translators:
lang: pt-br
---
Nos primeiros dias da web não havia elementos visuais, apenas texto puro. Mas com maior desenvolvimento de navegadores da web, páginas web totalmente visuais também se tornaram comuns.
No início da web não havia elementos visuais, apenas texto puro. Mas com maior desenvolvimento de navegadores da web, páginas web totalmente visuais também se tornara comum.
CSS ajuda a manter a separação entre o conteúdo (HTML) e o look-and-feel de uma página web.
CSS ajuda a manter a separação entre o conteúdo (HTML) e o visual de uma página web.
CSS permite atingir diferentes elementos em uma página HTML e atribuir diferentes propriedades visuais para eles.
Este guia foi escrito para CSS2, embora CSS3 está rapidamente se tornando popular.
Este guia foi escrito para CSS2, embora CSS3 esteja rapidamente se tornando popular.
**NOTA:** Porque CSS produz resultados visuais, a fim de aprender, você precisa tentar de tudo em um playground CSS como [dabblet](http://dabblet.com/).
**NOTA:** Porque CSS produz resultados visuais, a fim de aprender, você precisa treinar em um playground CSS como [dabblet](http://dabblet.com/).
O foco principal deste artigo é sobre a sintaxe e algumas dicas gerais.
```css
@@ -42,7 +42,7 @@ Abaixo um elemento de exemplo:
<div class='class1 class2' id='anID' attr='value' otherAttr='pt-br foo bar' />
*/
/* Você pode direciona-lo usando uma das suas classes CSS */
/* Você pode direcioná-lo usando uma das suas classes CSS */
.class1 { }
/* ou ambas as classes! */
@@ -82,9 +82,9 @@ classe div.some [attr $ = 'ue'] {}
/* Você pode selecionar um elemento que é filho de outro elemento */
div.some-parent> .class-name {}
/* Ou um descendente de um outro elemento. As crianças são os descendentes diretos de
   seu elemento pai, apenas um nível abaixo da árvore. Pode ser qualquer descendentes
   nivelar por baixo da árvore. */
/* Ou um descendente de um outro elemento. Os filhos são os descendentes diretos de
   seu elemento pai, apenas um nível abaixo da árvore. Pode ser quaisquer descendentes
   nivelados por baixo da árvore. */
div.some-parent class-name {}
/* Atenção: o mesmo seletor sem espaço tem um outro significado.
@@ -127,7 +127,7 @@ seletor::before {}
seletor::after {}
/* Nos locais apropriados, um asterisco pode ser utilizado como um curinga para selecionar todos
   elemento */
   os elementos */
* {} /* */ Todos os elementos
.parent * {} /* */ todos os descendentes
.parent> * {} /* */ todas as crianças
@@ -181,7 +181,7 @@ seletor {
## Uso
Guardar uma folha de estilo CSS com a extensão `.css`.
Salvar uma folha de estilo CSS com a extensão `.css`.
```xml
<!-- Você precisa incluir o arquivo css no da sua página <head>. Isto é o

View File

@@ -101,7 +101,7 @@ path = shortestPath( (user)-[:KNOWS*..5]-(other) )
Crie consultas
---
Create a new node
Crie um novo nó
```
CREATE (a:Person {name:"Théo Gauchoux"})
RETURN a

View File

@@ -17,7 +17,7 @@ Groovy - Uma linguagem dinâmica para a plataforma Java. [Leia mais aqui.](http:
Prepara-se:
1) Instale a máquina virtual de Groovy - http://gvmtool.net/
2) Intalse o Groovy: gvm install groovy
2) Instale o Groovy: gvm install groovy
3) Inicie o console groovy digitando: groovyConsole
*/

View File

@@ -361,7 +361,7 @@ myObj.myFunc(); // = "Olá mundo!"
var myFunc = myObj.myFunc;
myFunc(); // = undefined
// Inversamente, uma função pode ser atribuída a um objeto e ganhar a acesso
// Inversamente, uma função pode ser atribuída à um objeto e ganhar a acesso
// através do `this`, até mesmo se ela não for chamada quando foi definida.
var myOtherFunc = function(){
return this.myString.toUpperCase();
@@ -416,7 +416,7 @@ myNewObj.myNumber; // = 5
// vai olhar imediatamente para o seu prototype.
// Algumas implementações em JS deixam você acessar o objeto prototype com a
// propriedade mágica `__proto__`. Enquanto isso é util para explicar
// propriedade mágica `__proto__`. Enquanto isso é útil para explicar
// prototypes, não é parte de um padrão; nós vamos falar de algumas formas de
// usar prototypes depois.
@@ -489,7 +489,7 @@ if (0){
}
// Entretanto, esses objetos encapsulados e as funções originais compartilham
// um mesmo prototype, portanto você pode adicionar funcionalidades a uma string,
// um mesmo prototype, portanto você pode adicionar funcionalidades à uma string,
// por exemplo.
String.prototype.firstCharacter = function(){
return this.charAt(0);

View File

@@ -8,7 +8,7 @@ translators:
lang: pt-br
---
Julia é uma linguagem homoiconic funcional focada na computação tecnica. Ao mesmo tempo que ela tem todo o poder dos homoiconic macros, funções de primeira classe, e controle de baixo nivel, Julia é tão facil para aprender e usar quanto Python.
Julia é uma linguagem homoicônica funcional focada na computação técnica. Ao mesmo tempo que ela tem todo o poder dos macros homoicônicos, funções de primeira classe, e controle de baixo nível, Julia é tão fácil para aprender e usar quanto Python.
Este tutorial é baseado no Julia 0.3.

View File

@@ -62,7 +62,7 @@ Svetlana Golubeva}
\newpage
% Muitos artigos de pesquisa possuem um resumo, e pode-se isar comandos
% Muitos artigos de pesquisa possuem um resumo, e pode-se usar comandos
% predefinidos para isso.
% Isso deve aparecer em sua ordem lógica, portanto, após o topo,
% mas antes das seções principais do corpo.

View File

@@ -4,6 +4,7 @@ contributors:
- ["Dan Turkel", "http://danturkel.com/"]
translators:
- ["Miguel Araújo", "https://github.com/miguelarauj1o"]
- ["Monique Baptista", "https://github.com/bfmonique"]
lang: pt-br
filename: learnmarkdown-pt.md
---
@@ -15,19 +16,19 @@ Dê-me feedback tanto quanto você quiser! / Sinta-se livre para a garfar (fork)
puxar o projeto (pull request)
```md
<!-- Markdown é um superconjunto do HTML, de modo que qualquer arvquivo HTML é
um arquivo Markdown válido, isso significa que nós podemos usar elementos HTML
<!-- Markdown é um superconjunto do HTML, de modo que qualquer arquivo HTML é
um arquivo Markdown válido. Isso significa que nós podemos usar elementos HTML
em Markdown, como o elemento de comentário, e eles não serão afetados pelo analisador
de remarcação. No entanto, se você criar um elemento HTML em seu arquivo Markdown, você
não pode usar sintaxe remarcação dentro desse conteúdo do elemento.-->
não pode usar sintaxe de remarcação dentro desse conteúdo do elemento.-->
<!--Markdown também varia de implementação de um analisador para uma próxima.
<!--A maneira como o Markdown é analisado varia de software para software.
Este guia vai tentar esclarecer quando as características são universais, ou quando eles são
específico para um determinado parser -->
específico para um determinado interpretador -->
<!-- Cabeçalhos -->
<!-- Você pode criar elementos HTML <h1> até <h6> facilmente antecedendo o texto
que deseja estar nesse elemento por um número de hashes (#) -->
que deseja estar nesse elemento por um número de cerquilhas (#) -->
# Isto é um cabeçalho <h1>
## Isto é um cabeçalho <h2>
### Isto é um cabeçalho <h3>
@@ -65,7 +66,7 @@ uma ou múltiplas linhas em branco. -->
Este é um parágrafo. Eu estou digitando em um parágrafo, não é legal?
Agora, eu estou no parágrado 2.
Agora, eu estou no parágrafo 2.
... Ainda continuo no parágrafo 2! :)
Eu estou no parágrafo três.
@@ -111,7 +112,7 @@ ou
1. Item um
2. Item dois
3. Tem três
3. Item três
<!-- Você não tem poder para rotular os itens corretamente e a remarcação será ainda
tornar os números em ordem, mas isso pode não ser uma boa idéia -->

View File

@@ -20,7 +20,7 @@ Este documento descreve PHP 5+.
// Duas barras iniciam o comentário de uma linha.
# O hash (aka pound symbol) também inicia, mas // é mais comum.
# O hash (conhecido como "pound symbol") também inicia, mas // é mais comum.
/*
O texto envolto por barra-asterisco e asterisco-barra

View File

@@ -7,15 +7,16 @@ contributors:
- ["Zachary Ferguson", "http://github.com/zfergus2"]
translators:
- ["Paulo Henrique Rodrigues Pinheiro", "http://www.sysincloud.it"]
- ["Monique Baptista", "https://github.com/bfmonique"]
lang: pt-br
filename: learnpython3-pt.py
---
Python foi criado por Guido Van Rossum nos anos 1990. Ele é atualmente uma
das mais populares linguagens em existência. Eu fiquei morrendo de amor
pelo Python por sua clareza sintática. É praticamente pseudocódigo executável.
Python foi criada por Guido Van Rossum nos anos 1990. Ela é atualmente uma
das linguagens mais populares existentes. Eu me apaixonei por
Python por sua clareza sintática. É praticamente pseudocódigo executável.
Suas opiniões são grandemente apreciadas. Você pode encontrar-me em
Opniões são muito bem vindas. Você pode encontrar-me em
[@louiedinh](http://twitter.com/louiedinh) ou louiedinh [em]
[serviço de e-mail do google].
@@ -44,7 +45,7 @@ aprender o velho Python 2.7.
8 - 1 # => 7
10 * 2 # => 20
# Números inteiros por padrão, exceto na divisão, que retorna número
# Números são inteiros por padrão, exceto na divisão, que retorna número
# de ponto flutuante (float).
35 / 5 # => 7.0
@@ -64,7 +65,7 @@ aprender o velho Python 2.7.
# Exponenciação (x**y, x elevado à potência y)
2**4 # => 16
# Determine a precedência usando parêntesis
# Determine a precedência usando parênteses
(1 + 3) * 2 # => 8
# Valores lógicos são primitivos (Atenção à primeira letra maiúscula)
@@ -105,9 +106,8 @@ False or True # => True
1 < 2 < 3 # => True
2 < 3 < 2 # => False
# (operador 'is' e operador '==') is verifica se duas variáveis
# referenciam um mesmo objeto, mas == verifica se as variáveis
# apontam para o mesmo valor.
# 'is' verifica se duas variáveis representam o mesmo endereço
# na memória; '==' verifica se duas variáveis têm o mesmo valor
a = [1, 2, 3, 4] # Referência a uma nova lista, [1, 2, 3, 4]
b = a # b referencia o que está referenciado por a
b is a # => True, a e b referenciam o mesmo objeto
@@ -174,7 +174,7 @@ input_string_var = input("Digite alguma coisa: ") # Retorna o que foi digitado e
# Observação: Em versões antigas do Python, o método input() era chamado raw_input()
# Não é necessário declarar variáveis antes de iniciá-las
# È uma convenção usar letras_minúsculas_com_sublinhados
# É uma convenção usar letras_minúsculas_com_sublinhados
alguma_variavel = 5
alguma_variavel # => 5
@@ -182,31 +182,31 @@ alguma_variavel # => 5
# Veja Controle de Fluxo para aprender mais sobre tratamento de exceções.
alguma_variavel_nao_inicializada # Gera a exceção NameError
# Listas armazenam sequencias
# Listas armazenam sequências
li = []
# Você pode iniciar com uma lista com alguns valores
# Você pode iniciar uma lista com valores
outra_li = [4, 5, 6]
# Adicionar conteúdo ao fim da lista com append
# Adicione conteúdo ao fim da lista com append
li.append(1) # li agora é [1]
li.append(2) # li agora é [1, 2]
li.append(4) # li agora é [1, 2, 4]
li.append(3) # li agora é [1, 2, 4, 3]
# Remover do final da lista com pop
# Remova do final da lista com pop
li.pop() # => 3 e agora li é [1, 2, 4]
# Vamos colocá-lo lá novamente!
li.append(3) # li agora é [1, 2, 4, 3] novamente.
# Acessar uma lista da mesma forma que você faz com um array
# Acesse uma lista da mesma forma que você faz com um array
li[0] # => 1
# Acessa o último elemento
# Acessando o último elemento
li[-1] # => 3
# Acessando além dos limites gera um IndexError
# Acessar além dos limites gera um IndexError
li[4] # Gera o IndexError
# Você pode acessar vários elementos com a sintaxe de limites
# (É um limite fechado, aberto pra você que gosta de matemática.)
# Inclusivo para o primeiro termo, exclusivo para o segundo
li[1:3] # => [2, 4]
# Omitindo o final
li[2:] # => [4, 3]

View File

@@ -132,7 +132,7 @@ body {
background-color: $primary-color
}
/* Ap compilar ficaria assim: */
/* Após compilar ficaria assim: */
div {
display: block;
margin-left: auto;
@@ -184,13 +184,13 @@ button
/* Funções
==============================*/
/* Funções no Stylus permitem fazer uma variedade de tarefas, como por exemplo, menipular algum dado. */
/* Funções no Stylus permitem fazer uma variedade de tarefas, como por exemplo, manipular algum dado. */
body {
background darken(#0088DD, 50%) // Escurece a cor #0088DD em 50%
}
/** Criando sua própria função */
/* Criando sua própria função */
somar(a, b)
a + b
@@ -221,7 +221,7 @@ for <val-name> [, <key-name>] in <expression>
for $item in (1..2) /* Repete o bloco 12 vezes */
.col-{$item}
width ($item / 12) * 100% /* Calcula a largula pelo número da coluna*
width ($item / 12) * 100% /* Calcula a largura pelo número da coluna*
```

View File

@@ -10,7 +10,7 @@ lang: pt-br
Typescript é uma linguagem que visa facilitar o desenvolvimento de aplicações em grande escala escritos em JavaScript.
Typescript acrescenta conceitos comuns como classes, módulos, interfaces, genéricos e (opcional) tipagem estática para JavaScript.
É um super conjunto de JavaScript: todo o código JavaScript é o código do texto dactilografado válido para que possa ser adicionados diretamente a qualquer projeto. O compilador emite typescript JavaScript.
É um super conjunto de JavaScript: todo o código JavaScript é TypeScript válido então ele pode ser adicionado diretamente a qualquer projeto. O compilador emite typescript JavaScript.
Este artigo irá se concentrar apenas em texto datilografado sintaxe extra, ao contrário de [JavaScript](javascript-pt.html.markdown).
@@ -22,7 +22,7 @@ var isDone: boolean = false;
var lines: number = 42;
var name: string = "Anders";
// Quando é impossível saber, há o "Qualquer" tipo
// Quando é impossível saber, há o tipo "Qualquer"
var notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // Ok, definitivamente um boolean
@@ -65,7 +65,7 @@ interface Person {
move(): void;
}
// Objeto que implementa a "Pessoa" Interface
// Objeto que implementa a Interface "Pessoa"
// Pode ser tratado como uma pessoa desde que tem o nome e mover propriedades
var p: Person = { name: "Bobby", move: () => {} };
// Os objetos que têm a propriedade opcional:

View File

@@ -11,10 +11,10 @@ lang: pt-br
YAML é uma linguagem de serialização de dados projetado para ser diretamente gravável e
legível por seres humanos.
É um superconjunto de JSON, com a adição de indentação e quebras de linhas sintaticamente significativas, como Python. Ao contrário de Python, entretanto, YAML não permite o caracter literal tab para identação.
É um superconjunto de JSON, com a adição de identação e quebras de linhas sintaticamente significativas, como Python. Ao contrário de Python, entretanto, YAML não permite o caracter literal tab para identação.
```yaml
# Commentários em YAML são como este.
# Comentários em YAML são como este.
###################
# TIPOS ESCALARES #
@@ -33,7 +33,7 @@ chave com espaco: valor
porem: "Uma string, entre aspas."
"Chaves podem estar entre aspas tambem.": "É útil se você quiser colocar um ':' na sua chave."
# Seqüências de várias linhas podem ser escritos como um 'bloco literal' (utilizando |),
# Seqüências de várias linhas podem ser escritas como um 'bloco literal' (utilizando |),
# ou em um 'bloco compacto' (utilizando '>').
bloco_literal: |
Todo esse bloco de texto será o valor da chave 'bloco_literal',
@@ -76,7 +76,7 @@ um_mapa_aninhado:
# também permite tipos de coleção de chaves, mas muitas linguagens de programação
# vão reclamar.
# Sequências (equivalente a listas ou arrays) semelhante à isso:
# Sequências (equivalente a listas ou arrays) semelhante a isso:
uma_sequencia:
- Item 1
- Item 2
@@ -118,7 +118,7 @@ datetime: 2001-12-15T02: 59: 43.1Z
datetime_com_espacos 2001/12/14: 21: 59: 43.10 -5
Data: 2002/12/14
# A tag !!binary indica que a string é na verdade um base64-encoded (condificado)
# A tag !!binary indica que a string é na verdade um base64-encoded (codificado)
# representação de um blob binário.
gif_file: !!binary |
R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5