[
  {
    "path": ".github/workflows/deploy.yaml",
    "content": "name: DartGuide Deploy\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - 'website/**'\n\njobs:\n  build_deploy:\n    runs-on: ubuntu-latest\n    name: Deploy dartguide.dev\n    defaults:\n      run:\n        working-directory: ./website\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      - name: Setup node\n        uses: actions/setup-node@v2\n        with:\n          node-version: '16'\n\n      - name: Install\n        run: npm ci\n\n      - name: Build\n        run: npm run build\n\n      - name: Deploy\n        uses: JamesIves/github-pages-deploy-action@4.1.4\n        with:\n          branch: gh-pages\n          folder: ./website/public\n"
  },
  {
    "path": ".gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n\n# Mac\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# IntelliJ\n.idea\n.vscode"
  },
  {
    "path": "CNAME",
    "content": "dartguide.dev"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\" width=\"100%\">\n    <img width=\"50%\" src=\"https://github.com/JHBitencourt/dart-book/blob/master/website/src/images/promotional_cover_big.png\">\n</p>\n\n\n\n- Informações do livro em [dartguide.dev](http://dartguide.dev)\n- [Sumário completo](https://dartguide.dev/table-of-contents/)\n- Página do livro na [Casa do Código](https://www.casadocodigo.com.br/products/livro-dart)\n\nNeste repositório você encontrará todos os códigos de exemplos do livro.\nAssim como todas as respostas de desafios propostos organizadas nas [issues](https://github.com/JHBitencourt/dart-book/issues).\n\n#### Para acesso rápido aos códigos:\n\n1. [Sessão \"Ná Prática\"](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/na_pratica)\n2. [Sessão \"É com você\"](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/e_com_voce)\n3. [Capítulo 1](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/01_capitulo)\n4. [Capítulo 2](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/02_capitulo)\n5. [Capítulo 3](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/03_capitulo)\n6. [Capítulo 4](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/04_capitulo)\n7. [Capítulo 5](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/05_capitulo)\n8. [Capítulo 6](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/06_capitulo)\n9. [Capítulo 7](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/07_capitulo)\n10. [Capítulo 8](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/08_capitulo)\n11. [Capítulo 9](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/09_capitulo)\n12. [Capítulo 10](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/10_capitulo)\n13. [Capítulo 11](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/11_capitulo)\n14. [Capítulo 12](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/12_capitulo)\n15. [Capítulo 13](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/13_capitulo)\n16. [Capítulo 14](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/14_capitulo)\n17. [Capítulo 15](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/15_capitulo)\n"
  },
  {
    "path": "code/pt_Br/01_capitulo/01_primeiro_programa/main.dart",
    "content": "// Primeiro programa o/\nmain() {\n  print('Hello World!');\n}"
  },
  {
    "path": "code/pt_Br/01_capitulo/02_erro_main/main.dart",
    "content": "// Tente executar esse arquivo\n// Você deverá ver o erro:\n// Dart_LoadScriptFromKernel: The binary program does not contain 'main'.\nsemMain() {\n  print('Hello World!');\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/01_operadores_aritmeticos/main.dart",
    "content": "void main() {\n  print(40 + 2); // > 42\n  print('40' + '2'); // > 402\n  print(50 - 8); // > 42\n  print(-(-42)); // > 42\n  print(6 * 7); // > 42\n  print(11 / 2); // > 5.5\n  print(11 ~/ 2); // > 5\n  print(11 % 2); // > 1\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/02_operadores_relacionais_equalidade/main.dart",
    "content": "void main() {\n  print(42 == 42); // > true\n  print(42 != 42); // > false\n  print(42 > 42); // > false\n  print(42 >= 42); // > true\n  print(42 < 42); // > false\n  print(42 <= 42); // > true\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/03_operadores_logicos/main.dart",
    "content": "void main() {\n  print(42 == 42 && 42 <= 10); // > false\n  print((42 == 42 && 42 <= 10) || 42 != 42); // > false\n  print(!(42 == 42 && 42 <= 10) || 42 != 10); // > true\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/04_operador_bit_and/main.dart",
    "content": "void main() {\n  var and = 42 & 27;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(27.toRadixString(2).padLeft(8, '0')); // > 00011011\n  print(and); // > 10\n  print(and.toRadixString(2).padLeft(8, '0')); // > 00001010\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/05_operador_bit_or/main.dart",
    "content": "void main() {\n  var or = 42 | 27;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(27.toRadixString(2).padLeft(8, '0')); // > 00011011\n  print(or); // > 59\n  print(or.toRadixString(2).padLeft(8, '0')); // > 00111011\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/06_operador_bit_xor/main.dart",
    "content": "void main() {\n  var xor = 42 ^ 27;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(27.toRadixString(2).padLeft(8, '0')); // > 00011011\n  print(xor); // > 49\n  print(xor.toRadixString(2).padLeft(8, '0')); // > 00110001\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/07_operador_bit_not/main.dart",
    "content": "void main() {\n  var not = ~42;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(not); // > -43\n  print(not.toRadixString(2)); // > -101011\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/08_operador_bit_shift_direita/main.dart",
    "content": "void main() {\n  var shift = 42 >> 1;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(shift); // > 21\n  print(shift.toRadixString(2).padLeft(8, '0')); // > 00010101\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/09_operador_bit_shift_esquerda/main.dart",
    "content": "void main() {\n  var shift = 42 << 2;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(shift); // > 168\n  print(shift.toRadixString(2).padLeft(8, '0')); // > 10101000\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/10_operador_bit_shift_direita_unsigned/main.dart",
    "content": "void main() {\n  var shift = -42 >>> 1;\n  print((-42).toRadixString(2).padLeft(8, '0')); // > 0-101010\n  print(shift); // > 9223372036854775787\n  print(shift.toRadixString(2));\n  // > 111111111111111111111111111111111111111111111111111111111101011\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/11_operador_atribuicao/main.dart",
    "content": "void main() {\n  num a = 4;\n  print(a); // > 4\n  a += 5;\n  print(a); // > 9\n  a -= 4;\n  print(a); // > 5\n  a %= 2;\n  print(a); // > 1\n  a *= 11;\n  print(a); // > 11\n  a /= 5;\n  print(a); // > 2.2\n  a ~/= 2;\n  print(a); // > 1\n  int b = 1;\n  b <<= 4;\n  print(b); // > 16\n  b |= 42;\n  print(b); // > 58\n  b &= 60;\n  print(b); // > 56\n  b ^= 42;\n  print(b); // > 18\n  b >>= 1;\n  print(b); // > 9\n  b >>>= 1;\n  print(b); // > 4\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/12_operador_incremento_decremento_1/main.dart",
    "content": "void main() {\n  var a = 0;\n  var b = 1 + ++a; // 1 + 1\n  print(a); // > 1\n  print(b); // > 2\n  var c = 0;\n  var d = 1 + --c; // 1 + -1\n  print(c); // > -1\n  print(d); // > 0\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/13_operador_incremento_decremento_2/main.dart",
    "content": "void main() {\n  var a = 0;\n  var b = 1 + a++; // 1 + 0\n  print(a); // > 1\n  print(b); // > 1\n  var c = 0;\n  var d = 1 + c--; // 1 + 0\n  print(c); // > -1\n  print(d); // > 1\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/14_operador_validacao_tipo_1/main.dart",
    "content": "void main() {\n  num a = 42;\n\n  // Ao descomentar a linha abaixo irá produzir um erro de cast de tipo inválido\n  // a = 42.5;\n\n  print((a as int).bitLength); // > 6\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/15_operador_validacao_tipo_2/main.dart",
    "content": "void main() {\n  num a = 42.5;\n\n  // O operador is permite validar o tipo para evitar erros de cast\n  if (a is int) {\n    print((a as int).bitLength);\n  }\n\n  if (a is! int) {\n    print('Não é inteiro'); // > Não é inteiro\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/16_operador_cascade/main.dart",
    "content": "// Sem o operador cascade:\n// final frase = StringBuffer();\n// frase.write('Operação ');\n// frase.write('em ');\n// frase.write('cascade.');\n\nvoid main() {\n  final frase = StringBuffer()\n    ..write('Operação ')\n    ..write('em ')\n    ..write('cascade.');\n  print(frase); // > Operação em cascade.\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/17_operador_spread/main.dart",
    "content": "void main() {\n  final vogais = ['a', 'e', 'i'];\n  final consoantes = ['b', 'c', 'd'];\n  final alfabeto = [...vogais, ...consoantes];\n  print(alfabeto); // > [a, e, i, b, c, d]\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/18_operador_ternario/main.dart",
    "content": "void main() {\n  int numero = 42;\n  print(numero % 2 == 0 ? 'par' : 'ímpar'); // > par\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/19_operador_acesso/main.dart",
    "content": "void main() {\n  final map = {\n    'vogais': 'a,e,i,o,u',\n    'consoantes': 'b,c,d,...',\n  };\n  final vogais = ['a', 'e', 'i', 'o', 'u'];\n  print(vogais[0]); // > a\n  print(vogais[4]); // > u\n  print(map['vogais']); // > a,e,i,o,u\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/20_operador_ternario_nulo/main.dart",
    "content": "void main() {\n  int? a = null;\n  var resposta = a ?? 42;\n  print(resposta); // > 42\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/21_operador_atribuicao_nulo/main.dart",
    "content": "void main() {\n  int? resposta = null;\n  resposta ??= 42;\n  print(resposta); // > 42\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/22_operador_acesso_nulo/main.dart",
    "content": "void main() {\n  int? resposta = null;\n  print(resposta?.bitLength); // > null\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/23_operador_cascade_nulo/main.dart",
    "content": "void main() {\n  StringBuffer? frase = null;\n  frase?..write('Operação ')\n    ..write('em ')\n    ..write('cascade.');\n  print(frase); // > null\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/24_operador_acesso_itens_nulo/main.dart",
    "content": "void main() {\n  List<String>? vogais;\n  print(vogais?[1]); // > null\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/25_operador_bang/main.dart",
    "content": "void main() {\n  List<String>? vogais;\n  print(vogais![1]);\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/26_precedencia_operadores/main.dart",
    "content": "void main() {\n  print(1+6/2*3-6); // > 4\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/27_if_else/main.dart",
    "content": "void main() {\n  var resposta = 20;\n  if (resposta != 42) {\n    print('A resposta está errada'); // > A resposta está errada\n  } else {\n    print('A resposta está correta');\n  }\n\n  var imc = 25.1;\n  if (imc < 18.5) {\n    print('Abaixo do peso');\n  } else if (imc >= 18.5 && imc < 24.9) {\n    print('Peso normal ideal');\n  } else if (imc >= 24.9 && imc < 29.9) {\n    print('Sobrepeso'); // > Sobrepeso\n  } else {\n    print('Obesidade');\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/28_switch_case/main.dart",
    "content": "void main() {\n  var estacao = 'Verão';\n  switch (estacao) {\n    case 'Outono':\n    case 'Verão':\n      print('Tá calor'); // > Tá calor\n      break;\n    case 'Inverno':\n      print('Tá frio');\n      break;\n    default:\n      print('Tá bom..');\n  }\n\n  var dia = 'Domingo';\n  switch (dia) {\n    segunda:\n    case 'Segunda':\n      print('Aff, já é segunda..');\n      break;\n    case 'Terça':\n      print('Usando um feitiço do tempo..');\n      continue sexta;\n    case 'Quarta':\n    case 'Quinta':\n      throw 'Meio da semana';\n    sexta:\n    case 'Sexta':\n      print('Sexxxxtou!');\n      break;\n    case 'Sábado':\n      return;\n    case 'Domingo':\n      print('Aproveitando enquanto dá..');\n      continue segunda;\n    default:\n      print('Esse dia não existe..');\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/29_switch_case_patterns/main.dart",
    "content": "void main() {\n  var nota = 8;\n  switch (nota) {\n    case 0:\n      print('Sério?');\n    case 1 || 2 || 3:\n      print('Estudar mais, urgente!');\n    case >= 4 && <= 6:\n      print('Tá quase lá..');\n    case > 6 && <= 8:\n      print('Tá na média!'); // > Tá na média\n    case > 8 when nota <= 10:\n      print('GOAT!');\n    default:\n      print('Nota inválida');\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/30_switch_case_expressions/main.dart",
    "content": "void main() {\n  var nota = 9;\n  var mensagem = switch (nota) {\n    0 => 'Sério?',\n    1 || 2 || 3 => 'Estudar mais, urgente!',\n    >= 4 && <= 6 => 'Tá quase lá..',\n    > 6 && <= 8 => 'Tá na média!',\n    > 8 when nota <= 10 => 'GOAT!',\n    _ => 'Nota inválida'\n  };\n  print(mensagem); // > GOAT! \n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/31_if_case/main.dart",
    "content": "void main() {\n  var coordenadas = [10, 42];\n  if (coordenadas case [int x, int y]) {\n    print('Coordenadas: (x:$x,y:$y)'); // > Coordenadas: (x:10,y:42)\n  } else {\n    print('Coordenadas inválidas');\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/32_if_case_when/main.dart",
    "content": "void main() {\n  var coordenadas = [10, -42];\n  if (coordenadas case [int x, int y] when x >= 0 && y >= 0) {\n    print('Coordenadas: (x:$x,y:$y)');\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/33_while/main.dart",
    "content": "void main() {\n  var index = 0;\n  while(index < 3) {\n    print(index);\n    index++;\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/34_do_while/main.dart",
    "content": "void main() {\n  do {\n    print('Executado'); // > Executado\n  } while (false);\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/35_for/main.dart",
    "content": "void main() {\n  for(var i = 0; i <= 10; i = i+2) {\n    print(i); // > 0 2 4 6 8 10\n  }\n\n  // for com continue e break\n  for (var i = 0; i <= 10; i++) {\n    if (i % 2 == 0) continue;\n    if (i > 7) break;\n    print(i); // > 1 3 5 7\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/36_for_nomeado/main.dart",
    "content": "void main() {\n  forDeFora:\n  for (var i = 0; i <= 2; i++) {\n    print('forDeFora $i');\n    for (var j = 0; j <= 2; j++) {\n      if (j >= 1 || i == 1) continue forDeFora;\n      print('forDeDentro $j');\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/37_for_in/main.dart",
    "content": "void main() {\n  final vogais = ['a', 'e', 'i', 'o', 'u'];\n  for(final vogal in vogais) {\n    if(vogal == 'e') continue;\n    if(vogal == 'u') break;\n    print(vogal); // > a i o\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/38_assert/main.dart",
    "content": "void main() {\n  final vogais = ['a', 'e', 'i', 'o', 'u', 'j'];\n  assert(vogais.length == 5, 'Só deveriam existir 5 vogais!');\n}"
  },
  {
    "path": "code/pt_Br/03_capitulo/01_coercao/main.dart",
    "content": "// Coerção implícita em javascript:\n// var a = \"Resposta: \" + 42;\n// console.log(a); // >\t\"Resposta:\t42\"\n\nvoid main() {\n  var a = 'Resposta:' + 42.toString();\n  print(a); // > Resposta: 42\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/02_dart_analyzer_1/main.dart",
    "content": "bool erro = true;\n\nvoid main() {\n  // O analisador de dart apontará um erro no código abaixo:\n  erro = 'false';\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/03_dart_analyzer_2/main.dart",
    "content": "bool erro = true;\n\nvoid main() {\n  erro as String;\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/04_inferencia_tipo/main.dart",
    "content": "void main() {\n  int continentes = 6;\n  print(continentes.runtimeType); // > int\n  var planetas = 8;\n  print(planetas.runtimeType); // > int\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/05_inferencia_tipo_parametros/main.dart",
    "content": "void main() {\n  var somaInt = soma(1, 2);\n  var somaString = soma('1', '2');\n  print('$somaInt: ${somaInt.runtimeType}'); // > 3: int\n  print('$somaString: ${somaString.runtimeType}'); // > 12: String\n}\n\nsoma(a, b) => a + b;\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/06_dynamic/main.dart",
    "content": "void main() {\n  dynamic objeto = 42;\n  // Uma exceção será lançada em tempo de execução:\n  objeto.metodoQueNemExiste(); // > NoSuchMethodError\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/07_numeros/main.dart",
    "content": "void main() {\n  int a = 5;\n  double b = 8.2;\n  double c = 1;\n  num x = (a * b) + c;\n  print('Resultado: $x'); // > Resultado: 42\n  print('a: ${a.runtimeType}'); // > a: int\n  print('b: ${b.runtimeType}'); // > b: double\n  print('x: ${x.runtimeType}'); // > x: double\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/08_booleanos/main.dart",
    "content": "void main() {\n  bool verdadeiro = true;\n  bool falso = false;\n  bool primeiroMaior = 'Esse é muito maior'.length > 'Esse é grande'.length;\n  print('Primeiro é maior? ${primeiroMaior && (verdadeiro || falso)}');\n  // > Primeiro é maior? true\n  print('verdadeiro: ${verdadeiro.runtimeType}');\n  // > verdadeiro: bool\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/09_symbols/main.dart",
    "content": "void main() {\n  var mod = #modificador;\n  print(#modificador); // > Symbol(\"modificador\")\n  print(mod); // > Symbol(\"modificador\")\n  print('mod: ${mod.runtimeType}'); // > mod: Symbol\n}"
  },
  {
    "path": "code/pt_Br/03_capitulo/10_null_safety/main.dart",
    "content": "// A null-safety em Dart não permite que o código abaixo compile\nvoid main() {\n  int valor;\n  print(valor.isEven);\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/11_nullable_types/main.dart",
    "content": "void main() {\n  printNome('Douglas', 'Adams');\n  printNome('Douglas', null);\n}\n\nvoid printNome(String nome, String? sobrenome) {\n  print('$nome $sobrenome');\n}\n\nvoid valorImpar(int numero) {\n  print(numero.isEven);\n}\n// O compilador não permite acessar as propriedades dos tipos em tipos nullable:\n// void valorImparNullable(int? numero) {\n//   print(numero.isEven);\n// }"
  },
  {
    "path": "code/pt_Br/03_capitulo/12_type_promotion/main.dart",
    "content": "void main() {\n  print(textoGrande(42));\n  print(textoGrande('Este tem que ser um texto muito grande com mais de 120 '\n      'caracteres para que a função retorne verdadeiro. Parabéns pra você'\n      'que está lendo esse livro. :) S2 '));\n}\n\nbool textoGrande(Object objeto) {\n  if (objeto is String) {\n    return objeto.length > 120;\n  } else {\n    return false;\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/13_type_promotion_nullable/main.dart",
    "content": "void main() {\n  print(letrasNome('Julio', 'Bitencourt'));\n  print(letrasNome('Julio', null));\n\n  print(letrasNome2('Julio', 'Bitencourt'));\n  print(letrasNome2('Julio', null));\n}\n\nList<String> letrasNome(String nome, String? sobrenome) {\n  var letras = nome.split('');\n  if (sobrenome != null) {\n    letras.addAll(sobrenome.split(''));\n  }\n  return letras;\n}\n\nList<String> letrasNome2(String nome, String? sobrenome) {\n  var letras = nome.split('');\n  if (sobrenome == null) return letras;\n  letras.addAll(sobrenome.split(''));\n  return letras;\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/14_operador_bang/main.dart",
    "content": "String? nome;\n\nvoid main() {\n  nome = 'Julio';\n\n  // Erro de compilação, afinal nome é uma variável global:\n  // if (nome != null) print(nome.length);\n\n  // Acessando com operador de cast\n  if (nome != null) print((nome as String).length);\n\n  // Acessando com o bang\n  if (nome != null) print(nome!.length);\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/15_strings/main.dart",
    "content": "void main() {\n  //String('Erro'); // Sem construtor default\n  var a = '42'; // Forma literal\n  print(a); // > 42\n  print(a.codeUnits); // > [52, 50]\n  print(String.fromCharCode(52)+String.fromCharCode(50)); // > 42\n}"
  },
  {
    "path": "code/pt_Br/03_capitulo/16_surrogate_pairs/main.dart",
    "content": "void main() {\n  var spock = '\\u{1f596}';\n  print(spock); // Imprime o símbolo\n  print(spock.length); // > 2\n  print(spock.codeUnits); // > [55357, 56726]\n  print(spock.runes); // > (128406)\n  print(String.fromCharCode(55357) + String.fromCharCode(56726));\n  // Imprime o símbolo\n}"
  },
  {
    "path": "code/pt_Br/03_capitulo/17_criacao_strings/main.dart",
    "content": "void main() {\n  print(\"Aspas duplas com 'aspas simples'\");\n  // > Aspas duplas com 'aspas simples'\n  print('Aspas simples com \"aspas duplas\"');\n  // > Aspas simples com \"aspas duplas\"\n  print('''Mais de \n    uma linha''');\n  print(r'Unicode = \\u{1f596}'); // > Unicode = \\u{1f596}\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/18_interpolacao_strings/main.dart",
    "content": "var resposta = 42;\n\nvoid main() {\n  print('''A resposta para a vida\n    o universo\n    e tudo mais é: $resposta''');\n  print('42 * 42 = ${resposta * resposta}'); // > 42 * 42 = 1764\n  print('Variável: = \\$resposta'); // > Variável: = $resposta\n  print(r'Variável: = $resposta'); // > Variável: = $resposta\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/19_otimizacao_strings/main.dart",
    "content": "var elonUm = 'Elon Musk';\nvar elonDois = 'Elon Musk';\nvar jeff = 'Jeff Bezos';\n\nvoid main() {\n  print(elonUm == jeff); // > false\n  print(identical(elonUm, jeff)); // > false\n  print(elonUm == elonDois); // > true\n  print(identical(elonUm, elonDois)); // > true\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/20_strings_sob_demanda/main.dart",
    "content": "void main() {\n  print('Dart' + ' é ' + 'incrível!'); // > Dart é incrível!\n  print('Dart' ' é ' 'incrível!'); // > Dart é incrível!\n  var buffer = StringBuffer();\n  buffer.write('Dart é');\n  buffer.write(' incrível!');\n  buffer.writeAll(['E esse', ' livro ', 'também!']);\n  print(buffer); // > Dart é incrível!E esse livro também!\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/21_strings_geral/main.dart",
    "content": "String e = 'Douglas Adams';\n\nvoid main() {\n  print('Vazio: ${e.isEmpty}'); // > Vazio: false\n  print(\"Adicionando à esquerda '>': ${e.padLeft(15, '>')}\");\n  // > Adicionando à esquerda '>': >>Douglas Adams\n  print(\"Adicionando à direita '<': ${e.padRight(16, '<')}\");\n  // > Adicionando à direita '<': Douglas Adams<<<\n  print(\"Mudar todos 'a' para 'e': ${e.replaceAll('a', 'e')}\");\n  // > Mudar todos 'a' para 'e': Dougles Adems\n  print(\"Mudar primeiro 'a' para 'e': ${e.replaceFirst('a', 'e')}\");\n  // > Mudar primeiro 'a' para 'e': Dougles Adams\n  print(\"Dividindo: ${e.split(\" \")[0]}\"); // > Dividindo: Douglas\n  print(\"Dividindo: ${e.split(\" \")[1]}\"); // > Dividindo: Adams\n  print('''Matching:\n    Contém 'gl': ${e.contains(\"gl\")}\n    Termina com 'Adams': ${e.endsWith(\"Adams\")}\n    Começa com 'D': ${e.startsWith(\"d\".toUpperCase())}''');\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/22_variaveis_var/main.dart",
    "content": "var pi = 3.14;\ndouble y = pi;\nvar x = 'Arquimedes';\nString? matematico;\n\nvoid main() {\n  //x = y; // Erro, x já possui o tipo String.\n  matematico = x;\n  print(matematico); // > Arquimedes\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/23_variaveis_static/main.dart",
    "content": "//static var global = 'String global'; // Erro\nclass Livro {\n  static int instancias = 0;\n\n  Livro() {\n    instancias++;\n  }\n\n  String autor = 'Douglas Adams';\n}\n\nvoid main() {\n  print('Instâncias: ${Livro.instancias}');\n  Livro();\n  Livro();\n  print('Autor: ${Livro().autor}');\n  print('Instâncias: ${Livro.instancias}');\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/24_variaveis_final_const/main.dart",
    "content": "// const double pi =  3.14;\nconst pi = 3.14;\n// final double circunferencia = 2 * pi;\nfinal circunferencia = 2 * pi;\n\n/// O código abaixo produz um erro de compilação, afinal variáveis const\n/// são definidas em tempo de compilação, enquanto final são em tempo de execução\n// final pi =  3.14;\n// const circunferencia = 2 * pi;\n\n/// Lista com valores constantes:\nvar valoresConstantes = const [1, 2, 3];\n\nfinal listFinal = [1, 2, 3];\nconst listConst = [1, 2, 3];\n\nvoid main() {\n  /// Objetos constantes são canonicalizados:\n  var a = getValorCanonicalizado();\n  var b = getValorCanonicalizado();\n  print('A e B são os mesmos objetos? ${identical(a, b)}');\n  // > 'A e B são os mesmos objetos? true'\n\n  /// Objetos constantes são imutáveis, não é permitido adicionar valores em uma\n  /// lista constante:\n  listFinal[0] = 4; // é permitido\n  // listConst[0] = 4; // erro de execução\n}\n\nList getValorCanonicalizado() => const [4, 5, 6];\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/25_variaveis_late/main.dart",
    "content": "class Pizza {\n  // int pedacos;\n  late int pedacos;\n\n  void media() {\n    pedacos = 8;\n  }\n\n  void grande() {\n    pedacos = 16;\n  }\n\n  String servir() => '$pedacos pedaços servidos!';\n}\n\nvoid main() {\n  final pizza = Pizza();\n  pizza.media();\n  print(pizza.servir()); // > 8 pedaços servidos!\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/01_fatorial/main.dart",
    "content": "void main() {\n  print(fatorial(4));\n  print(fatorial(0));\n  print(fatorial(42));\n}\n\nint fatorial(int numero) {\n  if (numero == 0) return 1;\n  var resultado = 1;\n  for (var i = 1; i <= numero; i++) {\n    resultado *= i;\n  }\n  return resultado;\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/02_escopo/main.dart",
    "content": "var escopoGlobal = 'global';\n\nvoid main() {\n  var escopoMain = 'escopoMain';\n  a() {\n    var escopoDentro = 'escopoA';\n    print('a: $escopoGlobal - $escopoMain - $escopoDentro');\n    b() {\n      var escopoDentro = 'escopoB';\n      print('b: $escopoGlobal - $escopoMain - $escopoDentro');\n    }\n    b();\n  }\n  c() {\n    a();\n  }\n  c();\n  print('main: $escopoGlobal - $escopoMain');\n}"
  },
  {
    "path": "code/pt_Br/04_capitulo/03_tipo_function/main.dart",
    "content": "var ola = (String nome) {\n  print('Olá $nome');\n};\nFunction hello = (String nome) => print('Olá $nome');\n\nvoid main() {\n  ola('Julio'); // > Olá Julio\n  ola('${ola.runtimeType}'); // > Olá (String) => Null\n\n  hello('Julio'); // > Olá Julio\n  hello('${hello.runtimeType}'); // > Olá (String) => void\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/04_retornos/main.dart",
    "content": "void main() {\n  print(retornoNulo());\n  print(retornoNuloDois());\n  print(retornoString());\n\n  /// Um retorno void não pode ser utilizado:\n  // var objeto = retornoDynamic();\n  // print(objeto);\n}\n\nretornoNulo() {}\n\nretornoNuloDois() {\n  return;\n}\n\nretornoString() {\n  return 'String';\n}\n\nvoid semRetorno() {}\n\nvoid retornoVazio() {\n  return;\n}\n\nvoid retornoDynamic() {\n  dynamic dinamico = 'dynamic';\n  return dinamico;\n}\n\nvoid retornoFuncao() {\n  return print('retornoFuncao');\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/05_never/main.dart",
    "content": "import 'dart:io';\n\nvoid main() {\n  print('Antes de encerrar');\n  exit(0);\n  print('Após encerrar');\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/06_escopo_closure/main.dart",
    "content": "Function criaClosure() {\n  var resposta = 42;\n  return () {\n    resposta++;\n    print(resposta);\n  };\n}\n\nvoid main() {\n  var somaImprime = criaClosure();\n  somaImprime();\n  somaImprime();\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/07_tear_off/main.dart",
    "content": "void main() {\n  final vogais = ['a', 'e', 'i', 'o', 'u'];\n  vogais.forEach((e) {\n    print(e);\n  });\n\n  /// Usando tear-off:\n  vogais.forEach(print);\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/08_parametro_posicional_obrigatorio/main.dart",
    "content": "/// Parâmetros: posicional e obrigatório\nvoid temperaturaEm(String cidade, int? ano, int? mes, int dia) {\n  print('$cidade $dia/$mes/$ano');\n}\n\nvoid main() {\n  temperaturaEm('Floripa', null, 12, 1); // > Floripa 1/12/null\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/09_parametro_posicional_opcional/main.dart",
    "content": "void temperaturaEm(String cidade, [int? ano = 2020, int? mes, int dia = 01]) {\n  print('$cidade $dia/$mes/$ano');\n}\n\nvoid main() {\n  temperaturaEm('Floripa'); // > Floripa 1/null/2020\n  temperaturaEm('Floripa', null); // > Floripa 1/null/null\n  temperaturaEm('Floripa', 2021, 1); // > Floripa 1/1/2021\n  temperaturaEm('Floripa', 2021, 1, 2); // > Floripa 2/1/2021\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/10_parametro_nomeado_opcional/main.dart",
    "content": "void temperaturaEm(String cidade, {int? ano = 2020, int dia = 01, int? mes}) {\n  print('$cidade $dia/$mes/$ano');\n}\n\nvoid main() {\n  temperaturaEm('Floripa', ano: 2021); // > Floripa 1/null/2021\n  temperaturaEm('Floripa', mes: 1); // > Floripa 1/1/2020\n  temperaturaEm('Floripa', mes: 1, dia: 2, ano: null); // > Floripa 2/1/null\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/11_parametro_nomeado_obrigatorio/main.dart",
    "content": "void temperaturaEm(String cidade,\n    {required int dia, required int? mes, int? ano = 2020}) {\n  print('$cidade $dia/$mes/$ano');\n}\n\nvoid main() {\n  temperaturaEm('Floripa', dia: 1, mes: null); // > Floripa 1/null/2020\n  temperaturaEm('Floripa', mes: 1, dia: 12); // > Floripa 12/12/2020\n  temperaturaEm('Floripa', mes: 1, dia: 2, ano: 2021); // > Floripa 2/1/2021\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/12_enums/main.dart",
    "content": "const double G = 6.67300e-11;\n\nenum Planeta {\n  mercurio(3.303e+23, 2.4397e6, aneis: false),\n  venus(4.869e+24, 6.0518e6, aneis: false),\n  terra(5.976e+24, 6.37814e6, aneis: false),\n  marte(6.421e+23, 3.3972e6, aneis: false),\n  jupiter(1.9e+27, 7.1492e7, aneis: true),\n  saturno(5.688e+26, 6.0268e7, aneis: true),\n  urano(8.686e+25, 2.5559e7, aneis: true),\n  netuno(1.024e+26, 2.4746e7, aneis: true);\n\n  const Planeta(this.massa, this.raio, {required this.aneis});\n\n  factory Planeta.planetaComVida() => Planeta.terra;\n\n  final bool aneis;\n  final double massa;\n  final double raio;\n\n  bool get ehAzul => this == Planeta.terra;\n  double gravidadeSuperficial() => G * massa / (raio * raio);\n  double pesoSuperficie(double massaCorpo) =>\n      massaCorpo * gravidadeSuperficial();\n}\n\nvoid main() {\n  print(Planeta.planetaComVida());\n  print(Planeta.marte.ehAzul);\n  final peso = 80 / Planeta.terra.gravidadeSuperficial();\n  for (final p in Planeta.values) {\n    print('Meu peso em ${p.name}: ${p.pesoSuperficie(peso)}kg');\n  }\n}"
  },
  {
    "path": "code/pt_Br/04_capitulo/13_typedef/main.dart",
    "content": "typedef Operacao = Object Function(double a, double b);\n\ndouble somar(double a, double b) {\n  return a + b;\n}\n\nString subtrair(double a, double b) {\n  return (a - b).toString();\n}\n\nObject calcular(double a, double b, Operacao operacao) {\n  return operacao(a, b);\n}\n\nvoid main() {\n  print(calcular(22, 20, somar)); // > 42.0\n  print(calcular(22, 20, subtrair)); // > 2.0\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/01_errors/main.dart",
    "content": "void main() {\n  var lista = <int>[1, 2];\n  for (var i = 0; i <= 2; i++) {\n    print('Atribuindo valor $i no índice $i');\n    lista[i] = i;\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/02_exceptions/main.dart",
    "content": "import 'dart:io';\n\nvoid main() {\n  // Um formato inválido informado resultará em FormatException\n  final dataUsuario = stdin.readLineSync();\n  DateTime.parse(dataUsuario!);\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/03_throw/main.dart",
    "content": "void voar() {\n  throw Exception('Você não tem asas!');\n}\n\nvoid ligarCarro() => throw 'Sem gasolina!';\n\nvoid main() {\n  // voar();\n  ligarCarro();\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/04_exception_customizada/main.dart",
    "content": "class SemGasolinaException implements Exception {\n  final String mensagem;\n\n  const SemGasolinaException(this.mensagem);\n\n  String toString() => 'SemGasolinaException: $mensagem';\n}\n\nvoid ligarCarro() => throw SemGasolinaException('Carro sem gasolina..');\n\nvoid main() {\n  ligarCarro();\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/05_assert/main.dart",
    "content": "void main() {\n  int? id;\n  assert(id != null, 'O id não pode ser nulo.');\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/06_assert_x_error/main.dart",
    "content": "import 'dart:math';\n\nvoid main() {\n  // calcularCircunferencia(-2);\n  calcularCircunferenciaError(-2);\n\n  Motorista('', 14);\n  MotoristaError('', 14);\n}\n\ndouble calcularCircunferencia(double raio) {\n  assert(raio >= 0, 'O raio deve ser positivo.');\n  return 2 * pi * raio;\n}\n\ndouble calcularCircunferenciaError(double raio) {\n  if (raio < 0) throw AssertionError('O raio deve ser positivo.');\n  return 2 * pi * raio;\n}\n\nclass Motorista {\n  final String nome;\n  final int idade;\n\n  const Motorista(this.nome, this.idade)\n      : assert(nome != '', 'O nome não pode ser vazio'),\n        assert(idade >= 18, 'O motorista deve ser maior de idade');\n}\n\nclass MotoristaError {\n  final String nome;\n  final int idade;\n\n  MotoristaError(this.nome, this.idade) {\n    if (nome.isEmpty) throw AssertionError('O nome não pode ser vazio');\n    if (idade < 18) throw AssertionError('O motorista deve ser maior de idade');\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/07_try_catch/main.dart",
    "content": "void comer() => throw Exception('Acabou a comida..');\n\nvoid main() {\n  try {\n    comer();\n    print('Não vai chegar aqui..');\n  } catch (e, s) {\n    print('Exceção capturada: $e');\n    print('Stacktrace: $s');\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/08_try_catch_on/main.dart",
    "content": "void main() {\n  try {\n    DateTime.parse('01/01/2022');\n    // DateTime.parse('2022-01-22');\n  } on FormatException catch (e) {\n    print('O formato deve ser ano-mes-dia.. $e');\n  } catch (e, s) {\n    print('Exceção capturada: $e');\n    print('Stacktrace: $s');\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/09_try_catch_exception/main.dart",
    "content": "void comer() => throw 'Acabou\ta\tcomida..';\n\nvoid main() {\n  try {\n    comer();\n  } on FormatException catch (e) {\n    print('O formato  de data deve ser ano-mes-dia.. $e');\n  } on Exception catch (e, s) {\n    print('Exceção capturada: $e');\n    print('Stacktrace: $s');\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/10_try_catch_finally/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  try {\n    abrirConexao();\n    buscarDados();\n    // fecharConexao();\n  } catch (e, s) {\n    print('Exceção capturada: $e');\n    print('Stacktrace: $s');\n  } finally {\n    fecharConexao();\n  }\n}\n\nvoid abrirConexao() => print('Conexão aberta..');\n\nvoid buscarDados() => throw TimeoutException('Rede lenta..');\n\nvoid fecharConexao() => print('Conexão fechada..');\n"
  },
  {
    "path": "code/pt_Br/06_capitulo/01_codigo_ansi/main.dart",
    "content": "import 'dart:io';\n\nvoid error(Object object) {\n  stdout.writeln('\\x1b[31m[ERROR]\t$object\\x1b[m');\n}\n\nvoid main() {\n  /// O texto será impresso em vermelho no terminal:\n  error('Um texto de erro!');\n}"
  },
  {
    "path": "code/pt_Br/07_capitulo/01_analyzer/main.dart",
    "content": "/// Execute o analyzer neste arquivo e deverá ser apontado 1 erro e nenhuma\n/// melhoria. Afinal, ele não possui um linter configurado.\nclass pessoa {\n  pessoa({this.nome = null});\n\n  final String? nome\n\n  void DizerOi() {\n    print('Olá!\tMe\tchamo\t$nome');\n  }\n}\n\nmain() {\n  final julio = new pessoa(nome: 'Julio');\n  julio.DizerOi();\n}"
  },
  {
    "path": "code/pt_Br/07_capitulo/02_analyzer_linter/analysis_options.yaml",
    "content": "linter:\n  rules:\n    - camel_case_types\n    - non_constant_identifier_names\n    - avoid_init_to_null\n    - always_declare_return_types\n    - unnecessary_new"
  },
  {
    "path": "code/pt_Br/07_capitulo/02_analyzer_linter/main.dart",
    "content": "/// Execute o analyzer neste arquivo e deverá ser apontado 5 melhorias.\n/// Afinal, ele possui o linter configurado em analysis_options.dart\nclass pessoa {\n  pessoa({this.nome = null});\n\n  final String? nome;\n\n  void DizerOi() {\n    print('Olá!\tMe\tchamo\t$nome');\n  }\n}\n\nmain() {\n  final julio = new pessoa(nome: 'Julio');\n  julio.DizerOi();\n}"
  },
  {
    "path": "code/pt_Br/07_capitulo/03_comments/main.dart",
    "content": "// TODO finalizar este método\nvoid imprimirValor() {\n  print(42); // Imprime sempre 42.\n}\n\n/* // TODO finalizar este método\nvoid imprimirValor() {\n  print(42); // Imprime sempre 42.\n  Todo esse trecho de código é tratado como comentário..\n} */\n\n/// Três barras formam um comentário de documentação do código, que é exportado\n/// com o comando `dart doc`.\n///\n/// Código ANSI para resetar a cor do terminal\nconst resetarCor = '\\x1b[m';"
  },
  {
    "path": "code/pt_Br/08_capitulo/01_objeto/main.dart",
    "content": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  void trabalhar() {}\n}\n\nvoid main() {\n  final programador = Programador()..nome = 'Julio Bitencourt';\n  programador.tarefas.add('Terminar livro de Dart');\n\n  print(programador.runtimeType);\n  print(programador.toString());\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/02_to_string/main.dart",
    "content": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  void trabalhar() {}\n\n  @override\n  String toString() => '$nome';\n}\n\nvoid main() {\n  final p1 = Programador()..nome = 'Julio';\n  print(p1); // > Julio\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/03_equalidade/main.dart",
    "content": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  void trabalhar() {}\n\n  @override\n  String toString() => '$nome';\n}\n\nvoid main() {\n  final p1 = Programador()..nome = 'Julio';\n  final p2 = Programador()..nome = 'Julio';\n  print(p1 == p2); // > false\n  print('hash p1: ${p1.hashCode} - hash p2: ${p2.hashCode}');\n  // > hash p1: 624437211 - hash p2: 125619715\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/04_sobrescrita_operadores/main.dart",
    "content": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  void trabalhar() {}\n\n  @override\n  String toString() => '$nome';\n\n  @override\n  bool operator ==(Object other) => other is Programador && nome == other.nome;\n\n  @override\n  int get hashCode => nome.hashCode;\n}\n\nvoid main() {\n  final p1 = Programador()..nome = 'Julio';\n  final p2 = Programador()..nome = 'Julio';\n  print(p1 == p2); // > true\n  print(identical(p1, p2)); // > false\n  print('hash p1: ${p1.hashCode} - hash p2: ${p2.hashCode}');\n  // > hash p1: 514913100 - hash p2: 514913100\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/05_construtor_padrao/main.dart",
    "content": "class Programador {\n  // Programador(String nome, List<String> linguagens) {\n  //   this.nome = nome;\n  //   this.linguagens = linguagens;\n  // }\n\n  /// Syntax sugar para a forma acima:\n  // Programador(this.nome, this.linguagens);\n\n  /// Construtor padrão com parâmetros opcionais e valores default:\n  Programador({this.nome = 'Fulano', this.linguagens = const []});\n\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  void trabalhar() {}\n\n  @override\n  String toString() => '$nome';\n\n  @override\n  bool operator ==(Object other) => other is Programador && nome == other.nome;\n\n  @override\n  int get hashCode => nome.hashCode;\n}\n\nvoid main() {\n  final p1 = Programador();\n  final p2 = Programador(nome: 'Julio', linguagens: ['Dart']);\n  print(p1);\n  print(p2);\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/06_construtor_nomeado/main.dart",
    "content": "class Programador {\n  Programador({\n    this.nome = 'Fulano',\n    this.linguagens = const [],\n  });\n\n  Programador.dart(this.nome) {\n    linguagens = ['Dart'];\n  }\n\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  void trabalhar() {}\n\n  @override\n  String toString() => '$nome';\n\n  @override\n  bool operator ==(Object other) => other is Programador && nome == other.nome;\n\n  @override\n  int get hashCode => nome.hashCode;\n}\n\nvoid main() {\n  final p1 = Programador(nome: 'James Gosling', linguagens: ['Java']);\n  final p2 = Programador.dart('Julio');\n  print('$p1 ama ${p1.linguagens}');\n  print('$p2 ama ${p2.linguagens}');\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/07_construtor_const/main.dart",
    "content": "class LinguagemProgramacao {\n  const LinguagemProgramacao(this.nome);\n\n  final String nome;\n}\n\nvoid main() {\n  final primeira = const LinguagemProgramacao('Dart');\n  final segunda = const LinguagemProgramacao('Dart');\n  final terceira = LinguagemProgramacao('Dart');\n  print(identical(primeira, segunda)); // > true\n  print(identical(primeira, terceira)); // > false\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/08_construtor_factory/main.dart",
    "content": "class Programador {\n  Programador._internal(this.nome);\n\n  factory Programador(String nome) {\n    if (_cache.containsKey(nome)) {\n      return _cache[nome]!;\n    }\n    final novo = Programador._internal(nome);\n    _cache[nome] = novo;\n    return novo;\n  }\n\n  static final Map<String, Programador> _cache = {};\n  String nome;\n\n  static imprimirCache() {\n    print(_cache);\n  }\n}\n\nvoid main() {\n  final p1 = Programador('Julio Bitencourt');\n  final p2 = Programador('Julio Bitencourt');\n  print(identical(p1, p2)); // > true\n  Programador.imprimirCache();\n  // > {Julio Bitencourt: Instance of 'Programador'}\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/09_encapsulamento/main.dart",
    "content": "// class Programador {\n//   DateTime? nascimento;\n// }\n//\n// void main() {\n//   final p1 = Programador();\n//   p1.nascimento = DateTime(1995, 12, 1, 2, 30);\n//   print(p1.nascimento); // > 1995-12-01 02:30:00.000\n// }\n\nclass Programador {\n  DateTime? _nascimento;\n\n  set nascimento(DateTime? value) {\n    if (value != null)\n      _nascimento = DateTime(value.year, value.month, value.day);\n  }\n\n  DateTime? get nascimento => _nascimento;\n\n  int get idade {\n    if (_nascimento == null) return 0;\n    return DateTime.now().difference(_nascimento!).inDays ~/ 365;\n  }\n}\n\nvoid main() {\n  final p1 = Programador();\n  p1.nascimento = DateTime(1995, 12, 1, 2, 30);\n  print(p1.nascimento); // > 1995-12-01 00:00:00.000\n  print(p1.idade); // > 26\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/10_heranca/main.dart",
    "content": "class Funcionario {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n\n  void trabalhar() {\n    print('${this.runtimeType} trabalhando..');\n  }\n}\n\nclass Programador extends Funcionario {\n  List<String>? linguagens;\n}\n\nclass Gerente extends Funcionario {\n  double? bonus;\n}\n\nvoid main() {\n  final programador = Programador()\n    ..nome = 'Bill Gates'\n    ..linguagens = ['.Net'];\n  final gerente = Gerente()\n    ..nome = 'Jeff Bezos'\n    ..bonus = 500;\n  programador.trabalhar(); // > Programador trabalhando..\n  print('Programador é Funcionario? ${programador is Funcionario}');\n  // > Programador é Funcionario? true\n  gerente.trabalhar(); // > Gerente trabalhando..\n  print('Gerente é Funcionario? ${gerente is Funcionario}');\n  // > Gerente é Funcionario? true\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/11_polimorfismo/main.dart",
    "content": "class Funcionario {\n  void trabalhar() {\n    print('Funcionario trabalhando..');\n  }\n}\n\nclass Programador extends Funcionario {\n  @override\n  void trabalhar() {\n    print('Programador trabalhando..');\n  }\n}\n\nclass Gerente extends Funcionario {\n  @override\n  void trabalhar() {\n    print('Gerente trabalhando..');\n    super.trabalhar();\n  }\n}\n\nclass Startup {\n  Startup(this.funcionarios);\n\n  List<Funcionario> funcionarios;\n\n  void novoProjeto() {\n    funcionarios.forEach((f) => f.trabalhar());\n  }\n}\n\nvoid main() {\n  Funcionario funcionario = Funcionario();\n  Funcionario programador = Programador();\n  Funcionario gerente = Gerente();\n  final startup = Startup([funcionario, programador, gerente]);\n  startup.novoProjeto();\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/12_classes_abstratas/main.dart",
    "content": "abstract class Funcionario {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n\n  void trabalhar();\n}\n\nclass Programador extends Funcionario {\n  List<String>? linguagens;\n\n  @override\n  void trabalhar() {\n    print('Programador trabalhando..');\n  }\n}\n\nclass Gerente extends Funcionario {\n  double? bonus;\n\n  @override\n  void trabalhar() {\n    print('Gerente trabalhando..');\n  }\n}\n\nclass Robo extends Funcionario {\n  double? bateria;\n\n  @override\n  void trabalhar() {\n    print('0100010110010110');\n  }\n}\n\nclass Assalariado {\n  Assalariado(this.salario);\n\n  double? salario;\n\n  void receber() {}\n}\n\nclass Startup {\n  Startup(this.funcionarios);\n\n  List<Funcionario> funcionarios;\n\n  void novoProjeto() {\n    funcionarios.forEach((f) => f.trabalhar());\n  }\n}\n\nvoid main() {\n  Funcionario programador = Programador();\n  Funcionario gerente = Gerente();\n  final startup = Startup([programador, gerente]);\n  startup.novoProjeto();\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/13_interfaces/main.dart",
    "content": "abstract class Assalariado {\n  Assalariado(this.salario);\n\n  double salario;\n\n  void receber();\n}\n\nabstract class Funcionario {\n  String? nome;\n  List<String> tarefas = [];\n\n  void trabalhar();\n}\n\nclass Programador extends Funcionario implements Assalariado {\n  Programador({this.salario = 1000});\n\n  List<String>? linguagens;\n\n  @override\n  double salario;\n\n  @override\n  void trabalhar() {\n    print('Programador trabalhando..');\n  }\n\n  @override\n  void receber() {\n    print('Programador recebendo $salario');\n  }\n}\n\nclass Gerente extends Funcionario implements Assalariado {\n  Gerente({this.salario = 5000});\n\n  double? bonus;\n\n  @override\n  double salario;\n\n  @override\n  void trabalhar() {\n    print('Gerente trabalhando..');\n  }\n\n  @override\n  void receber() {\n    print('Gerente recebendo $salario');\n  }\n}\n\nclass Robo extends Funcionario {\n  double? bateria;\n\n  @override\n  void trabalhar() {\n    print('0100010110010110');\n  }\n}\n\nclass Startup {\n  List<Funcionario> funcionarios;\n  List<Assalariado> assalariados;\n\n  Startup(this.funcionarios, this.assalariados);\n\n  void pagarFuncionarios() {\n    assalariados.forEach((a) => a.receber());\n  }\n}\n\nvoid main() {\n  Funcionario programador = Programador();\n  Funcionario gerente = Gerente();\n  Funcionario robo = Robo();\n  final startup = Startup(\n    [programador, gerente, robo],\n    [(programador as Assalariado), (gerente as Assalariado)],\n  );\n  startup.pagarFuncionarios();\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/14_mixins/main.dart",
    "content": "mixin Assalariado on Funcionario {\n  double salario = 0;\n\n  void receber() {\n    print('Pegando o salário do ${super.nome}, valor de $salario');\n  }\n}\n\nabstract class Funcionario {\n  String? nome;\n  List<String> tarefas = [];\n\n  void trabalhar();\n}\n\nclass Programador extends Funcionario with Assalariado {\n  List<String>? linguagens;\n\n  void trabalhar() {\n    print('Programador trabalhando..');\n  }\n}\n\nclass Gerente extends Funcionario with Assalariado {\n  double? bonus;\n\n  @override\n  void trabalhar() {\n    print('Gerente trabalhando..');\n  }\n}\n\nclass Robo extends Funcionario {\n  double? bateria;\n\n  @override\n  void trabalhar() {\n    print('0100010110010110');\n  }\n}\n\nclass Startup {\n  List<Funcionario> funcionarios;\n  List<Assalariado> assalariados;\n\n  Startup(this.funcionarios, this.assalariados);\n\n  void pagarFuncionarios() {\n    assalariados.forEach((a) => a.receber());\n  }\n}\n\nvoid main() {\n  Funcionario programador = Programador()\n    ..nome = 'Bill Gates'\n    ..salario = 34000;\n  Funcionario gerente = Gerente()\n    ..nome = 'Douglas Adams'\n    ..salario = 42000;\n  Funcionario robo = Robo();\n  final startup = Startup(\n    [programador, gerente, robo],\n    [(programador as Assalariado), (gerente as Assalariado)],\n  );\n  startup.pagarFuncionarios();\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/15_mixins_a_fundo/main.dart",
    "content": "abstract class A {\n  String ola();\n}\n\nmixin B {\n  String ola() => 'Olá B';\n}\n\nmixin C {\n  String ola() => 'Olá C';\n}\n\nclass D extends A with B, C {\n  void dizerOla() {\n    print(ola());\n  }\n}\n\nvoid main() {\n  D().dizerOla();\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/16_extension_methods/main.dart",
    "content": "String capitalizar(String texto) {\n  if (texto.isEmpty) return texto;\n  return '${texto[0].toUpperCase()}${texto.substring(1)}';\n}\n\nextension on String {\n  String capitalizar() =>\n      this.isEmpty ? this : '${this[0].toUpperCase()}${this.substring(1)}';\n\n  String operator &(String other) => '$this - $other';\n\n  String get primeiraPalavra => split(' ').first;\n\n  String get ultimaPalavra => split(' ').last;\n}\n\nvoid main() {\n  print(capitalizar('dart')); // > Dart\n  print('julio'.capitalizar()); // > Julio\n  print('julio bitencourt'.primeiraPalavra); // > julio\n  print('julio bitencourt'.ultimaPalavra.capitalizar());\n  // > Bitencourt\n  print('julio' & 'bitencourt'); // > julio - bitencourt\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/main.dart",
    "content": "import 'strings_extension.dart';\n\nString capitalizar(String texto) {\n  if (texto.isEmpty) return texto;\n  return '${texto[0].toUpperCase()}${texto.substring(1)}';\n}\n\nvoid main() {\n  print(capitalizar('dart')); // > Dart\n  print('julio'.capitalizar()); // > Julio\n  print('julio bitencourt'.primeiraPalavra); // > julio\n  print('julio bitencourt'.ultimaPalavra.capitalizar());\n  // > Bitencourt\n  print('julio' & 'bitencourt'); // > julio - bitencourt\n}\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/strings_extension.dart",
    "content": "extension StringExtension on String {\n  String capitalizar() =>\n      this.isEmpty ? this : '${this[0].toUpperCase()}${this.substring(1)}';\n\n  String operator &(String other) => '$this - $other';\n\n  String get primeiraPalavra => split(' ').first;\n\n  String get ultimaPalavra => split(' ').last;\n}"
  },
  {
    "path": "code/pt_Br/08_capitulo/18_classe_wrapper/main.dart",
    "content": "class Id {\n  Id(this._valor);\n  final int _valor;\n  \n  bool get isValid => _valor > 0;\n  Id get next => Id(_valor +1);\n\n  @override\n  String toString() => '$_valor';\n}\n\nclass Funcionario {\n  Funcionario(this.id);\n  final Id id;\n}\n\nvoid main() {\n  final id = Funcionario(Id(1)).id;\n  // print(id + 1); // Erro de compilação\n  print(id.next.next); // > 3\n  print(id.runtimeType); // > Id\n}"
  },
  {
    "path": "code/pt_Br/08_capitulo/19_extension_types/main.dart",
    "content": "import 'package:meta/meta.dart';\n\nextension type Id(int id) {\n  Id get next => Id(id + 1);\n  bool get isValid => id > 0;\n}\n\nclass Funcionario {\n  Funcionario(this.id);\n  final Id id;\n}\n\nvoid main() {\n  final id = Funcionario(Id(1)).id;\n  // print(id + 1); // Erro de compilação\n  print(id.next.next); // > 3\n  print(id.runtimeType); // > int\n\n  int idInt = id as int;\n  print(idInt + idInt); // > 2\n  if(id case int n) print('${n+n}'); // > 2\n}\n\nextension type MinhaString(String _) implements String {\n  @redeclare\n  int operator [](int index) => codeUnitAt(index);\n}"
  },
  {
    "path": "code/pt_Br/08_capitulo/19_extension_types/pubspec.yaml",
    "content": "name: extensions\ndescription: A starting point for Dart libraries or applications.\nversion: 1.0.0\n# repository: https://github.com/my_org/my_repo\n\nenvironment:\n  sdk: ^3.5.1\n\n# Add regular dependencies here.\ndependencies:\n  meta: ^1.16.0\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/20_modifiers_abstract/main.dart",
    "content": "abstract class A {}\nclass B extends A {}\nclass C implements A {}\n\n// Modificador abstract desabilita o instanciamento\nfinal a = A(); // Erro"
  },
  {
    "path": "code/pt_Br/08_capitulo/21_modifiers_interface/arquivo.dart",
    "content": "interface class A {}"
  },
  {
    "path": "code/pt_Br/08_capitulo/21_modifiers_interface/main.dart",
    "content": "import 'arquivo.dart';\n\n// Modificador interface desabilita a herança:\nclass B extends A {} // Erro\n\nclass C implements A {}\nfinal a = A();"
  },
  {
    "path": "code/pt_Br/08_capitulo/22_modifiers_base/arquivo.dart",
    "content": "base class A {}"
  },
  {
    "path": "code/pt_Br/08_capitulo/22_modifiers_base/main.dart",
    "content": "import 'arquivo.dart';\n\n\nbase class B extends A {}\nfinal a = A();\n\n// Modificador base desabilita o implements\nbase class C implements A {} // Erro"
  },
  {
    "path": "code/pt_Br/08_capitulo/23_modifiers_final/arquivo.dart",
    "content": "final class A {}"
  },
  {
    "path": "code/pt_Br/08_capitulo/23_modifiers_final/main.dart",
    "content": "import 'arquivo.dart';\n\n//Modificador final desabilita subclasses e subtipos:\nclass B extends A {} // Erro\nclass C implements A {} // Erro\n\nfinal a = A();"
  },
  {
    "path": "code/pt_Br/08_capitulo/24_modifiers_sealed/main.dart",
    "content": "sealed class Poligono {}\nclass Pentagono extends Poligono {}\nsealed class Triangulo extends Poligono {}\nclass Isoceles extends Triangulo {}\nclass Equilatero extends Triangulo {}\nsealed class Quadrilatero extends Poligono {}\nclass Retangulo extends Quadrilatero {}\n\nint ladosPoligono(Poligono p) => switch (p) {\n  Isoceles() || Equilatero() => 3,\n  Retangulo() => 4,\n  Pentagono() => 5,\n};"
  },
  {
    "path": "code/pt_Br/09_capitulo/01_generics_1/main.dart",
    "content": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n\nclass FilaPedagio {\n  List _veiculos = [];\n\n  void entrarNaFila(veiculo) {\n    _veiculos.add(veiculo);\n  }\n}\n\nvoid main() {\n  final fila = FilaPedagio();\n  fila.entrarNaFila(Carro());\n\n  /// Caminhão não deveria entrar na mesma fila que um carro\n  fila.entrarNaFila(Caminhao());\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/02_generics_2/main.dart",
    "content": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n\nclass FilaPedagioCarro {\n  List _veiculos = [];\n\n  void entrarNaFila(Carro veiculo) {\n    _veiculos.add(veiculo);\n  }\n}\n\nclass FilaPedagioCaminhao {\n  List _veiculos = [];\n\n  void entrarNaFila(Caminhao veiculo) {\n    _veiculos.add(veiculo);\n  }\n}\n\n/// Criar duas filas separadas é uma alternativa, mas não é\n/// um bom design de código, pois estamos duplicando código.\nvoid main() {\n  var filaCarro = FilaPedagioCarro();\n  filaCarro.entrarNaFila(Carro());\n  var filaCaminhao = FilaPedagioCaminhao();\n  filaCaminhao.entrarNaFila(Caminhao());\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/03_generics_3/main.dart",
    "content": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n\nclass FilaPedagio<T> {\n  List<T> _veiculos = [];\n\n  void entrarNaFila(T veiculo) {\n    _veiculos.add(veiculo);\n  }\n}\n\n/// Tipando FilaPedagio<T> com generics ganhamos a liberdade de criar\n/// filas especialistas em um determinado tipo.\n/// Como filas só de carros ou caminhões.\nvoid main() {\n  final filaCarro = FilaPedagio<Carro>();\n  filaCarro.entrarNaFila(Carro());\n  // filaCarro.entrarNaFila(Caminhao()); // Erro\n  final filaCaminhao = FilaPedagio<Caminhao>();\n  filaCaminhao.entrarNaFila(Caminhao());\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/04_generics_restringindo_tipo/main.dart",
    "content": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n\nclass FilaPedagio<T extends VeiculoAutomotor> {\n  List<T> _veiculos = [];\n\n  void entrarNaFila(T veiculo) {\n    _veiculos.add(veiculo);\n  }\n}\n\nclass Bicicleta {}\n\n/// Restringindo os tipos aceitos em FilaPedagio<T> para apenas subclasses de\n/// VeiculoAutomotor, estamos impedindo que veículos como Bicicleta entrem na\n/// fila de pedágio.\nvoid main() {\n  final filaCarro = FilaPedagio<Carro>();\n  final filaCaminhao = FilaPedagio<Caminhao>();\n  // final filaBicicleta = FilaPedagio<Bicicleta>(); //Erro\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/05_generics_metodos/main.dart",
    "content": "T ultimo<T extends num>(List<T> itens) {\n  T ultimo = itens.last;\n  return ultimo;\n}\n\nvoid main() {\n  print(ultimo<int>([10, 20, 30])); // > 30\n  print(ultimo([1.4, 2, 42.0])); // > 42.0\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/06_lists/main.dart",
    "content": "void main() {\n  final vogais = [];\n  vogais.add('a');\n  vogais.add(42);\n  print(vogais);\n  print(vogais.runtimeType);\n\n  print('---------------');\n\n  final risadas = <String>[];\n  risadas.addAll(['kkk', 'haha', 'rsrs']);\n  print(risadas);\n  print(risadas.runtimeType);\n\n  print('---------------');\n\n  final alfabeto = ['a', 'b'];\n  alfabeto.add('c');\n  print(alfabeto);\n  print(alfabeto.runtimeType);\n\n  print('---------------');\n\n  /// Lista de tamanho fixo:\n  final vogaisFixo = List<String>.filled(5, 'e');\n  vogaisFixo[0] = 'a';\n  vogaisFixo[4] = 'u';\n  // vogaisFixo.add('a'); // Erro\n  print(vogaisFixo);\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/07_iterando_lists/main.dart",
    "content": "void main() {\n  final risadas = <String>['kkk', 'haha', 'rsrs'];\n\n  /// Primeira forma de varrer uma lista:\n  /// Para quando o índice é importante.\n  for (var i = 0; i < risadas.length; i++) print(risadas[i]);\n\n  print('---------------');\n\n  /// Segunda forma de varrer uma lista:\n  /// Para quando o índice não importa.\n  for (final r in risadas) print(r);\n\n  print('---------------');\n\n  /// Terceira forma de varrer uma lista:\n  /// Uma forma funcional\n  risadas.forEach((r) => print(r));\n\n  print('---------------');\n\n  /// Quarta forma de varrer uma lista:\n  /// Uma forma hardcore. Utilizando a interface Iterator para controle\n  /// do ponteiro que varre a lista.\n  Iterator i = risadas.iterator;\n  while (i.moveNext()) print(i.current);\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/08_linked_hash_set/main.dart",
    "content": "import 'dart:collection';\n\n/// Todo Set por padrão implementa um LinkedHashSet,\n/// que mantém a ordem dos elementos inseridos.\nvoid main() {\n  final megasena = Set<int>();\n  megasena.addAll([44, 35, 4, 11, 29, 4, 35, 57]);\n  print(megasena); // > {44, 35, 4, 11, 29, 57}\n\n  final vogais = <String>{'a', 'e', 'i', 'a', 'o', 'u'};\n  print(vogais); // > {a, e, i, o, u}\n  print(vogais.elementAt(1)); // e\n  // print(vogais[0]); // Erro\n\n  final consoantes = LinkedHashSet();\n  consoantes.addAll(['b', 'c', 'd']);\n  print(consoantes); // > {b, c, d}\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/09_hash_set/main.dart",
    "content": "import 'dart:collection';\n\n/// A implementação do HashSet não mantém a ordem de inserção.\n/// A ordem dos elementos é de acordo com a implementação do hashCode.\nvoid main() {\n  final megasena = HashSet<int?>();\n  megasena.addAll([44, 35, 4, 11, null, 29, 4, null, 35, 57]);\n  print(megasena); // > {35, 4, 57, 11, null, 44, 29}\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/10_splay_tree_set/main.dart",
    "content": "import 'dart:collection';\n\n/// A implementação do SplayTreeSet também não mantém a ordem de inserção.\n/// A ordem dos elementos é de acordo com a implementação do compareTo de [Comparable].\nvoid main() {\n  final vogais = ['e', 'i', 'a', 'o', 'u'];\n  vogais.sort();\n  print(vogais); // > [a, e, i, o, u]\n\n  final megasena = SplayTreeSet<String>();\n  megasena.addAll(['44', '35', '4', '11', '4']);\n  print(megasena); // > {11, 35, 4, 44}\n\n  final megasena2 = SplayTreeSet<String>((a, b) {\n    return int.parse(a).compareTo(int.parse(b));\n  });\n  megasena2.addAll(['44', '35', '4', '11', '4']);\n  print(megasena2); // > {4, 11, 35, 44}\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/11_queue/main.dart",
    "content": "import 'dart:collection';\n\nvoid main() {\n  final megasena = Queue<int>();\n  megasena.addAll([11, 35]);\n  print(megasena);\n  megasena.addFirst(4); // > {4, 11, 35}\n  print(megasena);\n  megasena.removeLast(); // > {4, 11}\n  print(megasena);\n  megasena.addLast(44); // > {4, 11, 44}\n  print(megasena);\n  megasena.removeFirst(); // > {11, 44}\n  print(megasena);\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/12_map/main.dart",
    "content": "import 'dart:collection';\n\nvoid main() {\n  final clientes = Map<int, String>();\n  clientes[1] = 'Rafael';\n  clientes[1] = 'Juliana';\n  clientes.putIfAbsent(2, () => 'João');\n  clientes.putIfAbsent(2, () => 'Maria');\n  print(clientes); // {1: Juliana, 2: João}\n  final usuario = {\n    'Nome': 'Julio',\n    'Linguagens': ['dart', 'java']\n  };\n  usuario.putIfAbsent('Github', () => 'JHBitencourt');\n  print(usuario.runtimeType); // > _InternalLinkedHashMap<String, Object>\n\n  print(usuario['Nome']!.runtimeType); // > String\n  print(usuario['Sobrenome']?.runtimeType); // > null\n\n  Iterable chaves = clientes.keys;\n  Iterable valores = clientes.values;\n  Iterable<MapEntry> elementos = clientes.entries;\n  print(elementos.first.key); // > 1\n  print(elementos.first.value); // > Juliana\n\n  final linkedHashMap = LinkedHashMap.fromIterables(['3', '1', '2'], [1, 2, 3]);\n  print(linkedHashMap); // > {3: 1, 1: 2, 2: 3}\n\n  final hashMap = HashMap.fromIterables(['3', '1', '2'], [1, 2, 3]);\n  print(hashMap); // > {1: 2, 3: 1, 2: 3}\n\n  final splayTreeMap = SplayTreeMap<String, int>.fromIterables(\n      ['3', '1', '2'], [1, 2, 3], (a, b) {\n    return int.parse(a).compareTo(int.parse(b));\n  });\n  print(splayTreeMap); // > {1: 2, 2: 3, 3: 1}\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/13_records/main.dart",
    "content": "void main() {\n  var turing = ('Alan Turing', 41, 1954);\n  var hawking = ('Stephen Hawking',);\n  var lovelace = ('Ada Lovelace', idade: 36, falecimento: 1852);\n  \n  print(hawking.runtimeType); // > (String)\n  print(turing.runtimeType); // > (String, int, int)\n  print(turing.$1); // > Alan Turing\n  print(turing.$3); // > 1954\n  print(lovelace.idade); // > 36\n}"
  },
  {
    "path": "code/pt_Br/09_capitulo/14_records_tipados/main.dart",
    "content": "void main() {\n  (String, int, int) turing = ('Alan Turing', 41, 1954);\n  (String nome,) hawking = ('Stephen Hawking',);\n  (String nome, {int idade, int falecimento}) lovelace; \n  lovelace = ('Ada Lovelace', idade: 36, falecimento: 1852);\n  print(lovelace.runtimeType); // > (String, {int falecimento, int idade})\n}"
  },
  {
    "path": "code/pt_Br/09_capitulo/15_records_equalidade/main.dart",
    "content": "void main() {\n  (int x, int y, int z) coordenada1 = (10, 3, 4);\n  (int r, int g, int b) cor1 = (10, 3, 4);\n  print(coordenada1 == cor1); // > true\n\n  ({int x, int y, int z}) coordenada2 = (x: 10, y: 3, z: 4);\n  ({int r, int g, int b}) cor2 = (r: 10, g: 3, b: 4);\n  print(coordenada2 == cor2); // > false\n}"
  },
  {
    "path": "code/pt_Br/09_capitulo/16_records_retorno_funcao/main.dart",
    "content": "void main() {\n  var comprovante = comprovanteTransacao();\n  print(comprovante.$1); // > chavepix@gmail.com\n\n  var (chaveDestino, _, hora: data) = comprovanteTransacao();\n  print(chaveDestino); // > chavepix@gmail.com\n  print(data); // > 2024-11-19 21:24:02.623\n}\n\ntypedef Comprovante = (String chave, double valor, {DateTime hora});\nComprovante comprovanteTransacao() {\n  return ('chavepix@gmail.com', 29.9, hora: DateTime.now());\n}\n\n// (String, double, DateTime) comprovanteTransacao() {\n//   return ('chavepix@gmail.com', 29.9, DateTime.now());\n// }"
  },
  {
    "path": "code/pt_Br/09_capitulo/17_pattern_matching/main.dart",
    "content": "void main() {\n  var list = [1, 2, 3, 4];\n  var [primeiro, ..., ultimo] = list;\n  print('$primeiro - $ultimo'); // > 1 - 4\n\n  var (a, b) = ('esquerda', 'direita');\n  (a, b) = (b, a);\n  print('$a - $b'); // > direita - esquerda\n\n  var coordenada = (4, 2);\n  if(coordenada case (var x, var y) when x > 0 && y > 0) {\n    print('Coordenadas positivas $x-$y!'); // > Coordenadas positivas 4-2!\n  }\n  \n  switch (coordenada) {\n    case (var x, var y) when x > 0 && y > 0:\n      print('1° quadrante do plano cartesiano!'); // > 1° quadrante do plano cartesiano!\n    case (var x, var y) when x < 0 && y < 0:\n      print('3° quadrante do plano cartesiano!');\n  }\n\n  var cliente = Cliente(id: 42, apelido: 'Bob', idade: 28);\n  var Cliente(:id, apelido: nickname) = cliente;\n  print('Cliente $id é o $nickname'); // > Cliente 42 é o Bob\n}\n\nclass Cliente {\n  final int id;\n  final String apelido;\n  final int? idade;\n\n  Cliente({required this.id, required this.apelido, this.idade});\n}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/18_pattern_destructuring/main.dart",
    "content": "void main() {\n  final resposta = 42;\n  switch (resposta) {\n    case 42:\n      print('sentido da vida, do universo e tudo mais!');\n  }\n\n  final pares = [2, 4, 6, 8];\n  switch (pares) {\n    case [2, _, 4, 5]:\n      print('Segundo valor não importa');\n    case [2 || 4, ...]:\n      print('Começa com 2 ou 4!'); // > Começa com 2 ou 4!\n    default:\n      print('Sem matching.');\n  }\n}\n\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/19_pattern_for_looping/main.dart",
    "content": "void main() {\n  var clientes = {1:'Bob', 2:'Ana'};\n  for(var MapEntry(:key, value: nome) in clientes.entries) {\n    print('Cliente $key chama-se $nome');\n  }\n}"
  },
  {
    "path": "code/pt_Br/09_capitulo/20_pattern_collection_literal/main.dart",
    "content": "void main() {\n  var numeros = [-3, 4, 6, 1, -9, -4];\n  var positivos = [for (var n in numeros) if (n case > 0) n];\n  print(positivos); // > [4, 6, 1]\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/01_event_loop/main.dart",
    "content": "import 'dart:async';\nvoid main () {\n  print('Início main()');\n  Timer.run(() => print('Event loop 1')); // #E1\n  Timer.run(() { // #E2\n    scheduleMicrotask(() => print('Microtask 3')); // #M3\n    print('Event loop 2');\n  });\n  scheduleMicrotask(() => print('Microtask 1')); // #M1\n  Timer.run(() => print('Event loop 3')); // #E3\n  scheduleMicrotask(() => print('Microtask 2')); // #M2\n  print('Fim main()');\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/02_programa_sincrono_1/main.dart",
    "content": "void main () {\n  print('Início main()');\n  int index = 0;\n  while(index < 10) {\n    print('Índice $index');\n    index++;\n  }\n  print('Fim main()');\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/03_programa_sincrono_2/main.dart",
    "content": "import 'dart:io';\n\nvoid main() {\n  print(temperaturaAtual());\n  print(previsaoAmanha());\n}\n\nString temperaturaAtual() {\n  sleep(const Duration(seconds: 3));\n  return 'Está fazendo 28º';\n}\n\nString previsaoAmanha() {\n  sleep(const Duration(seconds: 4));\n  return 'Amanhã fará 35º';\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/04_future/main.dart",
    "content": "void main() {\n  final future = Future<int>(() {\n    return 84 ~/ 2;\n  }).then((int valor) {\n    print('Future em estado Completo, valor: $valor');\n  }).catchError((Object erro, StackTrace stacktrace) {\n    print('Future em estado Completo, erro: $erro');\n    print(stacktrace);\n  }).whenComplete(() {\n    print('Future finalizado');\n  });\n  print('$future em estado Incompleto');\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/05_future_encadeado/main.dart",
    "content": "void main() {\n  buscarId().then((int id) {\n    print('Id encontrado, buscando nome..');\n    return buscarNome(id);\n  }).then(print);\n  print('Buscando..');\n}\n\nFuture<int> buscarId() {\n  return Future.delayed(const Duration(seconds: 3), () => 1);\n}\n\nFuture<String> buscarNome(int id) {\n  return Future.delayed(const Duration(seconds: 3), () => 'JHBitencourt');\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/06_erro_cadeia_assincrona/main.dart",
    "content": "Future<String> um() => Future.value('Primeiro');\nFuture<String> dois() => Future.error('Erro no dois()');\nFuture<String> tres() => Future.value('Terceiro');\n\nvoid main() {\n  um().then((_) => dois())\n      .then((_) => tres())\n      .then((String valor) {\n    print('O valor é $valor');\n  });\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/07_erro_cadeia_try_catch/main.dart",
    "content": "Future<String> um() => Future.value('Primeiro');\n\nFuture<String> dois() => Future.error('Erro no dois()');\n\nFuture<String> tres() => Future.value('Terceiro');\n\nvoid main() {\n  try {\n    um().then((_) => dois())\n        .then((_) => tres())\n        .then((String valor) {\n      print('O valor é $valor');\n    });\n  } catch(e) {\n    print('Capturado: $e');\n  }\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/08_erro_cadeia_catch_error/main.dart",
    "content": "Future<String> um() => Future.value('Primeiro');\n\nFuture<String> dois() => Future.error('Erro no dois()');\n\nFuture<String> tres() => Future.value('Terceiro');\n\nvoid main() {\n  um().then((_) => dois())\n      .then((_) => tres())\n      .catchError((dynamic e) {\n    print('Capturado: $e');\n    return '42';\n  }).then((String valor) {\n    print('O valor é $valor');\n  });\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/09_erro_cadeia_on_error/main.dart",
    "content": "Future<String> um() => Future.value('Primeiro');\n\nFuture<String> dois() => Future.error('Erro no dois()');\n\nFuture<String> tres() => Future.value('Terceiro');\n\nvoid main() {\n  um().then((_) => dois())\n      .then((_) => tres(), onError: (dynamic e) {\n    print('Capturado onError: $e');\n    return '42 :)';\n  }).catchError((dynamic e) {\n    print('Capturado: $e');\n    return '42';\n  }).then((String valor) {\n    print('O valor é $valor');\n  });\n}"
  },
  {
    "path": "code/pt_Br/10_capitulo/10_future_sync/main.dart",
    "content": "void main() {\n  Future<String>.sync(() {\n    print('Função Future.sync() executada');\n    return 'Future síncrono?';\n  }).then(print);\n  print('Future.sync():');\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/11_future_microtask/main.dart",
    "content": "void main() {\n  Future(() => 'Future normal').then(print);\n  Future.microtask(() => 'Future microtask').then(print);\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/12_future_value/main.dart",
    "content": "void main() {\n  Future<int>(() => Future.value(42)).then(print);\n  print('Future.value():');\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/13_future_error/main.dart",
    "content": "void main() {\n  Future.error('ERRO')\n      .then(\n        (valor) => print('Não executa, o Future completa com erro..'),\n        onError: (e) => print('Erro capturado no onError $e'),\n      )\n      .catchError((e) => print('Future.error() => $e'));\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/14_future_wait/main.dart",
    "content": "void main() {\n  Future.wait<String>(listaFuture()).then(print, onError: print);\n  print('Aguardando..');\n}\n\nList<Future<String>> listaFuture() => <int>[2, 1, 3]\n    .map((s) => Future<String>.delayed(Duration(seconds: s), () => 'Tempo: $s'))\n    .toList();\n\nFuture<String> comErro() => Future<String>.error('Erro ao buscar dados.');\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/15_future_any/main.dart",
    "content": "void main() {\n  Future.any<String>(listaFuture()).then(print, onError: print);\n  print('Aguardando..');\n}\n\nList<Future<String>> listaFuture() => <int>[2, 1, 5]\n    .map((s) => Future<String>.delayed(Duration(seconds: s), () => 'Tempo: $s'))\n    .toList();\n\nFuture<String> comErro() => Future<String>.error('Erro ao buscardados.');\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/16_async_await/main.dart",
    "content": "void main() {\n  final r = resposta().then(print);\n  print('Resposta: $r');\n}\n\nresposta() async {\n  return 42;\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/17_async_await_fluxo/main.dart",
    "content": "void main() {\n  final future = resposta();\n  future.then(print);\n  print('Resposta: $future');\n}\n\nFuture<int> resposta() async {\n  print('Isso é síncrono');\n  final r = await 42;\n  print('Isso é após o await');\n  return r;\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/18_async_await_x_future/main.dart",
    "content": "Future<String> buscarNomeUsuario() {\n  return buscarId().then((int id) {\n    return buscarNome(id);\n  }).then((String nome) {\n    return 'Usuário: $nome';\n  });\n}\n\nFuture<String> buscarNomeUsuarioAsync() async {\n  final id = await buscarId();\n  final nome = await buscarNome(id);\n  return 'Usuário: $nome';\n}\n\nmain() async {\n  final usuario = await buscarNomeUsuario();\n  print('$usuario');\n\n  final usuarioAsync = await buscarNomeUsuarioAsync();\n  print('$usuarioAsync');\n}\n\nFuture<int> buscarId() async => 42;\n\nFuture<String> buscarNome(int id) async => 'JHBitencourt';\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/19_async_await_erro/main.dart",
    "content": "void main() {\n  buscarId();\n  print('Capturando um erro assíncrono...');\n}\n\nFuture<int> buscarId() async {\n  try {\n    return await Future<int>(() {\n      return 42 ~/ 0;\n    });\n  } on UnsupportedError catch (e) {\n    print('Erro capturado: $e');\n  } catch (e) {\n    print('Demais erros caem aqui');\n  }\n  return 0;\n}\n\n// Future<int> buscarId() async {\n//   return Future<int>(() {\n//     return 42 ~/ 0;\n//   }).catchError((dynamic e) {\n//     print('Erro capturado: $e');\n//     return 0;\n//   }, test: (dynamic e) => e is UnsupportedError)\n//       .catchError(\n//         (dynamic e) {\n//       print('Demais erros caem aqui');\n//       return 0;\n//     },\n//   );\n// }\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/20_completer_future/main.dart",
    "content": "import 'dart:async';\n\nclass Database {\n  void salvarUsuario(String usuario, void Function(String) callback) {\n    Timer(Duration(seconds: 2), () {\n      callback('$usuario salvo');\n    });\n  }\n}\n\nclass FutureDatabase {\n  Future<String> salvarUsuario(String usuario) {\n    final completer = Completer<String>();\n    Database().salvarUsuario(usuario, (String resultado) {\n      completer.complete(resultado);\n    });\n    return completer.future;\n  }\n}\n\nFuture<void> main() async {\n  // Database().salvarUsuario('JHBitencourt', callbackUsuario);\n  final resultado = await FutureDatabase().salvarUsuario('JHBitencourt');\n  print('Resultado: $resultado');\n}\n\nvoid callbackUsuario(String resultado) {\n  print('Callback executado: $resultado');\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/21_completer_flexibilidade/main.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nclass CompletoComNumero {\n  late Completer<String> _completer;\n  int numero;\n\n  CompletoComNumero._internal(this.numero) {\n    _completer = Completer();\n    sorteio().listen(_validarNumero);\n  }\n\n  Stream<int> sorteio() async* {\n    for (int i = 0; i < 5; i++) {\n      if (_completer.isCompleted) break;\n\n      await Future<void>.delayed(Duration(seconds: 1));\n      final sorteado = Random().nextInt(5) + 1;\n      print('Sorteio: $sorteado');\n\n      yield sorteado;\n    }\n    if (!_completer.isCompleted) {\n      _completer.completeError('O número não foi sorteado!');\n    }\n  }\n\n  void _validarNumero(int numeroSorteado) {\n    if (numeroSorteado == numero) {\n      _completer.complete('O número $numero foi sorteado!');\n    }\n  }\n\n  static Future<String> novo(int numero) async {\n    final c = CompletoComNumero._internal(numero);\n    return c._completer.future;\n  }\n}\n\nvoid main() {\n  CompletoComNumero.novo(3).then(print).catchError(print);\n}"
  },
  {
    "path": "code/pt_Br/11_capitulo/01_dart_args/main.dart",
    "content": "/// Rode o programa com o código:\n/// dart main.dart teste1 2 3\nvoid main(List<String> args) {\n  print(args);\n}"
  },
  {
    "path": "code/pt_Br/11_capitulo/02_dart_http/main.dart",
    "content": "import 'package:http/http.dart' as http;\nvoid main(List<String> args) async {\n  http.Response response = await http.get(Uri.parse('https://google.com'));\n  print(response.body);\n}"
  },
  {
    "path": "code/pt_Br/11_capitulo/02_dart_http/pubspec.yaml",
    "content": "name: livro_dart\ndescription: Dart http.\n\nenvironment:\n  sdk: '>=2.16.0 <3.0.0'\n\ndependencies:\n  http: ^0.13.4"
  },
  {
    "path": "code/pt_Br/11_capitulo/03_dart_convert/main.dart",
    "content": "import 'dart:convert';\n\nvoid main() {\n  final dados =\n      '{\"data\":[{ \"id\":1, \"name\":\"Acre\" }, { \"id\":2, \"name\":\"Alagoas\" }]}';\n  Map<String, dynamic> map = json.decode(dados);\n  print(map);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/01_stream_subscription/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  print('Início main()');\n  final stream = Stream<String>.value('A');\n  StreamSubscription subscription = stream.listen((dado) {\n    print('Novo evento: $dado');\n  });\n  print('Fim main()');\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/02_stream_subscription_varios_dados/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['A', 'E', 'I']);\n  final subscription = stream.listen(null);\n  subscription.onData((dado) {\n    print('Novo evento: $dado');\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/03_stream_subscription_callbacks/main.dart",
    "content": "void main() {\n  final stream = Stream.error('StreamErro');\n  final subscription = stream.listen((dado) {\n    print('Novo evento: $dado');\n  });\n  subscription.onError((e) {\n    print('Erro capturado: $e');\n  });\n  subscription.onDone(() => print('Stream finalizada'));\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/04_inscricao_unica_listener/main.dart",
    "content": "void main() async {\n  final stream = Stream.value('42');\n  final inscricaoUm = stream.listen(print);\n  /// Erro! Só é possível 1 listener em streams de inscrição única.\n  final inscricaoDois = stream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/05_broadcast_listener/main.dart",
    "content": "void main() async {\n  final stream = Stream.value('42').asBroadcastStream();\n  stream.listen((dado) => print('Inscrição 1 - $dado'));\n  stream.listen((dado) => print('Inscrição 2 - $dado'));\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/06_stream_controller/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  Stream stream = controller.stream;\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/07_stream_controller_sink/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  final stream = controller.stream;\n\n  final subscription = stream.listen((dado) {\n    print('Novo evento: $dado');\n  });\n  subscription.onError((e) {\n    print('Erro capturado: $e');\n  });\n\n  StreamSink sink = controller.sink;\n  sink.add(42);\n  sink.addError('Erro');\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/08_stream_consumer/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  controller.stream.listen((dado) {\n    print('Novo evento: $dado');\n  });\n\n  StreamSink sink = controller.sink;\n  final future = sink.addStream(Stream.fromIterable(['A', 'B', 'C']));\n  future.whenComplete(() => print('Todos eventos processados'));\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/09_stream_consumer_2/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controllerUm = StreamController();\n  controllerUm.stream.listen((dado) {\n    print('Novo evento StreamUm: $dado');\n  }, onDone: () => print('StreamUm finalizada'));\n\n  final controllerDois = StreamController.broadcast();\n  final future = controllerUm.sink.addStream(controllerDois.stream);\n  future.whenComplete(() => print('Todos eventos processados'));\n\n  controllerDois.stream.listen((dado) {\n    print('Novo evento StreamDois: $dado');\n  }, onDone: () => print('StreamDois finalizada'));\n  controllerDois.sink.add(42);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/10_stream_sink_close/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controllerUm = StreamController();\n  controllerUm.stream.listen((dado) {\n    print('Novo evento StreamUm: $dado');\n  }, onDone: () => print('StreamUm finalizada'));\n\n  final controllerDois = StreamController.broadcast();\n  final future = controllerUm.sink.addStream(controllerDois.stream);\n  future.whenComplete(() {\n    print('Todos eventos processados');\n    controllerUm.sink.close();\n  });\n\n  controllerDois.stream.listen((dado) {\n    print('Novo evento StreamDois: $dado');\n  }, onDone: () => print('StreamDois finalizada'));\n  controllerDois.sink.add(42);\n  controllerDois.sink.close();\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/11_stream_sink_x_stream_controller/main.dart",
    "content": "import 'dart:async';\n\nvoid acessaSink(StreamSink sink) {\n  sink.add(42);\n  if (sink is StreamController) {\n    sink.stream.listen(print);\n  }\n}\n\nvoid main() {\n  /// Sink encapsulada, impede o acesso direto ao controller:\n  acessaSink(StreamController().sink);\n\n  /// Controller também é um sink, mas fornece acesso a mais informações\n  // acessaSink(StreamController());\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/12_controller_callback_inscricao_unica/main.dart",
    "content": "import 'dart:async';\n\nvoid dispararEventos(StreamController controller) async {\n  for (var i = 1; i <= 6; i++) {\n    if (i == 5) {\n      controller.sink.addError('Erro no número $i');\n      continue;\n    }\n    await Future.delayed(Duration(seconds: 1), () {\n      controller.sink.add(i);\n    });\n  }\n  controller.sink.close();\n  print('StreamController em estado FECHADO');\n}\n\nvoid main() {\n  StreamController<int>? controller;\n  controller = StreamController<int>(\n      onListen: () {\n        print('StreamController em estado ATIVO');\n        dispararEventos(controller!);\n      },\n      onResume: () => print('StreamController resumido'),\n      onPause: () => print('StreamController pausado'),\n      onCancel: () => print('StreamController em estado CANCELADO'),\n      sync: false);\n  controller.sink.add(0);\n\n  print('StreamController em estado INICIAL');\n  StreamSubscription? inscricao;\n  Future.delayed(Duration(seconds: 2), () {\n    inscricao = controller!.stream.listen((int dado) {\n      print('Número: $dado');\n      if (dado == 1) {\n        print('Inscrição pausada');\n        inscricao!.pause(Future.delayed(\n            Duration(seconds: 1), () => print('Inscrição resumida')));\n      }\n    }, onError: (print), onDone: () => print('onDone'), cancelOnError: true);\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/13_controller_callback_broadcast/main.dart",
    "content": "import 'dart:async';\n\nvoid dispararEventos(StreamController controller) async {\n  for (var i = 1; i <= 6; i++) {\n    if (i == 3) {\n      controller.sink.addError('Erro no número $i');\n      continue;\n    }\n    await Future.delayed(Duration(seconds: 1), () {\n      controller.sink.add(i);\n    });\n  }\n  controller.sink.close();\n  print('StreamController em estado FECHADO');\n}\n\nvoid criarInscricao(StreamController<int> controller, int valor) {\n  StreamSubscription? inscricao;\n  Future.delayed(Duration(seconds: 2), () {\n    inscricao = controller.stream.listen((int dado) {\n      print('[Inscrição $valor] número: $dado');\n      if (dado == valor) {\n        print('[Inscrição $valor] pausada');\n        inscricao!.pause(Future.delayed(Duration(seconds: 2),\n                () => print('[Inscrição $valor] resumida')));\n      }\n      if (dado == valor + 3) {\n        print('[Inscrição $valor] cancelada');\n        inscricao!.cancel();\n      }\n    }, onError: (e) => print('[Inscrição $valor] $e'),\n        onDone: () => print('[Inscrição $valor] onDone'), cancelOnError: false);\n  });\n}\n\nvoid main() {\n  StreamController<int>? controller;\n  controller = StreamController<int>.broadcast(\n      onListen: () {\n        print('StreamController em estado ATIVO');\n        dispararEventos(controller!);\n      },\n      onCancel: () =>\n          print('StreamController em estado CANCELADO'\n          ),\n      sync: false);\n  controller.sink.add(0);\n  print('StreamController em estado INICIAL');\n  criarInscricao(controller, 1);\n  criarInscricao(controller, 2);\n  Future.delayed(Duration(seconds: 8), () {\n    criarInscricao(controller!, 3);\n  });\n}"
  },
  {
    "path": "code/pt_Br/12_capitulo/14_stream_await/main.dart",
    "content": "// void main() {\n//   print('início main()');\n//   final stream = Stream.fromIterable(['4', '2']);\n//   stream.listen((dado) {\n//     print('Novo evento: $dado');\n//   });\n//   print('fim main()');\n// }\n\nFuture<void> main() async {\n  print('início main()');\n  final stream = Stream.fromIterable(['4', '2']);\n  await for (var dado in stream) {\n    print('Novo evento: $dado');\n  }\n  print('fim main()');\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/15_stream_await_error/main.dart",
    "content": "void main() async {\n  print('início main()');\n  final stream = Stream.error(['Error']);\n  try {\n    await for (var dado in stream) {\n      print('Novo evento: $dado');\n    }\n  } catch (e) {\n    print('Erro capturado: $e');\n  }\n  print('fim main()');\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/16_stream_await_sem_encerramento/main.dart",
    "content": "import 'dart:async';\n\nvoid main() async {\n  print('início main()');\n  final controller = StreamController();\n  controller.sink.add('42');\n  await for (var dado in controller.stream) {\n    print('Novo evento: $dado');\n  }\n  print('fim main()');\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/17_stream_propriedades/main.dart",
    "content": "void main() {\n  final stream =\n      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();\n  stream.first.then(print); // > AA\n  stream.last.then(print); // > AU\n  stream.isEmpty.then(print); // > false\n  stream.length.then(print); // > 5\n  print(stream.isBroadcast); // > true\n  stream.single.catchError((e) => e.toString()).then(print);\n  // > Bad state: Too many elements\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/18_stream_metodos_busca/main.dart",
    "content": "void main() {\n  final stream =\n      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();\n  stream.elementAt(2).then(print); // > AI\n  stream\n      .firstWhere((valor) => valor.startsWith('A'),\n          orElse: () => 'Nenhum valor começa com A')\n      .then(print); //> AA\n  stream\n      .lastWhere((valor) => valor.startsWith('A'),\n          orElse: () => 'Nenhum valor termina com A')\n      .then(print); //> AU\n  stream\n      .singleWhere((valor) => valor.startsWith('A'))\n      .then(print)\n      .catchError(print);\n  // > Bad state: Too many elements\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/19_stream_metodos_validacao/main.dart",
    "content": "void main() {\n  final stream =\n      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();\n\n  stream.any((valor) => valor.endsWith('E')).then(print); // > true\n  stream.every((valor) => valor.startsWith('A')).then(print); // > true\n  stream.contains('AO').then(print); // > true\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/20_as_broadcast_stream/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  final single = controller.stream;\n  final broadcast = single.asBroadcastStream(onListen: (StreamSubscription s) {\n    print('Inscrição realizada');\n  }, onCancel: (StreamSubscription s) {\n    print('Todas inscrições canceladas');\n  });\n\n  final subscription = broadcast.listen(null);\n  subscription.onData((e) {\n    print('Novo elemento em broadcast $e');\n    subscription.cancel();\n  });\n\n  controller.sink.add('42');\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/21_distinct/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['A', 'A', 'I', 'I', 'A', 'U']);\n  final distinctStream = stream.distinct();\n  distinctStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/22_map/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable([4, 2]);\n  final mapStream = stream.map((e) => e * 2);\n  mapStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/23_expand/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['A', 'E']);\n  final expandStream = stream.expand((e) => [e, e]);\n  expandStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/24_async_map/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable([4, 2]);\n  final mapStream =\n      stream.asyncMap((e) => Future.delayed(Duration(seconds: 2), () => e * 2));\n  mapStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/25_async_expand/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['A', 'E']);\n  final expandStream = stream.asyncExpand((e) => Stream.fromIterable([e, e]));\n  expandStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/26_skip/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);\n  final skipStream = stream.skip(3);\n  skipStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/27_skip_while/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n  final skipStream = stream.skipWhile((e) => e <= 6);\n  skipStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/28_take/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);\n  final takeStream = stream.take(3);\n  takeStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/29_take_while/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n  final takeStream = stream.takeWhile((e) => e <= 3);\n  takeStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/30_where/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n  final whereStream = stream.where((e) => e % 2 == 0);\n  whereStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/31_timeout/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  controller.sink.add(4);\n  Timer(Duration(seconds: 3), () {\n    controller.sink.add(2);\n    controller.close();\n  });\n\n  final timeoutStream = controller.stream.timeout(\n    Duration(seconds: 2),\n    onTimeout: (sink) {\n      sink.add('Timeout excedido');\n    },\n  );\n\n  timeoutStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/32_to_list_to_set/main.dart",
    "content": "void main() {\n  final stream =\n      Stream.fromIterable(['A', 'E', 'E', 'O', 'O']).asBroadcastStream();\n  stream.toList().then(print);\n  stream.toSet().then(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/33_drain/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  controller.sink.add(4);\n  controller.sink.add(2);\n  controller.close();\n  controller.stream.drain('Stream encerrada').then(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/34_for_each/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable([4, 2]);\n  stream\n      .forEach((e) => print('Elemento: $e'))\n      .then((v) => print('Future completo'));\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/35_fold/main.dart",
    "content": "void main() {\n  final streamUm = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);\n  final streamDois = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n  streamUm.fold('Vogais->', (a, b) => '[$a,$b]').then(print);\n  streamDois.fold(10, (int a, int b) => a + b).then(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/36_reduce/main.dart",
    "content": "void main() {\n  final streamUm = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);\n  final streamDois = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n  streamUm.reduce((a, b) => '[$a,$b]').then(print);\n  streamDois.reduce((a, b) => a + b).then(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/37_join/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);\n  stream.join('-').then(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/38_cast/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  controller.sink.add(42);\n  final novaStream = controller.stream.cast<String>();\n  novaStream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/39_handle_error/main.dart",
    "content": "import 'dart:async';\n\nvoid main() async {\n  final controller = StreamController();\n  controller.sink.add('4');\n  controller.sink.addError('Erro');\n  controller.sink.add('2');\n  final streamError = controller.stream.handleError((e) {\n    print('Erro capturado $e');\n  });\n  await for (var dado in streamError) {\n    print('Novo evento: $dado');\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/40_pipe/main.dart",
    "content": "import 'dart:async';\n\nvoid main() async {\n  final controllerUm = StreamController();\n  controllerUm.sink.add('4');\n  controllerUm.sink.add('2');\n  controllerUm.close();\n  final controllerDois = StreamController();\n  controllerUm.stream\n      .pipe(controllerDois)\n      .then((v) => print('Eventos adicionados'));\n  controllerDois.stream.listen(print);\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/01_interface_stream_transformer/main.dart",
    "content": "import 'dart:async';\n\nclass AlfabetoTransformer implements StreamTransformer<String, String> {\n  AlfabetoTransformer({this.sufixo = '', this.prefixo = ''}) {\n    _controller = StreamController(\n        onListen: _onListen,\n        onCancel: _onCancel,\n        onPause: () => _subscription.pause,\n        onResume: () => _subscription.resume);\n  }\n\n  AlfabetoTransformer.broadcast({this.sufixo = '', this.prefixo = ''}) {\n    _controller =\n        StreamController.broadcast(onListen: _onListen, onCancel: _onCancel);\n  }\n\n  late StreamController<String> _controller;\n  late StreamSubscription<String> _subscription;\n  late Stream<String> _streamEntrada;\n  String sufixo;\n  String prefixo;\n\n  void _onListen() {\n    _subscription = _streamEntrada.listen(_onData,\n        onError: _controller.addError, onDone: _controller.close);\n  }\n\n  void _onCancel() {\n    _subscription.cancel();\n  }\n\n  void _onData(String dado) {\n    if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {\n      _controller.sink.add('$prefixo$dado$sufixo');\n    } else {\n      _controller.sink.addError('Elemento inválido');\n    }\n  }\n\n  @override\n  Stream<String> bind(Stream<String> stream) {\n    _streamEntrada = stream;\n    return _controller.stream;\n  }\n\n  @override\n  StreamTransformer<RS, RT> cast<RS, RT>() => StreamTransformer.castFrom(this);\n}\n\nvoid main() {\n  final stream = Stream\n      .fromIterable(['A', 'b', 'CC', 'D', '2', '@']\n  );\n  final streamTransformada = stream\n      .transform(AlfabetoTransformer(sufixo: ']', prefixo: '['));\n  streamTransformada.listen(print, onError: print);\n}"
  },
  {
    "path": "code/pt_Br/13_capitulo/02_construtor_stream_transformer/main.dart",
    "content": "import 'dart:async';\n\nStreamTransformer<String, String> criarTransformer({\n  String sufixo = '',\n  String prefixo = '',\n}) {\n  return StreamTransformer<String, String>(\n      (Stream<String> streamEntrada, bool cancelOnError) {\n    late StreamController<String> controller;\n    late StreamSubscription<String> subscription;\n    controller = StreamController<String>(\n      onListen: () {\n        subscription = streamEntrada.listen((dado) {\n          if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {\n            controller.sink.add('$prefixo$dado$sufixo');\n          } else {\n            controller.sink.addError('Elemento inválido');\n          }\n        },\n            onDone: controller.close,\n            onError: controller.addError,\n            cancelOnError: cancelOnError);\n      },\n      onPause: () => subscription.pause(),\n      onResume: () => subscription.resume(),\n      onCancel: () => subscription.cancel(),\n    );\n    return controller.stream.listen(null);\n  });\n}\n\nvoid main() {\n  final stream = Stream.fromIterable(['z', '0', '%', 'U']);\n  final streamTransformada =\n      stream.transform(criarTransformer(sufixo: '-', prefixo: '-'));\n  streamTransformada.listen(print, onError: print);\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/03_stream_transformer_base/main.dart",
    "content": "import 'dart:async';\n\nclass AlfabetoTransformer extends StreamTransformerBase<String, String> {\n  AlfabetoTransformer({\n    String sufixo = '',\n    String prefixo = '',\n  }) : _transformer = criarTransformer(sufixo, prefixo);\n  final StreamTransformer<String, String> _transformer;\n\n  @override\n  Stream<String> bind(Stream<String> stream) => _transformer.bind(stream);\n\n  static StreamTransformer<String, String> criarTransformer(\n      String sufixo, String prefixo) {\n    return StreamTransformer<String, String>(\n        (Stream<String> inputStream, bool cancelOnError) {\n      late StreamController<String> controller;\n      late StreamSubscription<String> subscription;\n      controller = StreamController<String>(\n        onListen: () {\n          subscription = inputStream.listen(\n            (dado) {\n              if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {\n                controller.sink.add('$prefixo$dado$sufixo');\n              } else {\n                controller.sink.addError('Elemento inválido');\n              }\n            },\n            onDone: controller.close,\n            onError: controller.addError,\n          );\n        },\n        onPause: () => subscription.pause(),\n        onResume: () => subscription.resume(),\n        onCancel: () => subscription.cancel(),\n      );\n      return controller.stream.listen(null);\n    });\n  }\n}\n\nvoid main() {\n  final stream = Stream.fromIterable(['FF', 'f', '42', '-']);\n  final streamTransformada =\n      stream.transform(AlfabetoTransformer(sufixo: '/', prefixo: '/'));\n  streamTransformada.listen(print, onError: print);\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/04_stream_transformer_from_handlers/main.dart",
    "content": "import 'dart:async';\n\nStreamTransformer<String, String> criarTransformer({\n  String sufixo = '',\n  String prefixo = '',\n}) {\n  return StreamTransformer.fromHandlers(\n      handleData: (String dado, EventSink<String> sink) {\n    if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {\n      sink.add('$prefixo$dado$sufixo');\n    } else {\n      sink.addError('Elemento inválido');\n    }\n  }, handleError:\n          (Object error, StackTrace stackTrace, EventSink<String> sink) {\n    sink.addError('Erro stream');\n  }, handleDone: (EventSink<String> sink) {\n    sink.add('Stream finalizada');\n  });\n}\n\nvoid main() {\n  StreamController<String>? controller;\n  controller = StreamController<String>(onListen: () {\n    controller!.sink.add('j');\n    controller.sink.add('42');\n    controller.sink.addError('Erro!');\n    controller.close();\n  });\n  final streamTransformada =\n      controller.stream.transform(criarTransformer(sufixo: '*', prefixo: '*'));\n  streamTransformada.listen(print, onError: print);\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/05_stream_transformer_from_bind/main.dart",
    "content": "import 'dart:async';\n\nclass AlfabetoTransformer extends StreamTransformerBase<String, String> {\n  AlfabetoTransformer({\n    String sufixo = '',\n    String prefixo = '',\n  }) : _transformer = criarTransformer(sufixo, prefixo);\n  final StreamTransformer<String, String> _transformer;\n\n  @override\n  Stream<String> bind(Stream<String> stream) => _transformer.bind(stream);\n\n  static StreamTransformer<String, String> criarTransformer(\n      String sufixo, String prefixo) {\n    return StreamTransformer<String, String>(\n        (Stream<String> inputStream, bool cancelOnError) {\n      late StreamController<String> controller;\n      late StreamSubscription<String> subscription;\n      controller = StreamController<String>(\n        onListen: () {\n          subscription = inputStream.listen(\n            (dado) {\n              if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {\n                controller.sink.add('$prefixo$dado$sufixo');\n              } else {\n                controller.sink.addError('Elemento inválido');\n              }\n            },\n            onDone: controller.close,\n            onError: controller.addError,\n          );\n        },\n        onPause: () => subscription.pause(),\n        onResume: () => subscription.resume(),\n        onCancel: () => subscription.cancel(),\n      );\n      return controller.stream.listen(null);\n    });\n  }\n}\n\nfinal alfabetoMinusculoTransformer = StreamTransformer.fromBind(\n    (Stream<String> stream) => stream\n        .transform(AlfabetoTransformer(sufixo: '}', prefixo: '{'))\n        .map((dado) => dado.toLowerCase()));\n\nvoid main() {\n  final stream = Stream.fromIterable(['F', 'f', '42', 'J']);\n  final streamTransformada = stream.transform(alfabetoMinusculoTransformer);\n  streamTransformada.listen(print, onError: print);\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/06_problema_inscricao_unica/main.dart",
    "content": "void main() {\n  final stream = Stream.fromIterable(['Stream', 'inscrição', 'única']);\n  stream.first.then(print); // > Stream\n  // stream.listen(null); // > Bad state: Stream has already been listened to.\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/07_sem_perda_eventos/main.dart",
    "content": "import 'dart:async';\n\nStream<int> get streamNumeros {\n  final controller = StreamController<int>();\n  var i = 1;\n  Timer.periodic(Duration(seconds: 1), (timer) {\n    if (i == 10) timer.cancel();\n    controller.sink.add(i++);\n  });\n  return controller.stream;\n}\n\nvoid main() {\n  final stream = streamNumeros;\n  Future.delayed(Duration(seconds: 5), () {\n    stream.listen(print);\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/08_perda_eventos_broadcast/main.dart",
    "content": "import 'dart:async';\n\nStream<int> get streamNumeros {\n  final controller = StreamController<int>.broadcast();\n  var i = 1;\n  Timer.periodic(Duration(seconds: 1), (timer) {\n    if (i == 10) timer.cancel();\n    controller.sink.add(i++);\n  });\n  return controller.stream;\n}\n\nvoid main() {\n  final stream = streamNumeros;\n  Future.delayed(Duration(seconds: 7), () {\n    stream.listen((e) {\n      print('Inscrição A $e');\n    });\n  });\n  Future.delayed(Duration(seconds: 9), () {\n    stream.listen((e) {\n      print('Inscrição B $e');\n    });\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/09_broadcast_subscription_buffer/main.dart",
    "content": "import 'dart:async';\n\nStream<int> get streamNumeros {\n  final controller = StreamController<int>.broadcast();\n  var i = 1;\n  Timer.periodic(Duration(seconds: 1), (timer) {\n    if (i == 10) timer.cancel();\n    controller.sink.add(i++);\n  });\n  return controller.stream;\n}\n\nvoid main() {\n  final stream = streamNumeros;\n  Future.delayed(Duration(seconds: 2), () {\n    final inscricao = stream.listen(print);\n    Future.delayed(Duration(seconds: 2), () {\n      inscricao.pause();\n      Future.delayed(Duration(seconds: 3), () {\n        inscricao.resume();\n      });\n    });\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/10_geradores_sincronos_yield/main.dart",
    "content": "import 'dart:io';\n\nIterable<int> numeros() sync* {\n  print('Gerador iniciado');\n  for (int i = 0; i < 3; i++) {\n    sleep(Duration(seconds: 2));\n    yield i;\n  }\n  print('Gerador finalizado');\n}\n\nvoid main() {\n  print('Início main');\n  final iterable = numeros();\n  print('Começo iteração:');\n  Iterator i = iterable.iterator;\n  while (i.moveNext()) print('Número: ${i.current}');\n  print('Término main');\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/11_geradores_sincronos_yield_*/main.dart",
    "content": "Iterable<dynamic> letrasNumeros() sync* {\n  for (int i = 1; i < 3; i++) yield i;\n  yield* letras();\n}\n\nIterable<String> letras() sync* {\n  yield* ['A', 'B'];\n}\n\nvoid main() async {\n  for (var i in letrasNumeros()) print('Valor: ${i}');\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/12_geradores_assincronos_yield/main.dart",
    "content": "Stream<int> numeros() async* {\n  print('Gerador iniciado');\n  for (int i = 0; i < 3; i++) {\n    await Future.delayed(Duration(seconds: 2));\n    yield i;\n  }\n  print('Gerador finalizado');\n}\n\nvoid main() {\n  print('Início main');\n  final stream = numeros();\n  stream.listen((i) => print('Número: $i'));\n  print('Término main');\n}"
  },
  {
    "path": "code/pt_Br/13_capitulo/13_geradores_assincronos_yield_*/main.dart",
    "content": "Stream<dynamic> letrasNumeros() async* {\n  yield* letras();\n  for (int i = 1; i < 3; i++) yield i;\n}\n\nStream<String> letras() async* {\n  yield* Stream.fromIterable(['A', 'B']);\n}\n\nvoid main() async {\n  await for (var i in letrasNumeros()) print('Valor: ${i}');\n}\n"
  },
  {
    "path": "code/pt_Br/13_capitulo/14_server/main.dart",
    "content": "import 'dart:io';\n\nvoid main() async {\n  var server = await HttpServer.bind('127.0.0.1', 8080);\n  await for (HttpRequest request in server) {\n    request.response.write('Primeiro server em Dart!');\n    await request.response.close();\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/01_isolate/main.dart",
    "content": "import 'dart:isolate';\n\nvoid main() async {\n  Isolate mainIsolate = Isolate.current;\n  print('Executando na isolate: {${mainIsolate.debugName}}');\n  mainIsolate.kill(priority: Isolate.immediate);\n  print('fim do main()');\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/02_nova_isolate/main.dart",
    "content": "import 'dart:isolate';\n\nvoid main() async {\n  Isolate mainIsolate = Isolate.current;\n  print('Executando na isolate: {${mainIsolate.debugName}}');\n  await Isolate.spawn(funcaoEntrada, 'Olá nova Isolate.',\n      debugName: 'novaIsolate');\n\n\n      Isolate.run(computation)\n}\n\nvoid funcaoEntrada(String parametro) {\n  final isolate = Isolate.current;\n  print('Executando na isolate: {${isolate.debugName}}');\n  print('Parâmetro: $parametro');\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/03_unidirecional_unica/main.dart",
    "content": "import 'dart:isolate';\n\nvoid main() async {\n  final receivePort = ReceivePort();\n  await Isolate.spawn(workerIsolate, receivePort.sendPort);\n  receivePort.first.then((dado) => print('Mensagem recebida: $dado'));\n}\n\nvoid workerIsolate(SendPort sendPort) async {\n  final resposta =\n      await Future.delayed(Duration(seconds: 2), () => 'Conteúdo do arquivo');\n  Isolate.exit(sendPort, resposta);\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/04_unidirecional_frequente/main.dart",
    "content": "import 'dart:async';\nimport 'dart:isolate';\n\nvoid main() async {\n  final receivePort = ReceivePort();\n  await Isolate.spawn(workerIsolate, receivePort.sendPort);\n  receivePort.listen((dado) {\n    print('Mensagem recebida: $dado');\n  });\n}\n\nvoid workerIsolate(SendPort sendPort) async {\n  sendPort.send('Upload iniciado');\n  Timer.periodic(Duration(milliseconds: 100), (timer) {\n    if (timer.tick % 10 == 0) sendPort.send('Upload ${timer.tick} % ');\n    if (timer.tick == 100) {\n      timer.cancel();\n      sendPort.send('Upload encerrado');\n    }\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/05_bidirecional/main.dart",
    "content": "import 'dart:async';\nimport 'dart:isolate';\n\nFuture<SendPort> isolateBidirecional(\n    ReceivePort receivePort, void onMessage(var message)) async {\n  final completer = Completer<SendPort>();\n  print('[MAIN Isolate]: Iniciado comunicação, aguardando handshake');\n  receivePort.listen((mensagem) {\n    if (mensagem is SendPort) {\n      completer.complete(mensagem);\n    } else {\n      onMessage(mensagem);\n    }\n  });\n  await Isolate.spawn(novaIsolate, receivePort.sendPort);\n  return completer.future;\n}\n\nvoid novaIsolate(SendPort sendPort) {\n  print(\n      '[NOVA Isolate]: Solicitação de comunicação recebida, enviando resposta');\n  final receivePort = ReceivePort();\n  receivePort.listen((mensagem) {\n    print('[NOVA Isolate]: Mensagem recebida $mensagem');\n  });\n  sendPort.send(receivePort.sendPort);\n  Timer.periodic(Duration(seconds: 2), (timer) {\n    sendPort.send(timer.tick);\n    if (timer.tick == 10) timer.cancel();\n  });\n}\n\nvoid main() async {\n  final receivePort = ReceivePort();\n  SendPort sendPort = await isolateBidirecional(receivePort, (mensagem) {\n    print('[MAIN Isolate]: Mensagem recebida $mensagem');\n  });\n  print(\n      '[MAIN Isolate]: Handshake concluído, comunicação bidirecional estabelecida.');\n  Timer.periodic(Duration(seconds: 1), (timer) {\n    sendPort.send(timer.tick);\n    if (timer.tick == 10) timer.cancel();\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/06_controle_isolate/main.dart",
    "content": "import 'dart:async';\nimport 'dart:isolate';\n\nvoid main() async {\n  final receivePort = ReceivePort();\n  final isolate = await Isolate.spawn(novaIsolate, receivePort.sendPort);\n  final capability = Capability();\n  Future.delayed(Duration(seconds: 1), () {\n    isolate.pause(capability);\n  });\n  Future.delayed(Duration(seconds: 3), () {\n    isolate.resume(capability);\n  });\n  receivePort.listen((dado) {\n    print('Mensagem recebida: $dado');\n    if (dado == 7) {\n      isolate.kill(priority: Isolate.immediate);\n      receivePort.close();\n    }\n  });\n}\n\nvoid novaIsolate(SendPort sendPort) async {\n  Timer.periodic(Duration(milliseconds: 500), (timer) {\n    sendPort.send(timer.tick);\n  });\n}"
  },
  {
    "path": "code/pt_Br/14_capitulo/07_isolate_listeners/main.dart",
    "content": "import 'dart:async';\nimport 'dart:isolate';\n\nvoid main() async {\n  final receivePort = ReceivePort();\n  receivePort.listen((dado) {\n    print('Mensagem recebida: $dado');\n  });\n  final isolate = await Isolate.spawn(novaIsolate, receivePort.sendPort,\n      errorsAreFatal: true);\n  isolate.addOnExitListener(receivePort.sendPort,\n      response: 'Isolate finalizada');\n  isolate.addErrorListener(receivePort.sendPort);\n  Future.delayed(Duration(seconds: 1), () {\n    isolate.ping(receivePort.sendPort, response: 'Ping com sucesso');\n  });\n}\n\nvoid novaIsolate(SendPort sendPort) async {\n  Future.delayed(Duration(seconds: 2), () {\n    throw TimeoutException('Exceção na isolate');\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/08_spawn_uri/isolate.dart",
    "content": "import 'dart:isolate';\n\nvoid main(List<String> args, SendPort sendPort) {\n  print('[${Isolate.current.debugName}] - Args {$args}');\n  sendPort.send('Esse livro é muito massa mesmo!');\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/08_spawn_uri/main.dart",
    "content": "import 'dart:isolate';\n\nvoid main() async {\n  final receivePort = ReceivePort();\n  receivePort.listen((dado) {\n    print('[IsolatePrincipal] - $dado');\n  });\n  await Isolate.spawnUri(\n      Uri.parse('isolate.dart'), ['Args 1', 'Args 2'], receivePort.sendPort,\n      debugName: 'IsolateSeparada');\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/09_isolate_run/main.dart",
    "content": "import 'dart:convert';\nimport 'dart:isolate';\n\nvoid main() async {\n  final (int id, String cliente) = await Isolate.run(() async {\n    final json = await Future.delayed(Duration(seconds: 2), () {\n      return '{\"id\": 42,\"cliente\": \"Elon Musk\"}';\n    });\n    \n    final dados = jsonDecode(json);\n    return (dados['id'] as int, dados['cliente'] as String);\n  });\n\n  print('Cliente mais rico: [id: $id, nome: $cliente]');\n}"
  },
  {
    "path": "code/pt_Br/14_capitulo/10_zone_root/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final root = Zone.current;\n  print(root); // > Instance of '_RootZone'\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/11_nova_zone/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final root = Zone.current;\n  print('Zone principal: $root');\n  final novaZone = root.fork();\n  novaZone.run(() {\n    print('Zone nova: ${Zone.current}');\n    print('Zone nova pai: ${Zone.current.parent}');\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/12_run_zoned/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  runZoned(() {\n    print('Zone nova: ${Zone.current}');\n    print('Zone nova pai: ${Zone.current.parent}');\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/13_hierarquia_zones/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  a();\n  Future? future;\n  runZoned(() {\n    future = Future(a).then(b);\n  });\n  future?.then(c);\n}\n\na() => print('a');\n\nb(valor) => runZoned(() => a());\n\nc(valor) => print('c');\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/14_zone_livre_erros/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  runZonedGuarded(() {\n    mainZonedGuarded();\n  }, (e, s) {\n    print('Erro capturado: $e');\n  });\n}\n\nvoid mainZonedGuarded() {\n  Future(() => throw TimeoutException('Um erro qualquer'));\n  Future(() => throw 'Outro erro qualquer');\n  Future(() => throw 'Mais um erro qualquer');\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/15_propagacao_erros_zones/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  runZonedGuarded(() {\n    runZoned(() {\n      Future(() => throw TimeoutException('Um erro qualquer na zone#3'));\n    });\n  }, (e, s) {\n    print('Erro capturado na zone#2 $e');\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/16_propagacao_erros_zones_2/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  Future? future;\n  runZonedGuarded(() {\n    future = Future(() => throw TimeoutException('Um erro qualquer'));\n  }, (e, s) {\n    print('Erro capturado na zone $e');\n  });\n  future!.catchError((e) => print('Nunca executa'));\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/17_propagacao_erros_zones_3/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  final future = Future(() => throw TimeoutException('Um erro qualquer'));\n  future.whenComplete(() => print('whenComplete zone#1'));\n  runZonedGuarded(() {\n    future.whenComplete(() => print('whenComplete zone#2'));\n    print('Dentro zone#2');\n  }, (e, s) {\n    print('Erro capturado na zone#2 $e');\n  });\n  runZoned(() {\n    future.whenComplete(() => print('whenComplete zone#3'));\n  });\n}\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/18_valores_locais_zones/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  runZoned(() {\n    print(Zone.current['resposta']); // > 42\n  }, zoneValues: {'resposta': 42});\n\n  /// Usando symbol como chave\n  runZoned(() {\n    print(Zone.current[#resposta]); // > 42\n  }, zoneValues: {#resposta: 42});\n\n  /// Sobrescrevendo valores globais\n  runZoned(() {\n    logZone();\n    runZoned(() {\n      logZone();\n      print('Resposta ${Zone.current[#resposta]}');\n    }, zoneValues: {#nomeZone: 'Zone B'});\n  }, zoneValues: {#nomeZone: 'Zone A', #resposta: 42});\n}\n\nvoid logZone() => print('Rodando na ${Zone.current[#nomeZone]}');\n"
  },
  {
    "path": "code/pt_Br/14_capitulo/19_zone_specification/main.dart",
    "content": "import 'dart:async';\n\nvoid main() {\n  runZoned(() {\n    print('Teste log');\n    print('42');\n  }, zoneSpecification: ZoneSpecification(\n      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {\n    parent.print(zone, '${DateTime.now()} - $line');\n  }));\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/01_criacao_diretorio/main.dart",
    "content": "import 'dart:io';\n\nFuture<void> main() async {\n  final dir = Directory('dir/teste');\n  await dir.create(recursive: true);\n  print('Diretórios criados: $dir');\n  // > Diretórios criados: Directory: 'dir/teste'\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/02_remocao_diretorio/main.dart",
    "content": "import 'dart:io';\n\nFuture<void> main() async {\n  final dir = Directory('dir/teste');\n  // await dir.create(recursive: true);\n\n  if (await dir.exists()) {\n    await dir.delete(recursive: true);\n    print('Diretório removido: $dir');\n    // > Diretório removido: Directory: 'dir/teste'\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/03_criacao_arquivo/main.dart",
    "content": "import 'dart:io';\n\nFuture<void> main() async {\n  final file = File('teste.txt');\n  await file.create();\n  print('Arquivo criado: $file'); // > Arquivo criado: File: 'teste.txt'\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/03_criacao_arquivo/teste.txt",
    "content": ""
  },
  {
    "path": "code/pt_Br/15_capitulo/04_escrita_arquivo/main.dart",
    "content": "import 'dart:io';\nimport 'dart:convert';\n\nFuture<void> main() async {\n  final file = File('teste.txt');\n  await file.writeAsString('linha um', encoding: Utf8Codec());\n  await file.writeAsString('\\nlinha dois', mode: FileMode.append);\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/04_escrita_arquivo/teste.txt",
    "content": "linha um\nlinha dois"
  },
  {
    "path": "code/pt_Br/15_capitulo/05_escrita_arquivo_sob_demanda/main.dart",
    "content": "import 'dart:io';\n\nFuture<void> main() async {\n  final file = File('teste.txt');\n  IOSink sink = file.openWrite(mode: FileMode.write);\n  await for (String texto in gerarStream()) {\n    sink.write(texto);\n    await sink.flush();\n  }\n  await sink.close();\n}\n\nStream<String> gerarStream() async* {\n  for (int i = 0; i <= 10; i++) {\n    await Future.delayed(Duration(seconds: 1));\n    yield '$i\\n';\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/05_escrita_arquivo_sob_demanda/teste.txt",
    "content": "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/06_ler_arquivo/main.dart",
    "content": "import 'dart:io';\nimport 'dart:convert';\n\nFuture<void> main() async {\n  final file = File('teste.txt');\n  String texto = await file.readAsString(encoding: Utf8Codec());\n  print(texto);\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/06_ler_arquivo/teste.txt",
    "content": "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/07_ler_arquivo_sob_demanda/main.dart",
    "content": "import 'dart:io';\nimport 'dart:convert';\n\nFuture<void> main() async {\n  final file = File('teste.txt');\n  Stream<List<int>> streamBytes = file.openRead();\n  Stream<String> linhas =\n      utf8.decoder.bind(streamBytes).transform(LineSplitter());\n  await for (var linha in linhas) {\n    print('Valor da linha: ${linha}');\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/15_capitulo/07_ler_arquivo_sob_demanda/teste.txt",
    "content": "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/02_imc/main.dart",
    "content": "void main() {\n  int idade = 26;\n  double altura = 1.71; // centimetros\n  double peso = 64.2; // quilogramas\n\n  double imc = peso / (altura * altura);\n  print('IMC: $imc');\n\n  if (idade < 20) {\n    /// crianças/adolescentes\n    if (imc < 13) {\n      print('Abaixo do peso');\n    } else if (imc >= 13 && imc < 16.8) {\n      print('Peso normal ideal');\n    } else if (imc >= 16.8 && imc < 18.3) {\n      print('Sobrepeso');\n    } else {\n      print('Obesidade');\n    }\n  } else if (idade >= 20 && idade < 59) {\n    /// adultos\n    if (imc < 18.5) {\n      print('Abaixo do peso');\n    } else if (imc >= 18.5 && imc < 25) {\n      print('Peso normal ideal');\n    } else if (imc >= 25 && imc < 30) {\n      print('Sobrepeso');\n    } else if (imc >= 30 && imc < 35) {\n      print('Obesidade grau 1');\n    } else if (imc >= 35 && imc < 40) {\n      print('Obesidade grau 2');\n    } else {\n      print('Obesidade grau 3');\n    }\n  } else {\n    /// idosos\n    if (imc < 22) {\n      print('Abaixo do peso');\n    } else if (imc >= 22 && imc < 27) {\n      print('Peso normal ideal');\n    } else {\n      print('Obesidade');\n    }\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/03_benchmark_strings/main.dart",
    "content": "/*\nCom 9999 Strings:\n0:00:00.007252 : StringBuffer\n0:00:00.178047 : Concatenação\n\nCom 99999 Strings\n0:00:00.020247 : StringBuffer\n0:03:59.309432 : Concatenação\n*/\nconst quantidade = 9999;\n\nvoid main() {\n  print(\"Benchmarking $quantidade strings\");\n\n  print(\"${medir(usarStringBuffer)} : StringBuffer\");\n  print(\"${medir(usarConcatenacao)} : Concatenação\");\n}\n\nDuration medir(Function fn) {\n  final sw = Stopwatch();\n  sw.start();\n  fn();\n  return sw.elapsed;\n}\n\nvoid usarStringBuffer() {\n  var hodor = new StringBuffer();\n\n  for (var i = quantidade; i > 0; i--) {\n    hodor.write(i.toString());\n    hodor.write(\" hold the door\\n\");\n  }\n\n  hodor.toString();\n}\n\nvoid usarConcatenacao() {\n  var hodor = '';\n\n  for (var i = quantidade; i > 0; i--) {\n    hodor += i.toString();\n    hodor += \" hold the door\\n\";\n  }\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/03_circunferencia/main.dart",
    "content": "import 'dart:io';\nimport 'dart:math';\n\nfinal dynamic a = 'dinâmica?';\nconst dynamic b = 'dinâmica?';\n\n\nvoid main() {\n  print(\"------ Cálculo de circunferência ------\");\n\n  print(\"> Qual o raio para cálculo?\");\n  final raio = double.tryParse(stdin.readLineSync() ?? '');\n  //tryParse() retorna null caso não consiga converter para double\n\n  if(raio == null) {\n    print('Esse não é um valor de raio válido..');\n    exit(0); //Finaliza o programa\n  }\n\n  print('A circunferência é: ${2 * raio * pi}');\n  // pi é uma constante de dart:math\n\n  print(\"------------------------\");\n}\n\nclass A {\n  final dynamic a = 'dinâmica?';\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/03_regex_cpf/main.dart",
    "content": "void main() {\n  final regExp = RegExp(r'^\\d{3}\\.?\\d{3}\\.?\\d{3}\\-?\\d{2}$');\n\n  print(regExp.hasMatch('000'));\n  print(regExp.hasMatch('000111222333'));\n  print(regExp.hasMatch('000.111.222-333'));\n  print(regExp.hasMatch('000.111.22299'));\n  print(regExp.hasMatch('000.111.222-99'));\n  print(regExp.hasMatch('000111222-99'));\n  print(regExp.hasMatch('00011122299'));\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao/main.dart",
    "content": "import 'dart:io';\n\nmain() {\n  print('Insira o número para cálculo do fatorial:');\n  final numero = int.tryParse(stdin.readLineSync() ?? '') ?? 0;\n\n  print('Resultado: ${fatorial(numero)}');\n}\n\n/// Modo 1:\nint fatorial(int numero) {\n if(numero == 0) return 1; // regra especial 0! = 1\n return numero * fatorial(numero - 1);\n}\n\n/// Modo 2:\n// int fatorial(int numero) => numero == 0 ? 1 : numero * fatorial(numero - 1);"
  },
  {
    "path": "code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao_closure/main.dart",
    "content": "import 'dart:io';\n\nmain() {\n  print('Insira o número para cálculo do fatorial:');\n  final numero = int.tryParse(stdin.readLineSync() ?? '') ?? 0;\n\n  print('Resultado: ${calcularFatorial(numero)}');\n}\n\n/// Modo 1:\nint calcularFatorial(int numero) {\n int fatorial(int numero) {\n   if (numero == 0) return 1; // regra especial 0! = 1\n   return numero * fatorial(numero - 1);\n }\n\n return fatorial(numero);\n}\n\n/// Modo 2:\n// int calcularFatorial(int numero) {\n//   int fatorial(int numero) => numero == 0 ? 1 : numero * fatorial(numero - 1);\n//\n//   return fatorial(numero);\n// }\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/05_try_catch_rethrow/main.dart",
    "content": "void main() {\n  try {\n    buscarUsuario();\n  } catch (e, s) {\n    print(e);\n    print(s.toString());\n    print('Catch de erro global');\n  }\n}\n\nvoid buscarUsuario() {\n  try {\n    buscarUsuarioCache();\n    buscarUsuarioBancoDados();\n  } catch (e) {\n    if (e is CacheException) {\n      print('Não trataremos erro de cache nesse método..');\n\n      /// Um throw e; não mantém o stacktrace original.\n      // throw e;\n      rethrow;\n    }\n\n    print('Tratando demais erros.');\n  }\n}\n\nvoid buscarUsuarioCache() {\n  throw CacheException('erro ao buscar o usuário no cache');\n}\n\nvoid buscarUsuarioBancoDados() {}\n\nclass CacheException implements Exception {\n  final String mensagem;\n\n  const CacheException(this.mensagem);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/08_construtor_inicializadores/main.dart",
    "content": "import 'dart:math';\n\nclass Circunferencia {\n  final double resultado;\n\n  /// Inicializar valores e utilizar assert\n  Circunferencia(double raio)\n      : resultado = 2 * pi * raio,\n        assert(raio >= 0);\n}\n\nclass Subclasse extends Circunferencia {\n  /// Chamada para construtor de superclasse\n  Subclasse(double raio) : super(raio);\n}\n\nvoid main() {\n  final c = Circunferencia(5);\n  print(c.resultado);\n\n  final s = Subclasse(5);\n  print(s.resultado);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/08_redirecionando_construtores/main.dart",
    "content": "class Coordenada {\n  int x, y;\n\n  Coordenada(this.x, this.y);\n\n  /// Redireciona para o construtor padrão\n  Coordenada.inicio() : this(0, 0);\n\n  /// Redireciona para o construtor padrão\n  Coordenada.xZero(int y) : this(0, y);\n\n  /// Redireciona para o construtor padrão\n  Coordenada.yZero(int x) : this(x, 0);\n\n  String toString() {\n    return 'Coordenada{x: $x, y: $y}';\n  }\n}\n\nvoid main() {\n  final um = Coordenada(42, 42);\n  final dois = Coordenada.inicio();\n  final tres = Coordenada.xZero(42);\n  final quatro = Coordenada.yZero(42);\n\n  print(um);\n  print(dois);\n  print(tres);\n  print(quatro);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/08_singleton/main.dart",
    "content": "/// Singleton com Factory\nclass SingletonUm {\n  SingletonUm._();\n\n  static final SingletonUm _instance = SingletonUm._();\n\n  factory SingletonUm() {\n    return _instance;\n  }\n}\n\n/// Singleton com get\nclass SingletonDois {\n  SingletonDois._();\n\n  static final SingletonDois _instance = SingletonDois._();\n\n  static SingletonDois get instance {\n    return _instance;\n  }\n}\n\n/// Singleton com static\nclass SingletonTres {\n  SingletonTres._();\n\n  static final SingletonTres instance = SingletonTres._();\n}\n\nvoid main() {\n  SingletonUm a = SingletonUm();\n  SingletonUm b = SingletonUm();\n  print('SingletonUm identical: ${identical(a, b)}');\n\n  SingletonDois c = SingletonDois.instance;\n  SingletonDois d = SingletonDois.instance;\n  print('SingletonDois identical: ${identical(c, d)}');\n\n  SingletonTres e = SingletonTres.instance;\n  SingletonTres f = SingletonTres.instance;\n  print('SingletonTres identical: ${identical(e, f)}');\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/09_bidirectional_iterator/main.dart",
    "content": "\nclass BidirectionalIteratorList<E> {\n  BidirectionalIteratorList(Iterable<E> iterable, {bool back = false})\n      : _iterable = iterable,\n        _length = iterable.length,\n        _index = back ? iterable.length - 1 : 0;\n\n  final Iterable<E> _iterable;\n  final int _length;\n  int _index;\n  E? _current;\n\n  get current => _current;\n\n  bool moveNext() {\n    int length = _iterable.length;\n    if (_length != length) throw ConcurrentModificationError(_iterable);\n    if (_index >= length) {\n      _current = null;\n      return false;\n    }\n    _current = _iterable.elementAt(_index);\n    _index++;\n    return true;\n  }\n\n  bool movePrevious() {\n    int length = _iterable.length;\n    if (_length != length) throw ConcurrentModificationError(_iterable);\n    if (_index < 0) {\n      _current = null;\n      return false;\n    }\n    _current = _iterable.elementAt(_index);\n    _index--;\n    return true;\n  }\n}\n\nvoid main() {\n  final risadas = ['kkk', 'haha', 'rsrs'];\n\n  print('Ordem natural:');\n  final iteratorNext = BidirectionalIteratorList(risadas);\n  while (iteratorNext.moveNext()) print(iteratorNext.current);\n\n  print('Ordem trás pra frente:');\n  final iteratorPrevious = BidirectionalIteratorList(risadas, back: true);\n  while (iteratorPrevious.movePrevious()) print(iteratorPrevious.current);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/09_programador_comparable/main.dart",
    "content": "class Programador implements Comparable<Programador> {\n  Programador({required this.nome, required this.salario});\n\n  String nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  void trabalhar() {}\n\n  int compareTo(Programador other) {\n//    return salario.compareTo(other.salario); //CompareTo salário\n    return nome.compareTo(other.nome);\n  }\n\n  String toString() => 'Programador{nome: $nome, salario: $salario}';\n}\n\nvoid main() {\n  final programadores = [\n    Programador(nome: 'James Gosling', salario: 3000),\n    Programador(nome: 'Bill Gates', salario: 5000),\n    Programador(nome: 'Larry Page', salario: 2000),\n  ];\n  print('Lista sem ordem: $programadores');\n  programadores.sort();\n  print('Lista sorteada: $programadores');\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/09_teoria_conjuntos_set/main.dart",
    "content": "void main() {\n  final a = {'c', 'a', 'r', 'e', 't'};\n  final b = {'a', 'e', 'i', 'o', 'u'};\n  print('Conjunto a: $a');\n  print('Conjunto b: $b');\n\n  // União\n  print('União de a e b: ${a.union(b)}');\n\n  // Interseção\n  print('Interseção de a e b: ${a.intersection(b)}');\n\n  // Diferença\n  print('Diferença de a e b: ${a.difference(b)}');\n  print('Diferença de b e a: ${b.difference(a)}');\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/10_microtask_infinita/main.dart",
    "content": "import 'dart:async';\n\nimport 'dart:io';\n\nint counter = 0;\n\n/// O Future nunca é executado por conta da prioridade da microtask queue\nmain() {\n  print('Início main()');\n  criarMicrotask();\n  Future(() => 42).then(print);\n  print('Fim main()');\n}\n\ncriarMicrotask() {\n  scheduleMicrotask(() {\n    counter++;\n    print('microtask $counter');\n    sleep(Duration(seconds: 1));\n    criarMicrotask();\n  });\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/13_gerador_divisores/main.dart",
    "content": "import 'dart:io';\n\nStream<int> divisores(int numero) async* {\n  for (int i = 1; i <= numero; i++) {\n    if (numero % i == 0) yield i;\n  }\n}\n\nFuture<void> main() async {\n  print('Insira o valor:');\n  final numero = int.parse(stdin.readLineSync()!);\n\n  print('Todos os divisores de $numero:');\n  await for (final e in divisores(numero)) {\n    print('Número: $e');\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/13_gerador_valores_impar/main.dart",
    "content": "Stream<int> numerosImpar() async* {\n  for (int i = 0; i < 1000; i++) {\n    if (i % 2 != 0) yield i;\n  }\n}\n\nFuture<void> main() async {\n  print('Todos os valores ímpares de 0 a 1000:');\n  await for (final e in numerosImpar()) {\n    print('Número: $e');\n  }\n  print('Fim');\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/13_stream_transformer_email/main.dart",
    "content": "import 'dart:async';\n\nconst emailPattern =\n    r'^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$';\n\nStreamTransformer<String, String> transformerEmail() {\n  return StreamTransformer.fromHandlers(\n      handleData: (String dado, EventSink<String> sink) {\n    final regExp = RegExp(emailPattern);\n\n    if (regExp.hasMatch(dado)) {\n      sink.add('E-mail válido: $dado');\n    } else {\n      sink.addError('---> Inválido: $dado');\n    }\n  }, handleError:\n          (Object error, StackTrace stackTrace, EventSink<String> sink) {\n    sink.addError('Erro stream');\n  }, handleDone: (EventSink<String> sink) {\n    sink.add('Stream finalizada');\n  });\n}\n\nvoid main() {\n  StreamController<String>? controller;\n  controller = StreamController<String>(onListen: () {\n    controller!.sink.add('jhb@aaa');\n    controller.sink.add('jhb@gmail.com');\n    controller.sink.add('peter-parker@marvel.com');\n    controller.sink.add('julio.gmail.com');\n    controller.close();\n  });\n  final streamEmail = controller.stream.transform(transformerEmail());\n  streamEmail.listen(print, onError: print);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/13_stream_transformer_telefone/main.dart",
    "content": "import 'dart:async';\n\nconst telefonePattern =\n    r'^(?:(?:\\+|00)?(55)\\s?)?(?:(?:\\(?[1-9][0-9]\\)?)?\\s?)?(?:((?:9\\d|[2-9])\\d{3})-?(\\d{4}))$';\n\nStreamTransformer<String, String> transformerTelefone() {\n  return StreamTransformer.fromHandlers(\n      handleData: (String dado, EventSink<String> sink) {\n    final regExp = RegExp(telefonePattern);\n\n    if (regExp.hasMatch(dado)) {\n      sink.add('Telefone válido: $dado');\n    } else {\n      sink.addError('---> Inválido: $dado');\n    }\n  }, handleError:\n          (Object error, StackTrace stackTrace, EventSink<String> sink) {\n    sink.addError('Erro stream');\n  }, handleDone: (EventSink<String> sink) {\n    sink.add('Stream finalizada');\n  });\n}\n\nvoid main() {\n  StreamController<String>? controller;\n  controller = StreamController<String>(onListen: () {\n    controller!.sink.add('4891883344');\n    controller.sink.add('(473) 998735467');\n    controller.sink.add('47991433265');\n    controller.sink.add('(47) 998735467');\n    controller.sink.add('473998735467');\n    controller.sink.add('554891883344');\n    controller.close();\n  });\n  final streamEmail = controller.stream.transform(transformerTelefone());\n  streamEmail.listen(print, onError: print);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/14_isolate_bidirecional_stream_channel/main.dart",
    "content": "import 'dart:isolate';\n\nimport 'package:stream_channel/isolate_channel.dart';\n\nvoid main(args) async {\n  final receivePort = ReceivePort();\n  final channel = IsolateChannel.connectReceive(receivePort);\n  channel.stream.listen((data) {\n    print('<mainIsolate> mensagem recebida: $data');\n  });\n  await Isolate.spawn(novaIsolate, receivePort.sendPort);\n  channel.sink.add('Alguém ta me ouvindo? Câmbio desligo.');\n}\n\nvoid novaIsolate(SendPort sPort) {\n  final channel = IsolateChannel.connectSend(sPort);\n  channel.stream.listen((data) {\n    print('<novaIsolate> mensagem recebida: $data');\n  });\n  channel.sink.add('Oi isolate main. Câmbio desligo.');\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/14_isolate_bidirecional_stream_channel/pubspec.yaml",
    "content": "name: isolate_bidirecional\ndescription: Comunicação bidirecional em isolates pelo stream_channel.\nversion: 1.0.0\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  stream_channel: ^2.1.0\n\ndev_dependencies:\n  lints: ^1.0.0\n  test: ^1.16.0\n\nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/bin/climatempo.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/alerta_server.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/log.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) {\n  runZonedGuarded(() {\n    executar(args);\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s);\n  });\n}\n\nFuture<void> executar(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  if (comando != null && comando.name == 'cidade') {\n    final nomeCidade = comando['nome'];\n    final estado = comando['estado'];\n    final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n    if (comando['salvar']) await salvarCidadesIsolate(cidades);\n    cidades.forEach((c) => print(c));\n  }\n\n  if (comando != null && comando.name == 'agora') {\n    final id = comando['id'];\n    if (id == null) {\n      print('É obrigatório informar um [-id] de cidade');\n      exit(2);\n    }\n    final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n    if (comando['salvar']) await salvarTempoIsolate(tempo);\n    print(tempo);\n  }\n\n  if (comando != null && comando.name == 'alerta') {\n    AlertaServer().start().listen(print);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand('alerta')\n    ..addCommand(\n      'cidade',\n      ArgParser()\n        ..addOption('nome',\n            abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n        ..addOption('estado',\n            abbr: 'e', valueHelp: 'Sigla do estado para consulta')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addCommand(\n      'agora',\n      ArgParser()\n        ..addOption('id',\n            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/alerta_server.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nclass AlertaServer {\n  Stream<String> start() async* {\n    var server = await HttpServer.bind(\n      InternetAddress.loopbackIPv4,\n      8080,\n    );\n    await for (HttpRequest request in server) {\n      final contentType = request.headers.contentType != null\n          ? request.headers.contentType!.mimeType : '';\n      final response = request.response;\n\n      if (request.method == 'POST'\n          && contentType == 'application/json') {\n        final requestMap = await utf8.decoder.bind(request).join();\n        final String? aviso = jsonDecode(requestMap)['aviso'];\n        if (aviso != null) {\n          response\n            ..statusCode = HttpStatus.ok\n            ..write('Informação recebida!');\n          yield aviso;\n        } else {\n          response\n            ..statusCode = HttpStatus.badRequest\n            ..write('Formato de request errado..');\n        }\n      } else {\n        response\n          ..statusCode = HttpStatus.methodNotAllowed\n          ..write('É aceito apenas request POST');\n      }\n      await request.response.close();\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/log.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:climatempo/model/clima_tempo.dart';\n\nimport 'model/cidade.dart';\n\nFuture<void> _validarDiretorio({String? dirPath}) async {\n  final dir = Directory(dirPath ?? 'log');\n  if (!(await dir.exists())) {\n    await dir.create(recursive: true);\n  }\n}\n\nFuture<void> salvarTempoIsolate(ClimaTempo climaTempo) async {\n  final isolate = await Isolate.spawn(salvarTempo, climaTempo);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarTempo(ClimaTempo climaTempo) async {\n  runZonedGuarded(() async {\n    await _validarDiretorio(dirPath: 'log/clima/');\n    final file = File('log/clima/${climaTempo.cidade.id}.txt');\n    await file.writeAsString('===\\n$climaTempo', mode: FileMode.append);\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s, fileName: 'io/io.txt');\n  });\n}\n\nvoid _registrarCallbackFinalizacao(Isolate isolate) {\n  final receivePort = ReceivePort();\n  receivePort.listen((mensagem) {\n    print(mensagem);\n    receivePort.close();\n  });\n  isolate.addOnExitListener(receivePort.sendPort,\n      response: 'Arquivo salvo com sucesso!');\n}\n\nFuture<void> salvarCidadesIsolate(List<Cidade> cidades) async {\n  final isolate = await Isolate.spawn(salvarCidades, cidades);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarCidades(List<Cidade> cidades) async {\n  runZonedGuarded(() async {\n    await _validarDiretorio();\n    final file = File('log/cidades.txt');\n    final sink = file.openWrite(mode: FileMode.write);\n    cidades.forEach((c) => sink.writeln(c));\n    await sink.flush();\n    await sink.close();\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s, fileName: 'io/io.txt');\n  });\n}\n\nFuture<void> salvarErro(Object erro, StackTrace stackTrace,\n    {String? fileName}) async {\n  final data = DateTime.now();\n  final ano = data.year;\n  final mes = _doisDigitos(data.month);\n  final dia = _doisDigitos(data.day);\n  final fileDir = 'log/erro/${fileName ?? '$dia$mes$ano.txt'}';\n\n  await _validarDiretorio(dirPath: fileDir.split(RegExp(r'[^\\/]+$')).first);\n  final file = File(fileDir);\n\n  await file.writeAsString('${data.toIso8601String()} : $erro\\n',\n      mode: FileMode.append);\n  await file.writeAsString('${data.toIso8601String()} : $stackTrace',\n      mode: FileMode.append);\n}\n\nString _doisDigitos(int numero) {\n  if (numero >= 10) return '$numero';\n  return '0$numero';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/cidades.txt",
    "content": "Id:  5049  -  Nome:  Abdon Batista  -  Estado:  SC, País:  BR  \nId:  5050  -  Nome:  Abelardo Luz  -  Estado:  SC, País:  BR  \nId:  5051  -  Nome:  Agrolândia  -  Estado:  SC, País:  BR  \nId:  5052  -  Nome:  Agronômica  -  Estado:  SC, País:  BR  \nId:  5053  -  Nome:  Água Doce  -  Estado:  SC, País:  BR  \nId:  5054  -  Nome:  Águas Brancas  -  Estado:  SC, País:  BR  \nId:  5055  -  Nome:  Águas de Chapecó  -  Estado:  SC, País:  BR  \nId:  5056  -  Nome:  Águas Frias  -  Estado:  SC, País:  BR  \nId:  5057  -  Nome:  Águas Mornas  -  Estado:  SC, País:  BR  \nId:  5058  -  Nome:  Alfredo Wagner  -  Estado:  SC, País:  BR  \nId:  5059  -  Nome:  Alto Bela Vista  -  Estado:  SC, País:  BR  \nId:  5060  -  Nome:  Anchieta  -  Estado:  SC, País:  BR  \nId:  5061  -  Nome:  Angelina  -  Estado:  SC, País:  BR  \nId:  5062  -  Nome:  Anita Garibaldi  -  Estado:  SC, País:  BR  \nId:  5063  -  Nome:  Anitápolis  -  Estado:  SC, País:  BR  \nId:  5064  -  Nome:  Anta Gorda  -  Estado:  SC, País:  BR  \nId:  5065  -  Nome:  Antônio Carlos  -  Estado:  SC, País:  BR  \nId:  5066  -  Nome:  Apiúna  -  Estado:  SC, País:  BR  \nId:  5067  -  Nome:  Arabutã  -  Estado:  SC, País:  BR  \nId:  5068  -  Nome:  Araquari  -  Estado:  SC, País:  BR  \nId:  5069  -  Nome:  Araranguá  -  Estado:  SC, País:  BR  \nId:  5070  -  Nome:  Armazém  -  Estado:  SC, País:  BR  \nId:  5071  -  Nome:  Arroio Trinta  -  Estado:  SC, País:  BR  \nId:  5072  -  Nome:  Arvoredo  -  Estado:  SC, País:  BR  \nId:  5073  -  Nome:  Ascurra  -  Estado:  SC, País:  BR  \nId:  5074  -  Nome:  Atalanta  -  Estado:  SC, País:  BR  \nId:  5075  -  Nome:  Aurora  -  Estado:  SC, País:  BR  \nId:  5076  -  Nome:  Balneário Arroio do Silva  -  Estado:  SC, País:  BR  \nId:  5077  -  Nome:  Balneário Barra do Sul  -  Estado:  SC, País:  BR  \nId:  5078  -  Nome:  Balneário Camboriú  -  Estado:  SC, País:  BR  \nId:  5080  -  Nome:  Balneário Gaivota  -  Estado:  SC, País:  BR  \nId:  4769  -  Nome:  Balneário Piçarras  -  Estado:  SC, País:  BR  \nId:  5081  -  Nome:  Bandeirante  -  Estado:  SC, País:  BR  \nId:  5082  -  Nome:  Barra Bonita  -  Estado:  SC, País:  BR  \nId:  5083  -  Nome:  Barra do Ibiraquera  -  Estado:  SC, País:  BR  \nId:  5084  -  Nome:  Barra do Saí  -  Estado:  SC, País:  BR  \nId:  5085  -  Nome:  Barra Velha  -  Estado:  SC, País:  BR  \nId:  5086  -  Nome:  Bela Vista do Toldo  -  Estado:  SC, País:  BR  \nId:  5087  -  Nome:  Belmonte  -  Estado:  SC, País:  BR  \nId:  5088  -  Nome:  Benedito Novo  -  Estado:  SC, País:  BR  \nId:  5089  -  Nome:  Biguaçu  -  Estado:  SC, País:  BR  \nId:  5090  -  Nome:  Blumenau  -  Estado:  SC, País:  BR  \nId:  5091  -  Nome:  Bocaina do Sul  -  Estado:  SC, País:  BR  \nId:  5092  -  Nome:  Bombinhas  -  Estado:  SC, País:  BR  \nId:  5093  -  Nome:  Bom Jardim da Serra  -  Estado:  SC, País:  BR  \nId:  5095  -  Nome:  Bom Jesus  -  Estado:  SC, País:  BR  \nId:  5094  -  Nome:  Bom Jesus do Oeste  -  Estado:  SC, País:  BR  \nId:  5096  -  Nome:  Bom Retiro  -  Estado:  SC, País:  BR  \nId:  5097  -  Nome:  Bom Sucesso  -  Estado:  SC, País:  BR  \nId:  5098  -  Nome:  Botuverá  -  Estado:  SC, País:  BR  \nId:  5099  -  Nome:  Braço do Norte  -  Estado:  SC, País:  BR  \nId:  5100  -  Nome:  Braço do Trombudo  -  Estado:  SC, País:  BR  \nId:  5101  -  Nome:  Brunópolis  -  Estado:  SC, País:  BR  \nId:  5102  -  Nome:  Brusque  -  Estado:  SC, País:  BR  \nId:  5103  -  Nome:  Caçador  -  Estado:  SC, País:  BR  \nId:  5104  -  Nome:  Caibi  -  Estado:  SC, País:  BR  \nId:  5105  -  Nome:  Calmon  -  Estado:  SC, País:  BR  \nId:  5106  -  Nome:  Camboriú  -  Estado:  SC, País:  BR  \nId:  5107  -  Nome:  Campina da Alegria  -  Estado:  SC, País:  BR  \nId:  5108  -  Nome:  Campo Alegre  -  Estado:  SC, País:  BR  \nId:  5109  -  Nome:  Campo Belo do Sul  -  Estado:  SC, País:  BR  \nId:  5110  -  Nome:  Campo Erê  -  Estado:  SC, País:  BR  \nId:  5111  -  Nome:  Campos Novos  -  Estado:  SC, País:  BR  \nId:  5112  -  Nome:  Canelinha  -  Estado:  SC, País:  BR  \nId:  5113  -  Nome:  Canoinhas  -  Estado:  SC, País:  BR  \nId:  5114  -  Nome:  Capão Alto  -  Estado:  SC, País:  BR  \nId:  5115  -  Nome:  Capinzal  -  Estado:  SC, País:  BR  \nId:  5116  -  Nome:  Capivari de Baixo  -  Estado:  SC, País:  BR  \nId:  5117  -  Nome:  Catanduvas  -  Estado:  SC, País:  BR  \nId:  5118  -  Nome:  Caxambu do Sul  -  Estado:  SC, País:  BR  \nId:  5119  -  Nome:  Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4888  -  Nome:  Cerro Negro  -  Estado:  SC, País:  BR  \nId:  4889  -  Nome:  Chapadão do Lageado  -  Estado:  SC, País:  BR  \nId:  4890  -  Nome:  Chapecó  -  Estado:  SC, País:  BR  \nId:  4891  -  Nome:  Cocal do Sul  -  Estado:  SC, País:  BR  \nId:  4892  -  Nome:  Concórdia  -  Estado:  SC, País:  BR  \nId:  4893  -  Nome:  Cordilheira Alta  -  Estado:  SC, País:  BR  \nId:  4894  -  Nome:  Coronel Freitas  -  Estado:  SC, País:  BR  \nId:  4895  -  Nome:  Coronel Martins  -  Estado:  SC, País:  BR  \nId:  4896  -  Nome:  Correia Pinto  -  Estado:  SC, País:  BR  \nId:  4897  -  Nome:  Corupá  -  Estado:  SC, País:  BR  \nId:  4898  -  Nome:  Criciúma  -  Estado:  SC, País:  BR  \nId:  4899  -  Nome:  Cunha Porã  -  Estado:  SC, País:  BR  \nId:  4900  -  Nome:  Cunhataí  -  Estado:  SC, País:  BR  \nId:  4901  -  Nome:  Curitibanos  -  Estado:  SC, País:  BR  \nId:  4902  -  Nome:  Descanso  -  Estado:  SC, País:  BR  \nId:  4903  -  Nome:  Dionísio Cerqueira  -  Estado:  SC, País:  BR  \nId:  4904  -  Nome:  Dona Emma  -  Estado:  SC, País:  BR  \nId:  4905  -  Nome:  Doutor Pedrinho  -  Estado:  SC, País:  BR  \nId:  4906  -  Nome:  Enseada de Brito  -  Estado:  SC, País:  BR  \nId:  4907  -  Nome:  Entre Rios  -  Estado:  SC, País:  BR  \nId:  4909  -  Nome:  Ermo  -  Estado:  SC, País:  BR  \nId:  4912  -  Nome:  Erval Velho  -  Estado:  SC, País:  BR  \nId:  4913  -  Nome:  Faxinal dos Guedes  -  Estado:  SC, País:  BR  \nId:  4914  -  Nome:  Flor do Sertão  -  Estado:  SC, País:  BR  \nId:  4915  -  Nome:  Florianópolis  -  Estado:  SC, País:  BR  \nId:  4916  -  Nome:  Formosa do Sul  -  Estado:  SC, País:  BR  \nId:  4918  -  Nome:  Forquilhinha  -  Estado:  SC, País:  BR  \nId:  4919  -  Nome:  Fraiburgo  -  Estado:  SC, País:  BR  \nId:  4920  -  Nome:  Frei Rogério  -  Estado:  SC, País:  BR  \nId:  4921  -  Nome:  Galvão  -  Estado:  SC, País:  BR  \nId:  4922  -  Nome:  Garopaba  -  Estado:  SC, País:  BR  \nId:  4923  -  Nome:  Garuva  -  Estado:  SC, País:  BR  \nId:  4924  -  Nome:  Gaspar  -  Estado:  SC, País:  BR  \nId:  4925  -  Nome:  Governador Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4927  -  Nome:  Grão Pará  -  Estado:  SC, País:  BR  \nId:  4928  -  Nome:  Gravatal  -  Estado:  SC, País:  BR  \nId:  4929  -  Nome:  Guabiruba  -  Estado:  SC, País:  BR  \nId:  4930  -  Nome:  Guaraciaba  -  Estado:  SC, País:  BR  \nId:  4931  -  Nome:  Guaramirim  -  Estado:  SC, País:  BR  \nId:  4932  -  Nome:  Guarda do Embaú  -  Estado:  SC, País:  BR  \nId:  4933  -  Nome:  Guarujá do Sul  -  Estado:  SC, País:  BR  \nId:  4935  -  Nome:  Guatá  -  Estado:  SC, País:  BR  \nId:  4934  -  Nome:  Guatambú  -  Estado:  SC, País:  BR  \nId:  4936  -  Nome:  Herval d'Oeste  -  Estado:  SC, País:  BR  \nId:  4937  -  Nome:  Ibiam  -  Estado:  SC, País:  BR  \nId:  4938  -  Nome:  Ibicaré  -  Estado:  SC, País:  BR  \nId:  4939  -  Nome:  Ibirama  -  Estado:  SC, País:  BR  \nId:  4940  -  Nome:  Içara  -  Estado:  SC, País:  BR  \nId:  4941  -  Nome:  Ilhota  -  Estado:  SC, País:  BR  \nId:  4942  -  Nome:  Imaruí  -  Estado:  SC, País:  BR  \nId:  4943  -  Nome:  Imbituba  -  Estado:  SC, País:  BR  \nId:  4944  -  Nome:  Imbuia  -  Estado:  SC, País:  BR  \nId:  4945  -  Nome:  Indaial  -  Estado:  SC, País:  BR  \nId:  4946  -  Nome:  Iomerê  -  Estado:  SC, País:  BR  \nId:  4947  -  Nome:  Ipira  -  Estado:  SC, País:  BR  \nId:  4948  -  Nome:  Ipoméia  -  Estado:  SC, País:  BR  \nId:  4949  -  Nome:  Iporã do Oeste  -  Estado:  SC, País:  BR  \nId:  4950  -  Nome:  Ipuaçu  -  Estado:  SC, País:  BR  \nId:  4951  -  Nome:  Ipumirim  -  Estado:  SC, País:  BR  \nId:  4952  -  Nome:  Iraceminha  -  Estado:  SC, País:  BR  \nId:  4953  -  Nome:  Irani  -  Estado:  SC, País:  BR  \nId:  4954  -  Nome:  Irati  -  Estado:  SC, País:  BR  \nId:  4955  -  Nome:  Irineópolis  -  Estado:  SC, País:  BR  \nId:  4962  -  Nome:  Itá  -  Estado:  SC, País:  BR  \nId:  4956  -  Nome:  Itaiópolis  -  Estado:  SC, País:  BR  \nId:  4957  -  Nome:  Itajaí  -  Estado:  SC, País:  BR  \nId:  4958  -  Nome:  Itapema  -  Estado:  SC, País:  BR  \nId:  4959  -  Nome:  Itapiranga  -  Estado:  SC, País:  BR  \nId:  4960  -  Nome:  Itapoá  -  Estado:  SC, País:  BR  \nId:  4961  -  Nome:  Itapocu  -  Estado:  SC, País:  BR  \nId:  4963  -  Nome:  Ituporanga  -  Estado:  SC, País:  BR  \nId:  4964  -  Nome:  Jaborá  -  Estado:  SC, País:  BR  \nId:  4965  -  Nome:  Jacinto Machado  -  Estado:  SC, País:  BR  \nId:  4966  -  Nome:  Jaguaruna  -  Estado:  SC, País:  BR  \nId:  4967  -  Nome:  Jaraguá do Sul  -  Estado:  SC, País:  BR  \nId:  4968  -  Nome:  Jardinópolis  -  Estado:  SC, País:  BR  \nId:  4969  -  Nome:  Joaçaba  -  Estado:  SC, País:  BR  \nId:  4970  -  Nome:  Joinville  -  Estado:  SC, País:  BR  \nId:  4971  -  Nome:  José Boiteux  -  Estado:  SC, País:  BR  \nId:  4972  -  Nome:  Jupiá  -  Estado:  SC, País:  BR  \nId:  4974  -  Nome:  Lacerdópolis  -  Estado:  SC, País:  BR  \nId:  4975  -  Nome:  Lages  -  Estado:  SC, País:  BR  \nId:  4976  -  Nome:  Laguna  -  Estado:  SC, País:  BR  \nId:  4977  -  Nome:  Lajeado Grande  -  Estado:  SC, País:  BR  \nId:  4978  -  Nome:  Laurentino  -  Estado:  SC, País:  BR  \nId:  4979  -  Nome:  Lauro Muller  -  Estado:  SC, País:  BR  \nId:  4980  -  Nome:  Lebon Régis  -  Estado:  SC, País:  BR  \nId:  4981  -  Nome:  Leoberto Leal  -  Estado:  SC, País:  BR  \nId:  4982  -  Nome:  Lindóia do Sul  -  Estado:  SC, País:  BR  \nId:  4983  -  Nome:  Lontras  -  Estado:  SC, País:  BR  \nId:  4984  -  Nome:  Luiz Alves  -  Estado:  SC, País:  BR  \nId:  4985  -  Nome:  Luzerna  -  Estado:  SC, País:  BR  \nId:  4986  -  Nome:  Macieira  -  Estado:  SC, País:  BR  \nId:  4987  -  Nome:  Mafra  -  Estado:  SC, País:  BR  \nId:  4988  -  Nome:  Major Gercino  -  Estado:  SC, País:  BR  \nId:  4989  -  Nome:  Major Vieira  -  Estado:  SC, País:  BR  \nId:  4990  -  Nome:  Maracajá  -  Estado:  SC, País:  BR  \nId:  4991  -  Nome:  Maravilha  -  Estado:  SC, País:  BR  \nId:  4992  -  Nome:  Marema  -  Estado:  SC, País:  BR  \nId:  4993  -  Nome:  Massaranduba  -  Estado:  SC, País:  BR  \nId:  4994  -  Nome:  Matos Costa  -  Estado:  SC, País:  BR  \nId:  4995  -  Nome:  Meleiro  -  Estado:  SC, País:  BR  \nId:  4996  -  Nome:  Mirim Doce  -  Estado:  SC, País:  BR  \nId:  4997  -  Nome:  Modelo  -  Estado:  SC, País:  BR  \nId:  4998  -  Nome:  Mondaí  -  Estado:  SC, País:  BR  \nId:  4999  -  Nome:  Monte Carlo  -  Estado:  SC, País:  BR  \nId:  5000  -  Nome:  Monte Castelo  -  Estado:  SC, País:  BR  \nId:  5001  -  Nome:  Morro da Fumaça  -  Estado:  SC, País:  BR  \nId:  5002  -  Nome:  Morro Grande  -  Estado:  SC, País:  BR  \nId:  5003  -  Nome:  Navegantes  -  Estado:  SC, País:  BR  \nId:  5004  -  Nome:  Nova Erechim  -  Estado:  SC, País:  BR  \nId:  5005  -  Nome:  Nova Itaberaba  -  Estado:  SC, País:  BR  \nId:  5006  -  Nome:  Nova Trento  -  Estado:  SC, País:  BR  \nId:  5007  -  Nome:  Nova Veneza  -  Estado:  SC, País:  BR  \nId:  4678  -  Nome:  Novo Horizonte  -  Estado:  SC, País:  BR  \nId:  4679  -  Nome:  Orleans  -  Estado:  SC, País:  BR  \nId:  4680  -  Nome:  Otacílio Costa  -  Estado:  SC, País:  BR  \nId:  4681  -  Nome:  Ouro  -  Estado:  SC, País:  BR  \nId:  4682  -  Nome:  Ouro Verde  -  Estado:  SC, País:  BR  \nId:  4683  -  Nome:  Paial  -  Estado:  SC, País:  BR  \nId:  4648  -  Nome:  Painel  -  Estado:  SC, País:  BR  \nId:  4756  -  Nome:  Palhoça  -  Estado:  SC, País:  BR  \nId:  4757  -  Nome:  Palma Sola  -  Estado:  SC, País:  BR  \nId:  4758  -  Nome:  Palmeira  -  Estado:  SC, País:  BR  \nId:  4759  -  Nome:  Palmitos  -  Estado:  SC, País:  BR  \nId:  4760  -  Nome:  Papanduva  -  Estado:  SC, País:  BR  \nId:  4761  -  Nome:  Paraíso  -  Estado:  SC, País:  BR  \nId:  4762  -  Nome:  Passo de Torres  -  Estado:  SC, País:  BR  \nId:  4763  -  Nome:  Passos Maia  -  Estado:  SC, País:  BR  \nId:  4764  -  Nome:  Paulo Lopes  -  Estado:  SC, País:  BR  \nId:  4765  -  Nome:  Pedras Grandes  -  Estado:  SC, País:  BR  \nId:  4766  -  Nome:  Penha  -  Estado:  SC, País:  BR  \nId:  4767  -  Nome:  Peritiba  -  Estado:  SC, País:  BR  \nId:  4768  -  Nome:  Petrolândia  -  Estado:  SC, País:  BR  \nId:  4770  -  Nome:  Pinhalzinho  -  Estado:  SC, País:  BR  \nId:  4771  -  Nome:  Pinheiro Preto  -  Estado:  SC, País:  BR  \nId:  4772  -  Nome:  Piratuba  -  Estado:  SC, País:  BR  \nId:  4773  -  Nome:  Planalto Alegre  -  Estado:  SC, País:  BR  \nId:  4774  -  Nome:  Pomerode  -  Estado:  SC, País:  BR  \nId:  4776  -  Nome:  Ponte Alta  -  Estado:  SC, País:  BR  \nId:  4775  -  Nome:  Ponte Alta do Norte  -  Estado:  SC, País:  BR  \nId:  4777  -  Nome:  Ponte Serrada  -  Estado:  SC, País:  BR  \nId:  4778  -  Nome:  Porto Belo  -  Estado:  SC, País:  BR  \nId:  4779  -  Nome:  Porto União  -  Estado:  SC, País:  BR  \nId:  4780  -  Nome:  Pouso Redondo  -  Estado:  SC, País:  BR  \nId:  4781  -  Nome:  Praia do Santinho  -  Estado:  SC, País:  BR  \nId:  4782  -  Nome:  Praia Grande  -  Estado:  SC, País:  BR  \nId:  4783  -  Nome:  Presidente Castelo Branco  -  Estado:  SC, País:  BR  \nId:  4784  -  Nome:  Presidente Getúlio  -  Estado:  SC, País:  BR  \nId:  4785  -  Nome:  Presidente Nereu  -  Estado:  SC, País:  BR  \nId:  4811  -  Nome:  Princesa  -  Estado:  SC, País:  BR  \nId:  4812  -  Nome:  Quilombo  -  Estado:  SC, País:  BR  \nId:  4813  -  Nome:  Rancho Queimado  -  Estado:  SC, País:  BR  \nId:  4814  -  Nome:  Rio das Antas  -  Estado:  SC, País:  BR  \nId:  4815  -  Nome:  Rio do Campo  -  Estado:  SC, País:  BR  \nId:  4816  -  Nome:  Rio d'Oeste  -  Estado:  SC, País:  BR  \nId:  4817  -  Nome:  Rio dos Cedros  -  Estado:  SC, País:  BR  \nId:  4818  -  Nome:  Rio do Sul  -  Estado:  SC, País:  BR  \nId:  4819  -  Nome:  Rio Fortuna  -  Estado:  SC, País:  BR  \nId:  4820  -  Nome:  Rio Negrinho  -  Estado:  SC, País:  BR  \nId:  4821  -  Nome:  Rio Rufino  -  Estado:  SC, País:  BR  \nId:  4822  -  Nome:  Riqueza  -  Estado:  SC, País:  BR  \nId:  4823  -  Nome:  Rodeio  -  Estado:  SC, País:  BR  \nId:  4824  -  Nome:  Romelândia  -  Estado:  SC, País:  BR  \nId:  4825  -  Nome:  Salete  -  Estado:  SC, País:  BR  \nId:  4826  -  Nome:  Saltinho  -  Estado:  SC, País:  BR  \nId:  4827  -  Nome:  Salto Veloso  -  Estado:  SC, País:  BR  \nId:  4828  -  Nome:  Sangão  -  Estado:  SC, País:  BR  \nId:  4829  -  Nome:  Santa Cecília  -  Estado:  SC, País:  BR  \nId:  4830  -  Nome:  Santa Helena  -  Estado:  SC, País:  BR  \nId:  4831  -  Nome:  Santa Rosa de Lima  -  Estado:  SC, País:  BR  \nId:  4832  -  Nome:  Santa Rosa do Sul  -  Estado:  SC, País:  BR  \nId:  4834  -  Nome:  Santa Terezinha  -  Estado:  SC, País:  BR  \nId:  4833  -  Nome:  Santa Terezinha do Progresso  -  Estado:  SC, País:  BR  \nId:  4835  -  Nome:  Santiago do Sul  -  Estado:  SC, País:  BR  \nId:  4836  -  Nome:  Santo Amaro da Imperatriz  -  Estado:  SC, País:  BR  \nId:  4837  -  Nome:  São Bento do Sul  -  Estado:  SC, País:  BR  \nId:  4838  -  Nome:  São Bernardino  -  Estado:  SC, País:  BR  \nId:  4839  -  Nome:  São Bonifácio  -  Estado:  SC, País:  BR  \nId:  4840  -  Nome:  São Carlos  -  Estado:  SC, País:  BR  \nId:  4841  -  Nome:  São Cristovão do Sul  -  Estado:  SC, País:  BR  \nId:  4842  -  Nome:  São Domingos  -  Estado:  SC, País:  BR  \nId:  4843  -  Nome:  São Francisco do Sul  -  Estado:  SC, País:  BR  \nId:  4844  -  Nome:  São João Batista  -  Estado:  SC, País:  BR  \nId:  4845  -  Nome:  São João do Itaperiú  -  Estado:  SC, País:  BR  \nId:  4846  -  Nome:  São João do Oeste  -  Estado:  SC, País:  BR  \nId:  4847  -  Nome:  São João do Sul  -  Estado:  SC, País:  BR  \nId:  4848  -  Nome:  São Joaquim  -  Estado:  SC, País:  BR  \nId:  4851  -  Nome:  São José  -  Estado:  SC, País:  BR  \nId:  4849  -  Nome:  São José do Cedro  -  Estado:  SC, País:  BR  \nId:  4850  -  Nome:  São José do Cerrito  -  Estado:  SC, País:  BR  \nId:  4852  -  Nome:  São Lourenço d'Oeste  -  Estado:  SC, País:  BR  \nId:  4853  -  Nome:  São Ludgero  -  Estado:  SC, País:  BR  \nId:  4854  -  Nome:  São Martinho  -  Estado:  SC, País:  BR  \nId:  4855  -  Nome:  São Miguel da Boa Vista  -  Estado:  SC, País:  BR  \nId:  4856  -  Nome:  São Miguel do Oeste  -  Estado:  SC, País:  BR  \nId:  4857  -  Nome:  São Pedro de Alcântara  -  Estado:  SC, País:  BR  \nId:  4858  -  Nome:  Saudades  -  Estado:  SC, País:  BR  \nId:  85793  -  Nome:  SBCH  -  Estado:  SC, País:  BR  \nId:  74832  -  Nome:  SBFL  -  Estado:  SC, País:  BR  \nId:  74833  -  Nome:  SBJV  -  Estado:  SC, País:  BR  \nId:  85285  -  Nome:  SBNF  -  Estado:  SC, País:  BR  \nId:  4859  -  Nome:  Schroeder  -  Estado:  SC, País:  BR  \nId:  4860  -  Nome:  Seara  -  Estado:  SC, País:  BR  \nId:  4861  -  Nome:  Serra Alta  -  Estado:  SC, País:  BR  \nId:  4862  -  Nome:  Siderópolis  -  Estado:  SC, País:  BR  \nId:  4863  -  Nome:  Sombrio  -  Estado:  SC, País:  BR  \nId:  4864  -  Nome:  Sul Brasil  -  Estado:  SC, País:  BR  \nId:  4865  -  Nome:  Taió  -  Estado:  SC, País:  BR  \nId:  4866  -  Nome:  Tangará  -  Estado:  SC, País:  BR  \nId:  4867  -  Nome:  Tigrinhos  -  Estado:  SC, País:  BR  \nId:  4868  -  Nome:  Tijucas  -  Estado:  SC, País:  BR  \nId:  4869  -  Nome:  Timbé do Sul  -  Estado:  SC, País:  BR  \nId:  4871  -  Nome:  Timbó  -  Estado:  SC, País:  BR  \nId:  4870  -  Nome:  Timbó Grande  -  Estado:  SC, País:  BR  \nId:  4872  -  Nome:  Três Barras  -  Estado:  SC, País:  BR  \nId:  4875  -  Nome:  Treviso  -  Estado:  SC, País:  BR  \nId:  4878  -  Nome:  Treze de Maio  -  Estado:  SC, País:  BR  \nId:  4879  -  Nome:  Treze Tílias  -  Estado:  SC, País:  BR  \nId:  4880  -  Nome:  Trombudo Central  -  Estado:  SC, País:  BR  \nId:  4881  -  Nome:  Tubarão  -  Estado:  SC, País:  BR  \nId:  4882  -  Nome:  Tunápolis  -  Estado:  SC, País:  BR  \nId:  4883  -  Nome:  Turvo  -  Estado:  SC, País:  BR  \nId:  4884  -  Nome:  União do Oeste  -  Estado:  SC, País:  BR  \nId:  4885  -  Nome:  Urubici  -  Estado:  SC, País:  BR  \nId:  4886  -  Nome:  Urupema  -  Estado:  SC, País:  BR  \nId:  4887  -  Nome:  Urussanga  -  Estado:  SC, País:  BR  \nId:  4482  -  Nome:  Vargeão  -  Estado:  SC, País:  BR  \nId:  4484  -  Nome:  Vargem  -  Estado:  SC, País:  BR  \nId:  4483  -  Nome:  Vargem Bonita  -  Estado:  SC, País:  BR  \nId:  4485  -  Nome:  Vidal Ramos  -  Estado:  SC, País:  BR  \nId:  4486  -  Nome:  Videira  -  Estado:  SC, País:  BR  \nId:  4487  -  Nome:  Vitor Meireles  -  Estado:  SC, País:  BR  \nId:  4488  -  Nome:  Witmarsum  -  Estado:  SC, País:  BR  \nId:  4489  -  Nome:  Xanxerê  -  Estado:  SC, País:  BR  \nId:  4490  -  Nome:  Xavantina  -  Estado:  SC, País:  BR  \nId:  4491  -  Nome:  Xaxim  -  Estado:  SC, País:  BR  \nId:  4492  -  Nome:  Zortéa  -  Estado:  SC, País:  BR  \n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/clima/4915.txt",
    "content": "===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 23:11:47.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  15\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/erro/io/io.txt",
    "content": "2022-03-13T23:13:23.420404 : Erro ao salvar o tempo no arquivo\n2022-03-13T23:13:23.420404 : #0      salvarTempo.<anonymous closure> (package:climatempo/log.dart:24:5)\n#1      salvarTempo.<anonymous closure> (package:climatempo/log.dart:23:19)\n#2      _rootRun (dart:async/zone.dart:1426:13)\n#3      _CustomZone.run (dart:async/zone.dart:1328:19)\n#4      _runZoned (dart:async/zone.dart:1861:10)\n#5      runZonedGuarded (dart:async/zone.dart:1849:12)\n#6      salvarTempo (package:climatempo/log.dart:23:3)\n#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:300:17)\n#8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)\n2022-03-13T23:14:29.744959 : FileSystemException: Cannot open file, path = 'log/clima/4915.txt' (OS Error: No such file or directory, errno = 2)\n2022-03-13T23:14:29.744959 : #0      _File.open.<anonymous closure> (dart:io/file_impl.dart:356:9)\n#1      _rootRunUnary (dart:async/zone.dart:1434:47)\n#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)\n<asynchronous suspension>\n#3      salvarTempo.<anonymous closure> (package:climatempo/log.dart:25:5)\n<asynchronous suspension>\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/bin/climatempo.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/alerta_server.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/log.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) {\n  runZonedGuarded(() {\n    executar(args);\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s);\n  });\n}\n\nFuture<void> executar(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  if (comando != null && comando.name == 'cidade') {\n    final nomeCidade = comando['nome'];\n    final estado = comando['estado'];\n    final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n    if (comando['salvar']) await salvarCidadesIsolate(cidades);\n    cidades.forEach((c) => print(c));\n  }\n\n  if (comando != null && comando.name == 'agora') {\n    final id = comando['id'];\n    if (id == null) {\n      print('É obrigatório informar um [-id] de cidade');\n      exit(2);\n    }\n    final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n    if (comando['salvar']) await salvarTempoIsolate(tempo);\n    print(tempo);\n  }\n\n  if (comando != null && comando.name == 'alerta') {\n    AlertaServer().start().listen(print);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand('alerta')\n    ..addCommand(\n      'cidade',\n      ArgParser()\n        ..addOption('nome',\n            abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n        ..addOption('estado',\n            abbr: 'e', valueHelp: 'Sigla do estado para consulta')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addCommand(\n      'agora',\n      ArgParser()\n        ..addOption('id',\n            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/alerta_server.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nclass AlertaServer {\n  Stream<String> start() async* {\n    var server = await HttpServer.bind(\n      InternetAddress.loopbackIPv4,\n      8080,\n    );\n    await for (HttpRequest request in server) {\n      final contentType = request.headers.contentType != null\n          ? request.headers.contentType!.mimeType : '';\n      final response = request.response;\n\n      if (request.method == 'POST'\n          && contentType == 'application/json') {\n        final requestMap = await utf8.decoder.bind(request).join();\n        final String? aviso = jsonDecode(requestMap)['aviso'];\n        if (aviso != null) {\n          response\n            ..statusCode = HttpStatus.ok\n            ..write('Informação recebida!');\n          yield aviso;\n        } else {\n          response\n            ..statusCode = HttpStatus.badRequest\n            ..write('Formato de request errado..');\n        }\n      } else {\n        response\n          ..statusCode = HttpStatus.methodNotAllowed\n          ..write('É aceito apenas request POST');\n      }\n      await request.response.close();\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/log.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:climatempo/model/clima_tempo.dart';\n\nimport 'model/cidade.dart';\n\nFuture<void> _validarDiretorio() async {\n  final dir = Directory('log');\n  if (!(await dir.exists())) {\n    await dir.create();\n  }\n}\n\nFuture<void> salvarTempoIsolate(ClimaTempo climaTempo) async {\n  final receivePortError = ReceivePort();\n  receivePortError.listen((error) {\n    final errorList = error as List<dynamic>;\n    salvarErro(\n      errorList.first,\n      StackTrace.fromString(errorList[1]),\n      fileName: 'io.txt',\n    );\n  });\n\n  final isolate = await Isolate.spawn(\n    salvarTempo,\n    climaTempo,\n    onError: receivePortError.sendPort,\n  );\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarTempo(ClimaTempo climaTempo) async {\n  await _validarDiretorio();\n  final file = File('log/${climaTempo.cidade.id}.txt');\n  await file.writeAsString('===\\n$climaTempo', mode: FileMode.append);\n}\n\nvoid _registrarCallbackFinalizacao(Isolate isolate) {\n  final receivePort = ReceivePort();\n  receivePort.listen((mensagem) {\n    print(mensagem);\n    receivePort.close();\n  });\n  isolate.addOnExitListener(receivePort.sendPort,\n      response: 'Arquivo salvo com sucesso!');\n}\n\nFuture<void> salvarCidadesIsolate(List<Cidade> cidades) async {\n  final receivePortError = ReceivePort();\n  receivePortError.listen((error) {\n    final errorList = error as List<dynamic>;\n    salvarErro(\n      errorList.first,\n      StackTrace.fromString(errorList[1]),\n      fileName: 'io.txt',\n    );\n  });\n\n  final isolate = await Isolate.spawn(\n    salvarCidades,\n    cidades,\n    onError: receivePortError.sendPort,\n  );\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarCidades(List<Cidade> cidades) async {\n  await _validarDiretorio();\n  final file = File('log/cidades.txt');\n  final sink = file.openWrite(mode: FileMode.write);\n  cidades.forEach((c) => sink.writeln(c));\n  await sink.flush();\n  await sink.close();\n}\n\nFuture<void> salvarErro(Object erro, StackTrace stackTrace,\n    {String? fileName}) async {\n  await _validarDiretorio();\n\n  final data = DateTime.now();\n  final ano = data.year;\n  final mes = _doisDigitos(data.month);\n  final dia = _doisDigitos(data.day);\n  final fileDir = 'log/${fileName ?? '$dia$mes$ano.txt'}';\n  final file = File(fileDir);\n\n  await file.writeAsString('${data.toIso8601String()} : $erro\\n',\n      mode: FileMode.append);\n  await file.writeAsString('${data.toIso8601String()} : $stackTrace',\n      mode: FileMode.append);\n}\n\nString _doisDigitos(int numero) {\n  if (numero >= 10) return '$numero';\n  return '0$numero';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/13032022.txt",
    "content": "2022-03-13T22:18:37.172126 : {\"error\":true,\"detail\":\"Invalid token\"}\n2022-03-13T22:18:37.172126 : #0      climaAtual (package:climatempo/api.dart:34:35)\n<asynchronous suspension>\n#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)\n<asynchronous suspension>\n#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)\n<asynchronous suspension>\n2022-03-13T22:18:54.065327 : {\"error\":true,\"detail\":\"Invalid token\"}\n2022-03-13T22:18:54.065327 : #0      climaAtual (package:climatempo/api.dart:34:35)\n<asynchronous suspension>\n#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)\n<asynchronous suspension>\n#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)\n<asynchronous suspension>2022-03-13T22:53:09.878905 : type 'List<dynamic>' is not a subtype of type 'StackTrace'\n2022-03-13T22:53:09.878905 : #0      salvarTempoIsolate.<anonymous closure> (package:climatempo/log.dart:19:32)\n#1      _rootRunUnary (dart:async/zone.dart:1442:13)\n#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)\n#3      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)\n#4      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)\n#5      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)\n#6      _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)\n#7      _StreamController._add (dart:async/stream_controller.dart:648:7)\n#8      _StreamController.add (dart:async/stream_controller.dart:596:5)\n#9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)\n2022-03-13T22:54:20.667082 : type 'List<dynamic>' is not a subtype of type 'StackTrace'\n2022-03-13T22:54:20.667082 : #0      salvarTempoIsolate.<anonymous closure> (package:climatempo/log.dart:21:32)\n#1      _rootRunUnary (dart:async/zone.dart:1442:13)\n#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)\n#3      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)\n#4      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)\n#5      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)\n#6      _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)\n#7      _StreamController._add (dart:async/stream_controller.dart:648:7)\n#8      _StreamController.add (dart:async/stream_controller.dart:596:5)\n#9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)\n2022-03-13T22:55:14.830927 : type 'String' is not a subtype of type 'StackTrace'\n2022-03-13T22:55:14.830927 : #0      salvarTempoIsolate.<anonymous closure> (package:climatempo/log.dart:20:42)\n#1      _rootRunUnary (dart:async/zone.dart:1442:13)\n#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)\n#3      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)\n#4      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)\n#5      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)\n#6      _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)\n#7      _StreamController._add (dart:async/stream_controller.dart:648:7)\n#8      _StreamController.add (dart:async/stream_controller.dart:596:5)\n#9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/4915.txt",
    "content": "===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:45:02.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 22:18:07.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  15\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 22:18:07.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  15\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/cidades.txt",
    "content": "Id:  5049  -  Nome:  Abdon Batista  -  Estado:  SC, País:  BR  \nId:  5050  -  Nome:  Abelardo Luz  -  Estado:  SC, País:  BR  \nId:  5051  -  Nome:  Agrolândia  -  Estado:  SC, País:  BR  \nId:  5052  -  Nome:  Agronômica  -  Estado:  SC, País:  BR  \nId:  5053  -  Nome:  Água Doce  -  Estado:  SC, País:  BR  \nId:  5054  -  Nome:  Águas Brancas  -  Estado:  SC, País:  BR  \nId:  5055  -  Nome:  Águas de Chapecó  -  Estado:  SC, País:  BR  \nId:  5056  -  Nome:  Águas Frias  -  Estado:  SC, País:  BR  \nId:  5057  -  Nome:  Águas Mornas  -  Estado:  SC, País:  BR  \nId:  5058  -  Nome:  Alfredo Wagner  -  Estado:  SC, País:  BR  \nId:  5059  -  Nome:  Alto Bela Vista  -  Estado:  SC, País:  BR  \nId:  5060  -  Nome:  Anchieta  -  Estado:  SC, País:  BR  \nId:  5061  -  Nome:  Angelina  -  Estado:  SC, País:  BR  \nId:  5062  -  Nome:  Anita Garibaldi  -  Estado:  SC, País:  BR  \nId:  5063  -  Nome:  Anitápolis  -  Estado:  SC, País:  BR  \nId:  5064  -  Nome:  Anta Gorda  -  Estado:  SC, País:  BR  \nId:  5065  -  Nome:  Antônio Carlos  -  Estado:  SC, País:  BR  \nId:  5066  -  Nome:  Apiúna  -  Estado:  SC, País:  BR  \nId:  5067  -  Nome:  Arabutã  -  Estado:  SC, País:  BR  \nId:  5068  -  Nome:  Araquari  -  Estado:  SC, País:  BR  \nId:  5069  -  Nome:  Araranguá  -  Estado:  SC, País:  BR  \nId:  5070  -  Nome:  Armazém  -  Estado:  SC, País:  BR  \nId:  5071  -  Nome:  Arroio Trinta  -  Estado:  SC, País:  BR  \nId:  5072  -  Nome:  Arvoredo  -  Estado:  SC, País:  BR  \nId:  5073  -  Nome:  Ascurra  -  Estado:  SC, País:  BR  \nId:  5074  -  Nome:  Atalanta  -  Estado:  SC, País:  BR  \nId:  5075  -  Nome:  Aurora  -  Estado:  SC, País:  BR  \nId:  5076  -  Nome:  Balneário Arroio do Silva  -  Estado:  SC, País:  BR  \nId:  5077  -  Nome:  Balneário Barra do Sul  -  Estado:  SC, País:  BR  \nId:  5078  -  Nome:  Balneário Camboriú  -  Estado:  SC, País:  BR  \nId:  5080  -  Nome:  Balneário Gaivota  -  Estado:  SC, País:  BR  \nId:  4769  -  Nome:  Balneário Piçarras  -  Estado:  SC, País:  BR  \nId:  5081  -  Nome:  Bandeirante  -  Estado:  SC, País:  BR  \nId:  5082  -  Nome:  Barra Bonita  -  Estado:  SC, País:  BR  \nId:  5083  -  Nome:  Barra do Ibiraquera  -  Estado:  SC, País:  BR  \nId:  5084  -  Nome:  Barra do Saí  -  Estado:  SC, País:  BR  \nId:  5085  -  Nome:  Barra Velha  -  Estado:  SC, País:  BR  \nId:  5086  -  Nome:  Bela Vista do Toldo  -  Estado:  SC, País:  BR  \nId:  5087  -  Nome:  Belmonte  -  Estado:  SC, País:  BR  \nId:  5088  -  Nome:  Benedito Novo  -  Estado:  SC, País:  BR  \nId:  5089  -  Nome:  Biguaçu  -  Estado:  SC, País:  BR  \nId:  5090  -  Nome:  Blumenau  -  Estado:  SC, País:  BR  \nId:  5091  -  Nome:  Bocaina do Sul  -  Estado:  SC, País:  BR  \nId:  5092  -  Nome:  Bombinhas  -  Estado:  SC, País:  BR  \nId:  5093  -  Nome:  Bom Jardim da Serra  -  Estado:  SC, País:  BR  \nId:  5095  -  Nome:  Bom Jesus  -  Estado:  SC, País:  BR  \nId:  5094  -  Nome:  Bom Jesus do Oeste  -  Estado:  SC, País:  BR  \nId:  5096  -  Nome:  Bom Retiro  -  Estado:  SC, País:  BR  \nId:  5097  -  Nome:  Bom Sucesso  -  Estado:  SC, País:  BR  \nId:  5098  -  Nome:  Botuverá  -  Estado:  SC, País:  BR  \nId:  5099  -  Nome:  Braço do Norte  -  Estado:  SC, País:  BR  \nId:  5100  -  Nome:  Braço do Trombudo  -  Estado:  SC, País:  BR  \nId:  5101  -  Nome:  Brunópolis  -  Estado:  SC, País:  BR  \nId:  5102  -  Nome:  Brusque  -  Estado:  SC, País:  BR  \nId:  5103  -  Nome:  Caçador  -  Estado:  SC, País:  BR  \nId:  5104  -  Nome:  Caibi  -  Estado:  SC, País:  BR  \nId:  5105  -  Nome:  Calmon  -  Estado:  SC, País:  BR  \nId:  5106  -  Nome:  Camboriú  -  Estado:  SC, País:  BR  \nId:  5107  -  Nome:  Campina da Alegria  -  Estado:  SC, País:  BR  \nId:  5108  -  Nome:  Campo Alegre  -  Estado:  SC, País:  BR  \nId:  5109  -  Nome:  Campo Belo do Sul  -  Estado:  SC, País:  BR  \nId:  5110  -  Nome:  Campo Erê  -  Estado:  SC, País:  BR  \nId:  5111  -  Nome:  Campos Novos  -  Estado:  SC, País:  BR  \nId:  5112  -  Nome:  Canelinha  -  Estado:  SC, País:  BR  \nId:  5113  -  Nome:  Canoinhas  -  Estado:  SC, País:  BR  \nId:  5114  -  Nome:  Capão Alto  -  Estado:  SC, País:  BR  \nId:  5115  -  Nome:  Capinzal  -  Estado:  SC, País:  BR  \nId:  5116  -  Nome:  Capivari de Baixo  -  Estado:  SC, País:  BR  \nId:  5117  -  Nome:  Catanduvas  -  Estado:  SC, País:  BR  \nId:  5118  -  Nome:  Caxambu do Sul  -  Estado:  SC, País:  BR  \nId:  5119  -  Nome:  Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4888  -  Nome:  Cerro Negro  -  Estado:  SC, País:  BR  \nId:  4889  -  Nome:  Chapadão do Lageado  -  Estado:  SC, País:  BR  \nId:  4890  -  Nome:  Chapecó  -  Estado:  SC, País:  BR  \nId:  4891  -  Nome:  Cocal do Sul  -  Estado:  SC, País:  BR  \nId:  4892  -  Nome:  Concórdia  -  Estado:  SC, País:  BR  \nId:  4893  -  Nome:  Cordilheira Alta  -  Estado:  SC, País:  BR  \nId:  4894  -  Nome:  Coronel Freitas  -  Estado:  SC, País:  BR  \nId:  4895  -  Nome:  Coronel Martins  -  Estado:  SC, País:  BR  \nId:  4896  -  Nome:  Correia Pinto  -  Estado:  SC, País:  BR  \nId:  4897  -  Nome:  Corupá  -  Estado:  SC, País:  BR  \nId:  4898  -  Nome:  Criciúma  -  Estado:  SC, País:  BR  \nId:  4899  -  Nome:  Cunha Porã  -  Estado:  SC, País:  BR  \nId:  4900  -  Nome:  Cunhataí  -  Estado:  SC, País:  BR  \nId:  4901  -  Nome:  Curitibanos  -  Estado:  SC, País:  BR  \nId:  4902  -  Nome:  Descanso  -  Estado:  SC, País:  BR  \nId:  4903  -  Nome:  Dionísio Cerqueira  -  Estado:  SC, País:  BR  \nId:  4904  -  Nome:  Dona Emma  -  Estado:  SC, País:  BR  \nId:  4905  -  Nome:  Doutor Pedrinho  -  Estado:  SC, País:  BR  \nId:  4906  -  Nome:  Enseada de Brito  -  Estado:  SC, País:  BR  \nId:  4907  -  Nome:  Entre Rios  -  Estado:  SC, País:  BR  \nId:  4909  -  Nome:  Ermo  -  Estado:  SC, País:  BR  \nId:  4912  -  Nome:  Erval Velho  -  Estado:  SC, País:  BR  \nId:  4913  -  Nome:  Faxinal dos Guedes  -  Estado:  SC, País:  BR  \nId:  4914  -  Nome:  Flor do Sertão  -  Estado:  SC, País:  BR  \nId:  4915  -  Nome:  Florianópolis  -  Estado:  SC, País:  BR  \nId:  4916  -  Nome:  Formosa do Sul  -  Estado:  SC, País:  BR  \nId:  4918  -  Nome:  Forquilhinha  -  Estado:  SC, País:  BR  \nId:  4919  -  Nome:  Fraiburgo  -  Estado:  SC, País:  BR  \nId:  4920  -  Nome:  Frei Rogério  -  Estado:  SC, País:  BR  \nId:  4921  -  Nome:  Galvão  -  Estado:  SC, País:  BR  \nId:  4922  -  Nome:  Garopaba  -  Estado:  SC, País:  BR  \nId:  4923  -  Nome:  Garuva  -  Estado:  SC, País:  BR  \nId:  4924  -  Nome:  Gaspar  -  Estado:  SC, País:  BR  \nId:  4925  -  Nome:  Governador Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4927  -  Nome:  Grão Pará  -  Estado:  SC, País:  BR  \nId:  4928  -  Nome:  Gravatal  -  Estado:  SC, País:  BR  \nId:  4929  -  Nome:  Guabiruba  -  Estado:  SC, País:  BR  \nId:  4930  -  Nome:  Guaraciaba  -  Estado:  SC, País:  BR  \nId:  4931  -  Nome:  Guaramirim  -  Estado:  SC, País:  BR  \nId:  4932  -  Nome:  Guarda do Embaú  -  Estado:  SC, País:  BR  \nId:  4933  -  Nome:  Guarujá do Sul  -  Estado:  SC, País:  BR  \nId:  4935  -  Nome:  Guatá  -  Estado:  SC, País:  BR  \nId:  4934  -  Nome:  Guatambú  -  Estado:  SC, País:  BR  \nId:  4936  -  Nome:  Herval d'Oeste  -  Estado:  SC, País:  BR  \nId:  4937  -  Nome:  Ibiam  -  Estado:  SC, País:  BR  \nId:  4938  -  Nome:  Ibicaré  -  Estado:  SC, País:  BR  \nId:  4939  -  Nome:  Ibirama  -  Estado:  SC, País:  BR  \nId:  4940  -  Nome:  Içara  -  Estado:  SC, País:  BR  \nId:  4941  -  Nome:  Ilhota  -  Estado:  SC, País:  BR  \nId:  4942  -  Nome:  Imaruí  -  Estado:  SC, País:  BR  \nId:  4943  -  Nome:  Imbituba  -  Estado:  SC, País:  BR  \nId:  4944  -  Nome:  Imbuia  -  Estado:  SC, País:  BR  \nId:  4945  -  Nome:  Indaial  -  Estado:  SC, País:  BR  \nId:  4946  -  Nome:  Iomerê  -  Estado:  SC, País:  BR  \nId:  4947  -  Nome:  Ipira  -  Estado:  SC, País:  BR  \nId:  4948  -  Nome:  Ipoméia  -  Estado:  SC, País:  BR  \nId:  4949  -  Nome:  Iporã do Oeste  -  Estado:  SC, País:  BR  \nId:  4950  -  Nome:  Ipuaçu  -  Estado:  SC, País:  BR  \nId:  4951  -  Nome:  Ipumirim  -  Estado:  SC, País:  BR  \nId:  4952  -  Nome:  Iraceminha  -  Estado:  SC, País:  BR  \nId:  4953  -  Nome:  Irani  -  Estado:  SC, País:  BR  \nId:  4954  -  Nome:  Irati  -  Estado:  SC, País:  BR  \nId:  4955  -  Nome:  Irineópolis  -  Estado:  SC, País:  BR  \nId:  4962  -  Nome:  Itá  -  Estado:  SC, País:  BR  \nId:  4956  -  Nome:  Itaiópolis  -  Estado:  SC, País:  BR  \nId:  4957  -  Nome:  Itajaí  -  Estado:  SC, País:  BR  \nId:  4958  -  Nome:  Itapema  -  Estado:  SC, País:  BR  \nId:  4959  -  Nome:  Itapiranga  -  Estado:  SC, País:  BR  \nId:  4960  -  Nome:  Itapoá  -  Estado:  SC, País:  BR  \nId:  4961  -  Nome:  Itapocu  -  Estado:  SC, País:  BR  \nId:  4963  -  Nome:  Ituporanga  -  Estado:  SC, País:  BR  \nId:  4964  -  Nome:  Jaborá  -  Estado:  SC, País:  BR  \nId:  4965  -  Nome:  Jacinto Machado  -  Estado:  SC, País:  BR  \nId:  4966  -  Nome:  Jaguaruna  -  Estado:  SC, País:  BR  \nId:  4967  -  Nome:  Jaraguá do Sul  -  Estado:  SC, País:  BR  \nId:  4968  -  Nome:  Jardinópolis  -  Estado:  SC, País:  BR  \nId:  4969  -  Nome:  Joaçaba  -  Estado:  SC, País:  BR  \nId:  4970  -  Nome:  Joinville  -  Estado:  SC, País:  BR  \nId:  4971  -  Nome:  José Boiteux  -  Estado:  SC, País:  BR  \nId:  4972  -  Nome:  Jupiá  -  Estado:  SC, País:  BR  \nId:  4974  -  Nome:  Lacerdópolis  -  Estado:  SC, País:  BR  \nId:  4975  -  Nome:  Lages  -  Estado:  SC, País:  BR  \nId:  4976  -  Nome:  Laguna  -  Estado:  SC, País:  BR  \nId:  4977  -  Nome:  Lajeado Grande  -  Estado:  SC, País:  BR  \nId:  4978  -  Nome:  Laurentino  -  Estado:  SC, País:  BR  \nId:  4979  -  Nome:  Lauro Muller  -  Estado:  SC, País:  BR  \nId:  4980  -  Nome:  Lebon Régis  -  Estado:  SC, País:  BR  \nId:  4981  -  Nome:  Leoberto Leal  -  Estado:  SC, País:  BR  \nId:  4982  -  Nome:  Lindóia do Sul  -  Estado:  SC, País:  BR  \nId:  4983  -  Nome:  Lontras  -  Estado:  SC, País:  BR  \nId:  4984  -  Nome:  Luiz Alves  -  Estado:  SC, País:  BR  \nId:  4985  -  Nome:  Luzerna  -  Estado:  SC, País:  BR  \nId:  4986  -  Nome:  Macieira  -  Estado:  SC, País:  BR  \nId:  4987  -  Nome:  Mafra  -  Estado:  SC, País:  BR  \nId:  4988  -  Nome:  Major Gercino  -  Estado:  SC, País:  BR  \nId:  4989  -  Nome:  Major Vieira  -  Estado:  SC, País:  BR  \nId:  4990  -  Nome:  Maracajá  -  Estado:  SC, País:  BR  \nId:  4991  -  Nome:  Maravilha  -  Estado:  SC, País:  BR  \nId:  4992  -  Nome:  Marema  -  Estado:  SC, País:  BR  \nId:  4993  -  Nome:  Massaranduba  -  Estado:  SC, País:  BR  \nId:  4994  -  Nome:  Matos Costa  -  Estado:  SC, País:  BR  \nId:  4995  -  Nome:  Meleiro  -  Estado:  SC, País:  BR  \nId:  4996  -  Nome:  Mirim Doce  -  Estado:  SC, País:  BR  \nId:  4997  -  Nome:  Modelo  -  Estado:  SC, País:  BR  \nId:  4998  -  Nome:  Mondaí  -  Estado:  SC, País:  BR  \nId:  4999  -  Nome:  Monte Carlo  -  Estado:  SC, País:  BR  \nId:  5000  -  Nome:  Monte Castelo  -  Estado:  SC, País:  BR  \nId:  5001  -  Nome:  Morro da Fumaça  -  Estado:  SC, País:  BR  \nId:  5002  -  Nome:  Morro Grande  -  Estado:  SC, País:  BR  \nId:  5003  -  Nome:  Navegantes  -  Estado:  SC, País:  BR  \nId:  5004  -  Nome:  Nova Erechim  -  Estado:  SC, País:  BR  \nId:  5005  -  Nome:  Nova Itaberaba  -  Estado:  SC, País:  BR  \nId:  5006  -  Nome:  Nova Trento  -  Estado:  SC, País:  BR  \nId:  5007  -  Nome:  Nova Veneza  -  Estado:  SC, País:  BR  \nId:  4678  -  Nome:  Novo Horizonte  -  Estado:  SC, País:  BR  \nId:  4679  -  Nome:  Orleans  -  Estado:  SC, País:  BR  \nId:  4680  -  Nome:  Otacílio Costa  -  Estado:  SC, País:  BR  \nId:  4681  -  Nome:  Ouro  -  Estado:  SC, País:  BR  \nId:  4682  -  Nome:  Ouro Verde  -  Estado:  SC, País:  BR  \nId:  4683  -  Nome:  Paial  -  Estado:  SC, País:  BR  \nId:  4648  -  Nome:  Painel  -  Estado:  SC, País:  BR  \nId:  4756  -  Nome:  Palhoça  -  Estado:  SC, País:  BR  \nId:  4757  -  Nome:  Palma Sola  -  Estado:  SC, País:  BR  \nId:  4758  -  Nome:  Palmeira  -  Estado:  SC, País:  BR  \nId:  4759  -  Nome:  Palmitos  -  Estado:  SC, País:  BR  \nId:  4760  -  Nome:  Papanduva  -  Estado:  SC, País:  BR  \nId:  4761  -  Nome:  Paraíso  -  Estado:  SC, País:  BR  \nId:  4762  -  Nome:  Passo de Torres  -  Estado:  SC, País:  BR  \nId:  4763  -  Nome:  Passos Maia  -  Estado:  SC, País:  BR  \nId:  4764  -  Nome:  Paulo Lopes  -  Estado:  SC, País:  BR  \nId:  4765  -  Nome:  Pedras Grandes  -  Estado:  SC, País:  BR  \nId:  4766  -  Nome:  Penha  -  Estado:  SC, País:  BR  \nId:  4767  -  Nome:  Peritiba  -  Estado:  SC, País:  BR  \nId:  4768  -  Nome:  Petrolândia  -  Estado:  SC, País:  BR  \nId:  4770  -  Nome:  Pinhalzinho  -  Estado:  SC, País:  BR  \nId:  4771  -  Nome:  Pinheiro Preto  -  Estado:  SC, País:  BR  \nId:  4772  -  Nome:  Piratuba  -  Estado:  SC, País:  BR  \nId:  4773  -  Nome:  Planalto Alegre  -  Estado:  SC, País:  BR  \nId:  4774  -  Nome:  Pomerode  -  Estado:  SC, País:  BR  \nId:  4776  -  Nome:  Ponte Alta  -  Estado:  SC, País:  BR  \nId:  4775  -  Nome:  Ponte Alta do Norte  -  Estado:  SC, País:  BR  \nId:  4777  -  Nome:  Ponte Serrada  -  Estado:  SC, País:  BR  \nId:  4778  -  Nome:  Porto Belo  -  Estado:  SC, País:  BR  \nId:  4779  -  Nome:  Porto União  -  Estado:  SC, País:  BR  \nId:  4780  -  Nome:  Pouso Redondo  -  Estado:  SC, País:  BR  \nId:  4781  -  Nome:  Praia do Santinho  -  Estado:  SC, País:  BR  \nId:  4782  -  Nome:  Praia Grande  -  Estado:  SC, País:  BR  \nId:  4783  -  Nome:  Presidente Castelo Branco  -  Estado:  SC, País:  BR  \nId:  4784  -  Nome:  Presidente Getúlio  -  Estado:  SC, País:  BR  \nId:  4785  -  Nome:  Presidente Nereu  -  Estado:  SC, País:  BR  \nId:  4811  -  Nome:  Princesa  -  Estado:  SC, País:  BR  \nId:  4812  -  Nome:  Quilombo  -  Estado:  SC, País:  BR  \nId:  4813  -  Nome:  Rancho Queimado  -  Estado:  SC, País:  BR  \nId:  4814  -  Nome:  Rio das Antas  -  Estado:  SC, País:  BR  \nId:  4815  -  Nome:  Rio do Campo  -  Estado:  SC, País:  BR  \nId:  4816  -  Nome:  Rio d'Oeste  -  Estado:  SC, País:  BR  \nId:  4817  -  Nome:  Rio dos Cedros  -  Estado:  SC, País:  BR  \nId:  4818  -  Nome:  Rio do Sul  -  Estado:  SC, País:  BR  \nId:  4819  -  Nome:  Rio Fortuna  -  Estado:  SC, País:  BR  \nId:  4820  -  Nome:  Rio Negrinho  -  Estado:  SC, País:  BR  \nId:  4821  -  Nome:  Rio Rufino  -  Estado:  SC, País:  BR  \nId:  4822  -  Nome:  Riqueza  -  Estado:  SC, País:  BR  \nId:  4823  -  Nome:  Rodeio  -  Estado:  SC, País:  BR  \nId:  4824  -  Nome:  Romelândia  -  Estado:  SC, País:  BR  \nId:  4825  -  Nome:  Salete  -  Estado:  SC, País:  BR  \nId:  4826  -  Nome:  Saltinho  -  Estado:  SC, País:  BR  \nId:  4827  -  Nome:  Salto Veloso  -  Estado:  SC, País:  BR  \nId:  4828  -  Nome:  Sangão  -  Estado:  SC, País:  BR  \nId:  4829  -  Nome:  Santa Cecília  -  Estado:  SC, País:  BR  \nId:  4830  -  Nome:  Santa Helena  -  Estado:  SC, País:  BR  \nId:  4831  -  Nome:  Santa Rosa de Lima  -  Estado:  SC, País:  BR  \nId:  4832  -  Nome:  Santa Rosa do Sul  -  Estado:  SC, País:  BR  \nId:  4834  -  Nome:  Santa Terezinha  -  Estado:  SC, País:  BR  \nId:  4833  -  Nome:  Santa Terezinha do Progresso  -  Estado:  SC, País:  BR  \nId:  4835  -  Nome:  Santiago do Sul  -  Estado:  SC, País:  BR  \nId:  4836  -  Nome:  Santo Amaro da Imperatriz  -  Estado:  SC, País:  BR  \nId:  4837  -  Nome:  São Bento do Sul  -  Estado:  SC, País:  BR  \nId:  4838  -  Nome:  São Bernardino  -  Estado:  SC, País:  BR  \nId:  4839  -  Nome:  São Bonifácio  -  Estado:  SC, País:  BR  \nId:  4840  -  Nome:  São Carlos  -  Estado:  SC, País:  BR  \nId:  4841  -  Nome:  São Cristovão do Sul  -  Estado:  SC, País:  BR  \nId:  4842  -  Nome:  São Domingos  -  Estado:  SC, País:  BR  \nId:  4843  -  Nome:  São Francisco do Sul  -  Estado:  SC, País:  BR  \nId:  4844  -  Nome:  São João Batista  -  Estado:  SC, País:  BR  \nId:  4845  -  Nome:  São João do Itaperiú  -  Estado:  SC, País:  BR  \nId:  4846  -  Nome:  São João do Oeste  -  Estado:  SC, País:  BR  \nId:  4847  -  Nome:  São João do Sul  -  Estado:  SC, País:  BR  \nId:  4848  -  Nome:  São Joaquim  -  Estado:  SC, País:  BR  \nId:  4851  -  Nome:  São José  -  Estado:  SC, País:  BR  \nId:  4849  -  Nome:  São José do Cedro  -  Estado:  SC, País:  BR  \nId:  4850  -  Nome:  São José do Cerrito  -  Estado:  SC, País:  BR  \nId:  4852  -  Nome:  São Lourenço d'Oeste  -  Estado:  SC, País:  BR  \nId:  4853  -  Nome:  São Ludgero  -  Estado:  SC, País:  BR  \nId:  4854  -  Nome:  São Martinho  -  Estado:  SC, País:  BR  \nId:  4855  -  Nome:  São Miguel da Boa Vista  -  Estado:  SC, País:  BR  \nId:  4856  -  Nome:  São Miguel do Oeste  -  Estado:  SC, País:  BR  \nId:  4857  -  Nome:  São Pedro de Alcântara  -  Estado:  SC, País:  BR  \nId:  4858  -  Nome:  Saudades  -  Estado:  SC, País:  BR  \nId:  85793  -  Nome:  SBCH  -  Estado:  SC, País:  BR  \nId:  74832  -  Nome:  SBFL  -  Estado:  SC, País:  BR  \nId:  74833  -  Nome:  SBJV  -  Estado:  SC, País:  BR  \nId:  85285  -  Nome:  SBNF  -  Estado:  SC, País:  BR  \nId:  4859  -  Nome:  Schroeder  -  Estado:  SC, País:  BR  \nId:  4860  -  Nome:  Seara  -  Estado:  SC, País:  BR  \nId:  4861  -  Nome:  Serra Alta  -  Estado:  SC, País:  BR  \nId:  4862  -  Nome:  Siderópolis  -  Estado:  SC, País:  BR  \nId:  4863  -  Nome:  Sombrio  -  Estado:  SC, País:  BR  \nId:  4864  -  Nome:  Sul Brasil  -  Estado:  SC, País:  BR  \nId:  4865  -  Nome:  Taió  -  Estado:  SC, País:  BR  \nId:  4866  -  Nome:  Tangará  -  Estado:  SC, País:  BR  \nId:  4867  -  Nome:  Tigrinhos  -  Estado:  SC, País:  BR  \nId:  4868  -  Nome:  Tijucas  -  Estado:  SC, País:  BR  \nId:  4869  -  Nome:  Timbé do Sul  -  Estado:  SC, País:  BR  \nId:  4871  -  Nome:  Timbó  -  Estado:  SC, País:  BR  \nId:  4870  -  Nome:  Timbó Grande  -  Estado:  SC, País:  BR  \nId:  4872  -  Nome:  Três Barras  -  Estado:  SC, País:  BR  \nId:  4875  -  Nome:  Treviso  -  Estado:  SC, País:  BR  \nId:  4878  -  Nome:  Treze de Maio  -  Estado:  SC, País:  BR  \nId:  4879  -  Nome:  Treze Tílias  -  Estado:  SC, País:  BR  \nId:  4880  -  Nome:  Trombudo Central  -  Estado:  SC, País:  BR  \nId:  4881  -  Nome:  Tubarão  -  Estado:  SC, País:  BR  \nId:  4882  -  Nome:  Tunápolis  -  Estado:  SC, País:  BR  \nId:  4883  -  Nome:  Turvo  -  Estado:  SC, País:  BR  \nId:  4884  -  Nome:  União do Oeste  -  Estado:  SC, País:  BR  \nId:  4885  -  Nome:  Urubici  -  Estado:  SC, País:  BR  \nId:  4886  -  Nome:  Urupema  -  Estado:  SC, País:  BR  \nId:  4887  -  Nome:  Urussanga  -  Estado:  SC, País:  BR  \nId:  4482  -  Nome:  Vargeão  -  Estado:  SC, País:  BR  \nId:  4484  -  Nome:  Vargem  -  Estado:  SC, País:  BR  \nId:  4483  -  Nome:  Vargem Bonita  -  Estado:  SC, País:  BR  \nId:  4485  -  Nome:  Vidal Ramos  -  Estado:  SC, País:  BR  \nId:  4486  -  Nome:  Videira  -  Estado:  SC, País:  BR  \nId:  4487  -  Nome:  Vitor Meireles  -  Estado:  SC, País:  BR  \nId:  4488  -  Nome:  Witmarsum  -  Estado:  SC, País:  BR  \nId:  4489  -  Nome:  Xanxerê  -  Estado:  SC, País:  BR  \nId:  4490  -  Nome:  Xavantina  -  Estado:  SC, País:  BR  \nId:  4491  -  Nome:  Xaxim  -  Estado:  SC, País:  BR  \nId:  4492  -  Nome:  Zortéa  -  Estado:  SC, País:  BR  \n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/io.txt",
    "content": "2022-03-13T22:55:49.667759 : Erro ao salvar tempo\n2022-03-13T22:55:49.667759 : #0      salvarTempo (package:climatempo/log.dart:36:3)\n#1      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:300:17)\n#2      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_erros/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/bin/climatempo.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/alerta_server.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/log.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) {\n  runZonedGuarded(() {\n    executar(args);\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s);\n  });\n}\n\nFuture<void> executar(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  if (comando != null && comando.name == 'cidade') {\n    final nomeCidade = comando['nome'];\n    final estado = comando['estado'];\n    final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n    if (comando['salvar']) await salvarCidadesIsolate(cidades);\n    cidades.forEach((c) => print(c));\n  }\n\n  if (comando != null && comando.name == 'agora') {\n    final id = comando['id'];\n    if (id == null) {\n      print('É obrigatório informar um [-id] de cidade');\n      exit(2);\n    }\n    final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n    if (comando['salvar']) await salvarTempoIsolate(tempo);\n    print(tempo);\n  }\n\n  if (comando != null && comando.name == 'alerta') {\n    AlertaServer().start().listen(print);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand('alerta')\n    ..addCommand(\n      'cidade',\n      ArgParser()\n        ..addOption('nome',\n            abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n        ..addOption('estado',\n            abbr: 'e', valueHelp: 'Sigla do estado para consulta')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addCommand(\n      'agora',\n      ArgParser()\n        ..addOption('id',\n            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/alerta_server.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nclass AlertaServer {\n  Stream<String> start() async* {\n    var server = await HttpServer.bind(\n      InternetAddress.loopbackIPv4,\n      8080,\n    );\n    await for (HttpRequest request in server) {\n      final contentType = request.headers.contentType != null\n          ? request.headers.contentType!.mimeType : '';\n      final response = request.response;\n\n      if (request.method == 'POST'\n          && contentType == 'application/json') {\n        final requestMap = await utf8.decoder.bind(request).join();\n        final String? aviso = jsonDecode(requestMap)['aviso'];\n        if (aviso != null) {\n          response\n            ..statusCode = HttpStatus.ok\n            ..write('Informação recebida!');\n          yield aviso;\n        } else {\n          response\n            ..statusCode = HttpStatus.badRequest\n            ..write('Formato de request errado..');\n        }\n      } else {\n        response\n          ..statusCode = HttpStatus.methodNotAllowed\n          ..write('É aceito apenas request POST');\n      }\n      await request.response.close();\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/log.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:climatempo/model/clima_tempo.dart';\n\nimport 'model/cidade.dart';\n\nFuture<void> _validarDiretorio() async {\n  final dir = Directory('log');\n  if (!(await dir.exists())) {\n    await dir.create();\n  }\n}\n\nFuture<void> salvarTempoIsolate(ClimaTempo climaTempo) async {\n  final isolate = await Isolate.spawn(salvarTempo, climaTempo);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarTempo(ClimaTempo climaTempo) async {\n  runZonedGuarded(() async {\n    await _validarDiretorio();\n    final file = File('log/${climaTempo.cidade.id}.txt');\n    await file.writeAsString('===\\n$climaTempo', mode: FileMode.append);\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s, fileName: 'io.txt');\n  });\n}\n\nvoid _registrarCallbackFinalizacao(Isolate isolate) {\n  final receivePort = ReceivePort();\n  receivePort.listen((mensagem) {\n    print(mensagem);\n    receivePort.close();\n  });\n  isolate.addOnExitListener(receivePort.sendPort,\n      response: 'Arquivo salvo com sucesso!');\n}\n\nFuture<void> salvarCidadesIsolate(List<Cidade> cidades) async {\n  final isolate = await Isolate.spawn(salvarCidades, cidades);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarCidades(List<Cidade> cidades) async {\n  runZonedGuarded(() async {\n    await _validarDiretorio();\n    final file = File('log/cidades.txt');\n    final sink = file.openWrite(mode: FileMode.write);\n    cidades.forEach((c) => sink.writeln(c));\n    await sink.flush();\n    await sink.close();\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s, fileName: 'io.txt');\n  });\n}\n\nFuture<void> salvarErro(Object erro, StackTrace stackTrace,\n    {String? fileName}) async {\n  await _validarDiretorio();\n\n  final data = DateTime.now();\n  final ano = data.year;\n  final mes = _doisDigitos(data.month);\n  final dia = _doisDigitos(data.day);\n  final fileDir = 'log/${fileName ?? '$dia$mes$ano.txt'}';\n  final file = File(fileDir);\n\n  await file.writeAsString('${data.toIso8601String()} : $erro\\n',\n      mode: FileMode.append);\n  await file.writeAsString('${data.toIso8601String()} : $stackTrace',\n      mode: FileMode.append);\n}\n\nString _doisDigitos(int numero) {\n  if (numero >= 10) return '$numero';\n  return '0$numero';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/13032022.txt",
    "content": "2022-03-13T22:18:37.172126 : {\"error\":true,\"detail\":\"Invalid token\"}\n2022-03-13T22:18:37.172126 : #0      climaAtual (package:climatempo/api.dart:34:35)\n<asynchronous suspension>\n#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)\n<asynchronous suspension>\n#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)\n<asynchronous suspension>\n2022-03-13T22:18:54.065327 : {\"error\":true,\"detail\":\"Invalid token\"}\n2022-03-13T22:18:54.065327 : #0      climaAtual (package:climatempo/api.dart:34:35)\n<asynchronous suspension>\n#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)\n<asynchronous suspension>\n#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)\n<asynchronous suspension>"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/4915.txt",
    "content": "===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:45:02.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 22:18:07.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  15\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 22:18:07.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  15\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/cidades.txt",
    "content": "Id:  5049  -  Nome:  Abdon Batista  -  Estado:  SC, País:  BR  \nId:  5050  -  Nome:  Abelardo Luz  -  Estado:  SC, País:  BR  \nId:  5051  -  Nome:  Agrolândia  -  Estado:  SC, País:  BR  \nId:  5052  -  Nome:  Agronômica  -  Estado:  SC, País:  BR  \nId:  5053  -  Nome:  Água Doce  -  Estado:  SC, País:  BR  \nId:  5054  -  Nome:  Águas Brancas  -  Estado:  SC, País:  BR  \nId:  5055  -  Nome:  Águas de Chapecó  -  Estado:  SC, País:  BR  \nId:  5056  -  Nome:  Águas Frias  -  Estado:  SC, País:  BR  \nId:  5057  -  Nome:  Águas Mornas  -  Estado:  SC, País:  BR  \nId:  5058  -  Nome:  Alfredo Wagner  -  Estado:  SC, País:  BR  \nId:  5059  -  Nome:  Alto Bela Vista  -  Estado:  SC, País:  BR  \nId:  5060  -  Nome:  Anchieta  -  Estado:  SC, País:  BR  \nId:  5061  -  Nome:  Angelina  -  Estado:  SC, País:  BR  \nId:  5062  -  Nome:  Anita Garibaldi  -  Estado:  SC, País:  BR  \nId:  5063  -  Nome:  Anitápolis  -  Estado:  SC, País:  BR  \nId:  5064  -  Nome:  Anta Gorda  -  Estado:  SC, País:  BR  \nId:  5065  -  Nome:  Antônio Carlos  -  Estado:  SC, País:  BR  \nId:  5066  -  Nome:  Apiúna  -  Estado:  SC, País:  BR  \nId:  5067  -  Nome:  Arabutã  -  Estado:  SC, País:  BR  \nId:  5068  -  Nome:  Araquari  -  Estado:  SC, País:  BR  \nId:  5069  -  Nome:  Araranguá  -  Estado:  SC, País:  BR  \nId:  5070  -  Nome:  Armazém  -  Estado:  SC, País:  BR  \nId:  5071  -  Nome:  Arroio Trinta  -  Estado:  SC, País:  BR  \nId:  5072  -  Nome:  Arvoredo  -  Estado:  SC, País:  BR  \nId:  5073  -  Nome:  Ascurra  -  Estado:  SC, País:  BR  \nId:  5074  -  Nome:  Atalanta  -  Estado:  SC, País:  BR  \nId:  5075  -  Nome:  Aurora  -  Estado:  SC, País:  BR  \nId:  5076  -  Nome:  Balneário Arroio do Silva  -  Estado:  SC, País:  BR  \nId:  5077  -  Nome:  Balneário Barra do Sul  -  Estado:  SC, País:  BR  \nId:  5078  -  Nome:  Balneário Camboriú  -  Estado:  SC, País:  BR  \nId:  5080  -  Nome:  Balneário Gaivota  -  Estado:  SC, País:  BR  \nId:  4769  -  Nome:  Balneário Piçarras  -  Estado:  SC, País:  BR  \nId:  5081  -  Nome:  Bandeirante  -  Estado:  SC, País:  BR  \nId:  5082  -  Nome:  Barra Bonita  -  Estado:  SC, País:  BR  \nId:  5083  -  Nome:  Barra do Ibiraquera  -  Estado:  SC, País:  BR  \nId:  5084  -  Nome:  Barra do Saí  -  Estado:  SC, País:  BR  \nId:  5085  -  Nome:  Barra Velha  -  Estado:  SC, País:  BR  \nId:  5086  -  Nome:  Bela Vista do Toldo  -  Estado:  SC, País:  BR  \nId:  5087  -  Nome:  Belmonte  -  Estado:  SC, País:  BR  \nId:  5088  -  Nome:  Benedito Novo  -  Estado:  SC, País:  BR  \nId:  5089  -  Nome:  Biguaçu  -  Estado:  SC, País:  BR  \nId:  5090  -  Nome:  Blumenau  -  Estado:  SC, País:  BR  \nId:  5091  -  Nome:  Bocaina do Sul  -  Estado:  SC, País:  BR  \nId:  5092  -  Nome:  Bombinhas  -  Estado:  SC, País:  BR  \nId:  5093  -  Nome:  Bom Jardim da Serra  -  Estado:  SC, País:  BR  \nId:  5095  -  Nome:  Bom Jesus  -  Estado:  SC, País:  BR  \nId:  5094  -  Nome:  Bom Jesus do Oeste  -  Estado:  SC, País:  BR  \nId:  5096  -  Nome:  Bom Retiro  -  Estado:  SC, País:  BR  \nId:  5097  -  Nome:  Bom Sucesso  -  Estado:  SC, País:  BR  \nId:  5098  -  Nome:  Botuverá  -  Estado:  SC, País:  BR  \nId:  5099  -  Nome:  Braço do Norte  -  Estado:  SC, País:  BR  \nId:  5100  -  Nome:  Braço do Trombudo  -  Estado:  SC, País:  BR  \nId:  5101  -  Nome:  Brunópolis  -  Estado:  SC, País:  BR  \nId:  5102  -  Nome:  Brusque  -  Estado:  SC, País:  BR  \nId:  5103  -  Nome:  Caçador  -  Estado:  SC, País:  BR  \nId:  5104  -  Nome:  Caibi  -  Estado:  SC, País:  BR  \nId:  5105  -  Nome:  Calmon  -  Estado:  SC, País:  BR  \nId:  5106  -  Nome:  Camboriú  -  Estado:  SC, País:  BR  \nId:  5107  -  Nome:  Campina da Alegria  -  Estado:  SC, País:  BR  \nId:  5108  -  Nome:  Campo Alegre  -  Estado:  SC, País:  BR  \nId:  5109  -  Nome:  Campo Belo do Sul  -  Estado:  SC, País:  BR  \nId:  5110  -  Nome:  Campo Erê  -  Estado:  SC, País:  BR  \nId:  5111  -  Nome:  Campos Novos  -  Estado:  SC, País:  BR  \nId:  5112  -  Nome:  Canelinha  -  Estado:  SC, País:  BR  \nId:  5113  -  Nome:  Canoinhas  -  Estado:  SC, País:  BR  \nId:  5114  -  Nome:  Capão Alto  -  Estado:  SC, País:  BR  \nId:  5115  -  Nome:  Capinzal  -  Estado:  SC, País:  BR  \nId:  5116  -  Nome:  Capivari de Baixo  -  Estado:  SC, País:  BR  \nId:  5117  -  Nome:  Catanduvas  -  Estado:  SC, País:  BR  \nId:  5118  -  Nome:  Caxambu do Sul  -  Estado:  SC, País:  BR  \nId:  5119  -  Nome:  Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4888  -  Nome:  Cerro Negro  -  Estado:  SC, País:  BR  \nId:  4889  -  Nome:  Chapadão do Lageado  -  Estado:  SC, País:  BR  \nId:  4890  -  Nome:  Chapecó  -  Estado:  SC, País:  BR  \nId:  4891  -  Nome:  Cocal do Sul  -  Estado:  SC, País:  BR  \nId:  4892  -  Nome:  Concórdia  -  Estado:  SC, País:  BR  \nId:  4893  -  Nome:  Cordilheira Alta  -  Estado:  SC, País:  BR  \nId:  4894  -  Nome:  Coronel Freitas  -  Estado:  SC, País:  BR  \nId:  4895  -  Nome:  Coronel Martins  -  Estado:  SC, País:  BR  \nId:  4896  -  Nome:  Correia Pinto  -  Estado:  SC, País:  BR  \nId:  4897  -  Nome:  Corupá  -  Estado:  SC, País:  BR  \nId:  4898  -  Nome:  Criciúma  -  Estado:  SC, País:  BR  \nId:  4899  -  Nome:  Cunha Porã  -  Estado:  SC, País:  BR  \nId:  4900  -  Nome:  Cunhataí  -  Estado:  SC, País:  BR  \nId:  4901  -  Nome:  Curitibanos  -  Estado:  SC, País:  BR  \nId:  4902  -  Nome:  Descanso  -  Estado:  SC, País:  BR  \nId:  4903  -  Nome:  Dionísio Cerqueira  -  Estado:  SC, País:  BR  \nId:  4904  -  Nome:  Dona Emma  -  Estado:  SC, País:  BR  \nId:  4905  -  Nome:  Doutor Pedrinho  -  Estado:  SC, País:  BR  \nId:  4906  -  Nome:  Enseada de Brito  -  Estado:  SC, País:  BR  \nId:  4907  -  Nome:  Entre Rios  -  Estado:  SC, País:  BR  \nId:  4909  -  Nome:  Ermo  -  Estado:  SC, País:  BR  \nId:  4912  -  Nome:  Erval Velho  -  Estado:  SC, País:  BR  \nId:  4913  -  Nome:  Faxinal dos Guedes  -  Estado:  SC, País:  BR  \nId:  4914  -  Nome:  Flor do Sertão  -  Estado:  SC, País:  BR  \nId:  4915  -  Nome:  Florianópolis  -  Estado:  SC, País:  BR  \nId:  4916  -  Nome:  Formosa do Sul  -  Estado:  SC, País:  BR  \nId:  4918  -  Nome:  Forquilhinha  -  Estado:  SC, País:  BR  \nId:  4919  -  Nome:  Fraiburgo  -  Estado:  SC, País:  BR  \nId:  4920  -  Nome:  Frei Rogério  -  Estado:  SC, País:  BR  \nId:  4921  -  Nome:  Galvão  -  Estado:  SC, País:  BR  \nId:  4922  -  Nome:  Garopaba  -  Estado:  SC, País:  BR  \nId:  4923  -  Nome:  Garuva  -  Estado:  SC, País:  BR  \nId:  4924  -  Nome:  Gaspar  -  Estado:  SC, País:  BR  \nId:  4925  -  Nome:  Governador Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4927  -  Nome:  Grão Pará  -  Estado:  SC, País:  BR  \nId:  4928  -  Nome:  Gravatal  -  Estado:  SC, País:  BR  \nId:  4929  -  Nome:  Guabiruba  -  Estado:  SC, País:  BR  \nId:  4930  -  Nome:  Guaraciaba  -  Estado:  SC, País:  BR  \nId:  4931  -  Nome:  Guaramirim  -  Estado:  SC, País:  BR  \nId:  4932  -  Nome:  Guarda do Embaú  -  Estado:  SC, País:  BR  \nId:  4933  -  Nome:  Guarujá do Sul  -  Estado:  SC, País:  BR  \nId:  4935  -  Nome:  Guatá  -  Estado:  SC, País:  BR  \nId:  4934  -  Nome:  Guatambú  -  Estado:  SC, País:  BR  \nId:  4936  -  Nome:  Herval d'Oeste  -  Estado:  SC, País:  BR  \nId:  4937  -  Nome:  Ibiam  -  Estado:  SC, País:  BR  \nId:  4938  -  Nome:  Ibicaré  -  Estado:  SC, País:  BR  \nId:  4939  -  Nome:  Ibirama  -  Estado:  SC, País:  BR  \nId:  4940  -  Nome:  Içara  -  Estado:  SC, País:  BR  \nId:  4941  -  Nome:  Ilhota  -  Estado:  SC, País:  BR  \nId:  4942  -  Nome:  Imaruí  -  Estado:  SC, País:  BR  \nId:  4943  -  Nome:  Imbituba  -  Estado:  SC, País:  BR  \nId:  4944  -  Nome:  Imbuia  -  Estado:  SC, País:  BR  \nId:  4945  -  Nome:  Indaial  -  Estado:  SC, País:  BR  \nId:  4946  -  Nome:  Iomerê  -  Estado:  SC, País:  BR  \nId:  4947  -  Nome:  Ipira  -  Estado:  SC, País:  BR  \nId:  4948  -  Nome:  Ipoméia  -  Estado:  SC, País:  BR  \nId:  4949  -  Nome:  Iporã do Oeste  -  Estado:  SC, País:  BR  \nId:  4950  -  Nome:  Ipuaçu  -  Estado:  SC, País:  BR  \nId:  4951  -  Nome:  Ipumirim  -  Estado:  SC, País:  BR  \nId:  4952  -  Nome:  Iraceminha  -  Estado:  SC, País:  BR  \nId:  4953  -  Nome:  Irani  -  Estado:  SC, País:  BR  \nId:  4954  -  Nome:  Irati  -  Estado:  SC, País:  BR  \nId:  4955  -  Nome:  Irineópolis  -  Estado:  SC, País:  BR  \nId:  4962  -  Nome:  Itá  -  Estado:  SC, País:  BR  \nId:  4956  -  Nome:  Itaiópolis  -  Estado:  SC, País:  BR  \nId:  4957  -  Nome:  Itajaí  -  Estado:  SC, País:  BR  \nId:  4958  -  Nome:  Itapema  -  Estado:  SC, País:  BR  \nId:  4959  -  Nome:  Itapiranga  -  Estado:  SC, País:  BR  \nId:  4960  -  Nome:  Itapoá  -  Estado:  SC, País:  BR  \nId:  4961  -  Nome:  Itapocu  -  Estado:  SC, País:  BR  \nId:  4963  -  Nome:  Ituporanga  -  Estado:  SC, País:  BR  \nId:  4964  -  Nome:  Jaborá  -  Estado:  SC, País:  BR  \nId:  4965  -  Nome:  Jacinto Machado  -  Estado:  SC, País:  BR  \nId:  4966  -  Nome:  Jaguaruna  -  Estado:  SC, País:  BR  \nId:  4967  -  Nome:  Jaraguá do Sul  -  Estado:  SC, País:  BR  \nId:  4968  -  Nome:  Jardinópolis  -  Estado:  SC, País:  BR  \nId:  4969  -  Nome:  Joaçaba  -  Estado:  SC, País:  BR  \nId:  4970  -  Nome:  Joinville  -  Estado:  SC, País:  BR  \nId:  4971  -  Nome:  José Boiteux  -  Estado:  SC, País:  BR  \nId:  4972  -  Nome:  Jupiá  -  Estado:  SC, País:  BR  \nId:  4974  -  Nome:  Lacerdópolis  -  Estado:  SC, País:  BR  \nId:  4975  -  Nome:  Lages  -  Estado:  SC, País:  BR  \nId:  4976  -  Nome:  Laguna  -  Estado:  SC, País:  BR  \nId:  4977  -  Nome:  Lajeado Grande  -  Estado:  SC, País:  BR  \nId:  4978  -  Nome:  Laurentino  -  Estado:  SC, País:  BR  \nId:  4979  -  Nome:  Lauro Muller  -  Estado:  SC, País:  BR  \nId:  4980  -  Nome:  Lebon Régis  -  Estado:  SC, País:  BR  \nId:  4981  -  Nome:  Leoberto Leal  -  Estado:  SC, País:  BR  \nId:  4982  -  Nome:  Lindóia do Sul  -  Estado:  SC, País:  BR  \nId:  4983  -  Nome:  Lontras  -  Estado:  SC, País:  BR  \nId:  4984  -  Nome:  Luiz Alves  -  Estado:  SC, País:  BR  \nId:  4985  -  Nome:  Luzerna  -  Estado:  SC, País:  BR  \nId:  4986  -  Nome:  Macieira  -  Estado:  SC, País:  BR  \nId:  4987  -  Nome:  Mafra  -  Estado:  SC, País:  BR  \nId:  4988  -  Nome:  Major Gercino  -  Estado:  SC, País:  BR  \nId:  4989  -  Nome:  Major Vieira  -  Estado:  SC, País:  BR  \nId:  4990  -  Nome:  Maracajá  -  Estado:  SC, País:  BR  \nId:  4991  -  Nome:  Maravilha  -  Estado:  SC, País:  BR  \nId:  4992  -  Nome:  Marema  -  Estado:  SC, País:  BR  \nId:  4993  -  Nome:  Massaranduba  -  Estado:  SC, País:  BR  \nId:  4994  -  Nome:  Matos Costa  -  Estado:  SC, País:  BR  \nId:  4995  -  Nome:  Meleiro  -  Estado:  SC, País:  BR  \nId:  4996  -  Nome:  Mirim Doce  -  Estado:  SC, País:  BR  \nId:  4997  -  Nome:  Modelo  -  Estado:  SC, País:  BR  \nId:  4998  -  Nome:  Mondaí  -  Estado:  SC, País:  BR  \nId:  4999  -  Nome:  Monte Carlo  -  Estado:  SC, País:  BR  \nId:  5000  -  Nome:  Monte Castelo  -  Estado:  SC, País:  BR  \nId:  5001  -  Nome:  Morro da Fumaça  -  Estado:  SC, País:  BR  \nId:  5002  -  Nome:  Morro Grande  -  Estado:  SC, País:  BR  \nId:  5003  -  Nome:  Navegantes  -  Estado:  SC, País:  BR  \nId:  5004  -  Nome:  Nova Erechim  -  Estado:  SC, País:  BR  \nId:  5005  -  Nome:  Nova Itaberaba  -  Estado:  SC, País:  BR  \nId:  5006  -  Nome:  Nova Trento  -  Estado:  SC, País:  BR  \nId:  5007  -  Nome:  Nova Veneza  -  Estado:  SC, País:  BR  \nId:  4678  -  Nome:  Novo Horizonte  -  Estado:  SC, País:  BR  \nId:  4679  -  Nome:  Orleans  -  Estado:  SC, País:  BR  \nId:  4680  -  Nome:  Otacílio Costa  -  Estado:  SC, País:  BR  \nId:  4681  -  Nome:  Ouro  -  Estado:  SC, País:  BR  \nId:  4682  -  Nome:  Ouro Verde  -  Estado:  SC, País:  BR  \nId:  4683  -  Nome:  Paial  -  Estado:  SC, País:  BR  \nId:  4648  -  Nome:  Painel  -  Estado:  SC, País:  BR  \nId:  4756  -  Nome:  Palhoça  -  Estado:  SC, País:  BR  \nId:  4757  -  Nome:  Palma Sola  -  Estado:  SC, País:  BR  \nId:  4758  -  Nome:  Palmeira  -  Estado:  SC, País:  BR  \nId:  4759  -  Nome:  Palmitos  -  Estado:  SC, País:  BR  \nId:  4760  -  Nome:  Papanduva  -  Estado:  SC, País:  BR  \nId:  4761  -  Nome:  Paraíso  -  Estado:  SC, País:  BR  \nId:  4762  -  Nome:  Passo de Torres  -  Estado:  SC, País:  BR  \nId:  4763  -  Nome:  Passos Maia  -  Estado:  SC, País:  BR  \nId:  4764  -  Nome:  Paulo Lopes  -  Estado:  SC, País:  BR  \nId:  4765  -  Nome:  Pedras Grandes  -  Estado:  SC, País:  BR  \nId:  4766  -  Nome:  Penha  -  Estado:  SC, País:  BR  \nId:  4767  -  Nome:  Peritiba  -  Estado:  SC, País:  BR  \nId:  4768  -  Nome:  Petrolândia  -  Estado:  SC, País:  BR  \nId:  4770  -  Nome:  Pinhalzinho  -  Estado:  SC, País:  BR  \nId:  4771  -  Nome:  Pinheiro Preto  -  Estado:  SC, País:  BR  \nId:  4772  -  Nome:  Piratuba  -  Estado:  SC, País:  BR  \nId:  4773  -  Nome:  Planalto Alegre  -  Estado:  SC, País:  BR  \nId:  4774  -  Nome:  Pomerode  -  Estado:  SC, País:  BR  \nId:  4776  -  Nome:  Ponte Alta  -  Estado:  SC, País:  BR  \nId:  4775  -  Nome:  Ponte Alta do Norte  -  Estado:  SC, País:  BR  \nId:  4777  -  Nome:  Ponte Serrada  -  Estado:  SC, País:  BR  \nId:  4778  -  Nome:  Porto Belo  -  Estado:  SC, País:  BR  \nId:  4779  -  Nome:  Porto União  -  Estado:  SC, País:  BR  \nId:  4780  -  Nome:  Pouso Redondo  -  Estado:  SC, País:  BR  \nId:  4781  -  Nome:  Praia do Santinho  -  Estado:  SC, País:  BR  \nId:  4782  -  Nome:  Praia Grande  -  Estado:  SC, País:  BR  \nId:  4783  -  Nome:  Presidente Castelo Branco  -  Estado:  SC, País:  BR  \nId:  4784  -  Nome:  Presidente Getúlio  -  Estado:  SC, País:  BR  \nId:  4785  -  Nome:  Presidente Nereu  -  Estado:  SC, País:  BR  \nId:  4811  -  Nome:  Princesa  -  Estado:  SC, País:  BR  \nId:  4812  -  Nome:  Quilombo  -  Estado:  SC, País:  BR  \nId:  4813  -  Nome:  Rancho Queimado  -  Estado:  SC, País:  BR  \nId:  4814  -  Nome:  Rio das Antas  -  Estado:  SC, País:  BR  \nId:  4815  -  Nome:  Rio do Campo  -  Estado:  SC, País:  BR  \nId:  4816  -  Nome:  Rio d'Oeste  -  Estado:  SC, País:  BR  \nId:  4817  -  Nome:  Rio dos Cedros  -  Estado:  SC, País:  BR  \nId:  4818  -  Nome:  Rio do Sul  -  Estado:  SC, País:  BR  \nId:  4819  -  Nome:  Rio Fortuna  -  Estado:  SC, País:  BR  \nId:  4820  -  Nome:  Rio Negrinho  -  Estado:  SC, País:  BR  \nId:  4821  -  Nome:  Rio Rufino  -  Estado:  SC, País:  BR  \nId:  4822  -  Nome:  Riqueza  -  Estado:  SC, País:  BR  \nId:  4823  -  Nome:  Rodeio  -  Estado:  SC, País:  BR  \nId:  4824  -  Nome:  Romelândia  -  Estado:  SC, País:  BR  \nId:  4825  -  Nome:  Salete  -  Estado:  SC, País:  BR  \nId:  4826  -  Nome:  Saltinho  -  Estado:  SC, País:  BR  \nId:  4827  -  Nome:  Salto Veloso  -  Estado:  SC, País:  BR  \nId:  4828  -  Nome:  Sangão  -  Estado:  SC, País:  BR  \nId:  4829  -  Nome:  Santa Cecília  -  Estado:  SC, País:  BR  \nId:  4830  -  Nome:  Santa Helena  -  Estado:  SC, País:  BR  \nId:  4831  -  Nome:  Santa Rosa de Lima  -  Estado:  SC, País:  BR  \nId:  4832  -  Nome:  Santa Rosa do Sul  -  Estado:  SC, País:  BR  \nId:  4834  -  Nome:  Santa Terezinha  -  Estado:  SC, País:  BR  \nId:  4833  -  Nome:  Santa Terezinha do Progresso  -  Estado:  SC, País:  BR  \nId:  4835  -  Nome:  Santiago do Sul  -  Estado:  SC, País:  BR  \nId:  4836  -  Nome:  Santo Amaro da Imperatriz  -  Estado:  SC, País:  BR  \nId:  4837  -  Nome:  São Bento do Sul  -  Estado:  SC, País:  BR  \nId:  4838  -  Nome:  São Bernardino  -  Estado:  SC, País:  BR  \nId:  4839  -  Nome:  São Bonifácio  -  Estado:  SC, País:  BR  \nId:  4840  -  Nome:  São Carlos  -  Estado:  SC, País:  BR  \nId:  4841  -  Nome:  São Cristovão do Sul  -  Estado:  SC, País:  BR  \nId:  4842  -  Nome:  São Domingos  -  Estado:  SC, País:  BR  \nId:  4843  -  Nome:  São Francisco do Sul  -  Estado:  SC, País:  BR  \nId:  4844  -  Nome:  São João Batista  -  Estado:  SC, País:  BR  \nId:  4845  -  Nome:  São João do Itaperiú  -  Estado:  SC, País:  BR  \nId:  4846  -  Nome:  São João do Oeste  -  Estado:  SC, País:  BR  \nId:  4847  -  Nome:  São João do Sul  -  Estado:  SC, País:  BR  \nId:  4848  -  Nome:  São Joaquim  -  Estado:  SC, País:  BR  \nId:  4851  -  Nome:  São José  -  Estado:  SC, País:  BR  \nId:  4849  -  Nome:  São José do Cedro  -  Estado:  SC, País:  BR  \nId:  4850  -  Nome:  São José do Cerrito  -  Estado:  SC, País:  BR  \nId:  4852  -  Nome:  São Lourenço d'Oeste  -  Estado:  SC, País:  BR  \nId:  4853  -  Nome:  São Ludgero  -  Estado:  SC, País:  BR  \nId:  4854  -  Nome:  São Martinho  -  Estado:  SC, País:  BR  \nId:  4855  -  Nome:  São Miguel da Boa Vista  -  Estado:  SC, País:  BR  \nId:  4856  -  Nome:  São Miguel do Oeste  -  Estado:  SC, País:  BR  \nId:  4857  -  Nome:  São Pedro de Alcântara  -  Estado:  SC, País:  BR  \nId:  4858  -  Nome:  Saudades  -  Estado:  SC, País:  BR  \nId:  85793  -  Nome:  SBCH  -  Estado:  SC, País:  BR  \nId:  74832  -  Nome:  SBFL  -  Estado:  SC, País:  BR  \nId:  74833  -  Nome:  SBJV  -  Estado:  SC, País:  BR  \nId:  85285  -  Nome:  SBNF  -  Estado:  SC, País:  BR  \nId:  4859  -  Nome:  Schroeder  -  Estado:  SC, País:  BR  \nId:  4860  -  Nome:  Seara  -  Estado:  SC, País:  BR  \nId:  4861  -  Nome:  Serra Alta  -  Estado:  SC, País:  BR  \nId:  4862  -  Nome:  Siderópolis  -  Estado:  SC, País:  BR  \nId:  4863  -  Nome:  Sombrio  -  Estado:  SC, País:  BR  \nId:  4864  -  Nome:  Sul Brasil  -  Estado:  SC, País:  BR  \nId:  4865  -  Nome:  Taió  -  Estado:  SC, País:  BR  \nId:  4866  -  Nome:  Tangará  -  Estado:  SC, País:  BR  \nId:  4867  -  Nome:  Tigrinhos  -  Estado:  SC, País:  BR  \nId:  4868  -  Nome:  Tijucas  -  Estado:  SC, País:  BR  \nId:  4869  -  Nome:  Timbé do Sul  -  Estado:  SC, País:  BR  \nId:  4871  -  Nome:  Timbó  -  Estado:  SC, País:  BR  \nId:  4870  -  Nome:  Timbó Grande  -  Estado:  SC, País:  BR  \nId:  4872  -  Nome:  Três Barras  -  Estado:  SC, País:  BR  \nId:  4875  -  Nome:  Treviso  -  Estado:  SC, País:  BR  \nId:  4878  -  Nome:  Treze de Maio  -  Estado:  SC, País:  BR  \nId:  4879  -  Nome:  Treze Tílias  -  Estado:  SC, País:  BR  \nId:  4880  -  Nome:  Trombudo Central  -  Estado:  SC, País:  BR  \nId:  4881  -  Nome:  Tubarão  -  Estado:  SC, País:  BR  \nId:  4882  -  Nome:  Tunápolis  -  Estado:  SC, País:  BR  \nId:  4883  -  Nome:  Turvo  -  Estado:  SC, País:  BR  \nId:  4884  -  Nome:  União do Oeste  -  Estado:  SC, País:  BR  \nId:  4885  -  Nome:  Urubici  -  Estado:  SC, País:  BR  \nId:  4886  -  Nome:  Urupema  -  Estado:  SC, País:  BR  \nId:  4887  -  Nome:  Urussanga  -  Estado:  SC, País:  BR  \nId:  4482  -  Nome:  Vargeão  -  Estado:  SC, País:  BR  \nId:  4484  -  Nome:  Vargem  -  Estado:  SC, País:  BR  \nId:  4483  -  Nome:  Vargem Bonita  -  Estado:  SC, País:  BR  \nId:  4485  -  Nome:  Vidal Ramos  -  Estado:  SC, País:  BR  \nId:  4486  -  Nome:  Videira  -  Estado:  SC, País:  BR  \nId:  4487  -  Nome:  Vitor Meireles  -  Estado:  SC, País:  BR  \nId:  4488  -  Nome:  Witmarsum  -  Estado:  SC, País:  BR  \nId:  4489  -  Nome:  Xanxerê  -  Estado:  SC, País:  BR  \nId:  4490  -  Nome:  Xavantina  -  Estado:  SC, País:  BR  \nId:  4491  -  Nome:  Xaxim  -  Estado:  SC, País:  BR  \nId:  4492  -  Nome:  Zortéa  -  Estado:  SC, País:  BR  \n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/io.txt",
    "content": "2022-03-13T22:35:58.922853 : Erro ao salvar arquivo de cidades\n2022-03-13T22:35:58.922853 : #0      salvarCidades.<anonymous closure> (package:climatempo/log.dart:44:5)\n#1      salvarCidades.<anonymous closure> (package:climatempo/log.dart:43:19)\n#2      _rootRun (dart:async/zone.dart:1426:13)\n#3      _CustomZone.run (dart:async/zone.dart:1328:19)\n#4      _runZoned (dart:async/zone.dart:1861:10)\n#5      runZonedGuarded (dart:async/zone.dart:1849:12)\n#6      salvarCidades (package:climatempo/log.dart:43:3)\n#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:300:17)\n#8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)\n2022-03-13T22:36:54.582977 : Erro ao salvar o tempo\n2022-03-13T22:36:54.582977 : #0      salvarTempo.<anonymous closure> (package:climatempo/log.dart:23:5)\n#1      salvarTempo.<anonymous closure> (package:climatempo/log.dart:22:19)\n#2      _rootRun (dart:async/zone.dart:1426:13)\n#3      _CustomZone.run (dart:async/zone.dart:1328:19)\n#4      _runZoned (dart:async/zone.dart:1861:10)\n#5      runZonedGuarded (dart:async/zone.dart:1849:12)\n#6      salvarTempo (package:climatempo/log.dart:22:3)\n#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:300:17)\n#8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)\n"
  },
  {
    "path": "code/pt_Br/e_com_voce/15_climatempo_isolate_zone/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/na_pratica/03_strings_palindromo/main.dart",
    "content": "import 'dart:io';\n\nvoid main() {\n  print(\"------ Palíndromo ------\");\n\n  print(\"> Informe sua frase:\");\n  var frase = stdin.readLineSync()?.replaceAll(' ', '').toLowerCase();\n\n  print(frase?.toUpperCase());\n\n  var fraseContrario = frase?.split('').reversed.join();\n  print(\"\\n$frase -> $fraseContrario \\n\");\n\n  if (frase == fraseContrario) {\n    print('É um palíndromo!! o/');\n  } else {\n    print('Não é um palíndromo!!');\n  }\n\n  print(\"------------------------\");\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/README.md",
    "content": "An absolute bare-bones web app.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/lib/src/partida.dart",
    "content": "import 'dart:math';\n\nimport 'package:jogo/src/resultado.dart';\n\nconst pedra = 'Pedra';\nconst papel = 'Papel';\nconst tesoura = 'Tesoura';\nconst lagarto = 'Lagarto';\nconst spock = 'Spock';\n\nconst opcoes = [pedra, papel, tesoura, lagarto, spock];\n\nclass Partida {\n  final regras = <String, Map<String, String>>{};\n\n  void criarRegra(String vencedor,\n      {required String acao, required String perdedor}) {\n    if (!regras.containsKey(vencedor)) {\n      regras[vencedor] = {};\n    }\n    regras[vencedor]![acao] = perdedor;\n  }\n\n  String escolherPc() {\n    final index = Random().nextInt(5);\n    return opcoes[index];\n  }\n\n  Resumo iniciar({required String humano}) {\n    final pc = escolherPc();\n    if (humano == pc) {\n      return Resumo(Resultado.empate, '$humano empata com $pc');\n    }\n\n    if (regras[humano]!.containsValue(pc)) {\n      final entry = regras[humano]!.entries.firstWhere((e) => e.value == pc);\n      return Resumo(\n          Resultado.vitoria, '$humano ${entry.key} ${entry.value}');\n    }\n\n    final entry = regras[pc]!.entries.firstWhere((e) => e.value == humano);\n    return Resumo(Resultado.derrota, '$pc ${entry.key} ${entry.value}');\n  }\n}\n\nPartida configurarPartida() {\n  return Partida()\n    ..criarRegra(tesoura, acao: 'corta', perdedor: papel)\n    ..criarRegra(tesoura, acao: 'decapita', perdedor: lagarto)\n    ..criarRegra(papel, acao: 'cobre', perdedor: pedra)\n    ..criarRegra(papel, acao: 'refuta', perdedor: spock)\n    ..criarRegra(pedra, acao: 'esmaga', perdedor: lagarto)\n    ..criarRegra(pedra, acao: 'quebra', perdedor: tesoura)\n    ..criarRegra(lagarto, acao: 'envenena', perdedor: spock)\n    ..criarRegra(lagarto, acao: 'come', perdedor: papel)\n    ..criarRegra(spock, acao: 'esmaga', perdedor: tesoura)\n    ..criarRegra(spock, acao: 'vaporiza', perdedor: pedra);\n}"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/lib/src/resultado.dart",
    "content": "enum Resultado {\n  empate(classeCss: 'empatou', mensagem: 'Empatou..'),\n  vitoria(classeCss: 'venceu', mensagem: 'Você ganhou :D'),\n  derrota(classeCss: 'perdeu', mensagem: 'Você perdeu :/');\n\n  const Resultado({required this.classeCss, required this.mensagem});\n\n  final String mensagem;\n  final String classeCss;\n}\n\nclass Resumo {\n  Resumo(this.resultado, this.mensagem);\n  final Resultado resultado;\n  final String mensagem;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/pubspec.yaml",
    "content": "name: jogo\ndescription: An absolute bare-bones web app.\nversion: 1.0.0\n# repository: https://github.com/my_org/my_repo\n\nenvironment:\n  sdk: ^3.5.1\n\n# Add regular dependencies here.\ndependencies:\n  web: ^1.1.0\n\ndev_dependencies:\n  build_runner: ^2.4.8\n  build_web_compilers: ^4.0.9\n  lints: ^4.0.0\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/web/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Pedra, Papel, Tesoura, Lagarto e Spock</title>\n    <link rel=\"stylesheet\" href=\"styles.css\">\n    <script defer src=\"main.dart.js\"></script>\n</head>\n<body>\n    <h2>Vamos jogar!</h2>\n    <h4>Escolha um:</h4>\n    <div id=\"opcoes\"></div>\n    <div id=\"resultado\"></div>\n</body>\n</html>"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/web/main.dart",
    "content": "import 'dart:html';\nimport 'package:web/web.dart' as web;\nimport 'package:jogo/src/partida.dart';\nimport 'package:jogo/src/resultado.dart';\n\nlate web.HTMLDivElement divOpcoes;\nlate web.HTMLDivElement divResultado;\n\nbool jogando = true;\nlate Resumo resumo;\n\nvoid main() {\n  inicializarReferencias();\n  final partida = configurarPartida();\n\n  for (final opcao in opcoes) {\n    divOpcoes.append(\n      web.HTMLImageElement()\n        ..className = 'opcao'\n        ..src = 'images/$opcao.png'\n        ..height = 120\n        ..onClick.listen(\n          (web.MouseEvent e) {\n            if (jogando) {\n              resumo = partida.iniciar(humano: opcao);\n              jogando = false;\n              mostrarResultado(resumo);\n            }\n          },\n        ),\n    );\n  }\n}\n\nvoid mostrarResultado(Resumo resumo) {\n  divResultado.append(\n    web.HTMLSpanElement()\n      ..className = resumo.resultado.classeCss\n      ..text = resumo.resultado.mensagem,\n  );\n\n  adicionarEspaco();\n  divResultado.append(web.HTMLSpanElement()..text = resumo.mensagem);\n  adicionarEspaco();\n  divResultado.append(\n    web.HTMLButtonElement()\n      ..text = 'Jogar novamente!'\n      ..onClick.listen(jogarNovamente),\n  );\n}\n\nvoid adicionarEspaco() {\n  divResultado.append(web.HTMLBRElement());\n  divResultado.append(web.HTMLBRElement());\n}\n\nvoid jogarNovamente(web.MouseEvent e) {\n  jogando = true;\n  while(divResultado.firstChild != null) {\n    divResultado.removeChild(divResultado.firstChild!);\n  }\n}\n\nvoid inicializarReferencias() {\n  divOpcoes = web.document.querySelector('#opcoes') as web.HTMLDivElement;\n  divResultado = web.document.querySelector('#resultado') as web.HTMLDivElement;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/web/styles.css",
    "content": "@import url(https://fonts.googleapis.com/css?family=Roboto);\n\nhtml, body {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    padding: 0;\n    font-family: 'Roboto', sans-serif;\n}\n\nh2, h4 {\n    text-align: center;\n}\n\n#opcoes {\n    text-align: center;\n}\n\n.opcao {\n    padding: 10px;\n}\n\n#resultado {\n    text-align: center;\n    margin: 20px;\n}\n\n.venceu {\n    background-color: #FFFFFF;\n    padding: 5px 10px;\n    border: 2px solid #73D973;\n    border-radius: 5px;\n    font-weight: bold;\n    color: #73D973;\n}\n\n.perdeu {\n    background-color: #FFFFFF;\n    padding: 5px 10px;\n    border: 2px solid #FF6F6F;\n    border-radius: 5px;\n    font-weight: bold;\n    color: #FF6F6F;\n}\n\n.empatou {\n    background-color: #FFFFFF;\n    padding: 5px 10px;\n    border: 2px solid #E06FFF;\n    border-radius: 5px;\n    font-weight: bold;\n    color: #E06FFF;\n}\n\nbutton {\n    background-color: #FFFFFF;\n    border: 2px solid #008CBA;\n    border-radius: 5px;\n    padding: 5px 10px;\n    cursor: pointer;\n    color: #008CBA;\n}\n\nbutton:hover {\n    background-color: #008CBA;\n    color: white;\n}\n\n.clicavel:hover {\n    cursor: pointer;\n}"
  },
  {
    "path": "code/pt_Br/na_pratica/06_logger_library/lib/log/log.dart",
    "content": "library logger;\n\nimport 'dart:io';\n\npart 'printer.dart';\n\nenum _Cores {\n  verde('\\x1b[32m'),\n  vermelho('\\x1b[31m'),\n  azul('\\x1b[36m');\n\n  const _Cores(this.ansi);\n\n  final String ansi;\n}\n\nconst _resetarCor = '\\x1b[m';\n\nenum Nivel { info, warning, error }\n\nclass Logger {\n  const Logger({\n    required this.nivel,\n    this.printer = const Printer(),\n  });\n\n  final Printer printer;\n  final Nivel nivel;\n\n  void info(Object object) {\n    if (_habilitado(Nivel.info)) printer._log(_Cores.verde, '[INFO] $object');\n  }\n\n  void warning(Object object) {\n    if (_habilitado(Nivel.warning))\n      printer._log(_Cores.azul, '[WARNING] $object');\n  }\n\n  void error(Object object) {\n    if (_habilitado(Nivel.error))\n      printer._log(_Cores.vermelho, '[ERROR] $object');\n  }\n\n  bool _habilitado(Nivel nivelHabilitado) =>\n      nivelHabilitado.index >= nivel.index;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/06_logger_library/lib/log/printer.dart",
    "content": "part of 'log.dart';\n\nclass Printer {\n  const Printer({this.inicio = '', this.fim = ''});\n\n  final String inicio;\n  final String fim;\n\n  void _log(_Cores cor, Object object) {\n    stdout.writeln(\n      '${cor.ansi}'\n      '$inicio$object$fim'\n      '$_resetarCor',\n    );\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/06_logger_library/lib/main.dart",
    "content": "import 'log/log.dart';\n\nvoid main() {\n  const logger = Logger(\n    nivel: Nivel.warning,\n    printer: Printer(inicio: 'Customizado: {', fim: '}'),\n  );\n  logger.error('Este é um erro');\n  logger.warning('Este é um warning');\n  logger.info('Esta é uma info');\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build outputs.\nbuild/\n\n# Omit committing pubspec.lock for library packages; see\n# https://dart.dev/guides/libraries/private-files#pubspeclock.\npubspec.lock\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/README.md",
    "content": "Um package para facilitar a criação de logs nas aplicações.\n\n## Utilização\n\nA utilização do `logger` é muito simples:\n\n```dart\nimport 'package:logger/logger.dart';\n\nvoid main() {\n  const logger = Logger(\n    nivel: Nivel.warning,\n    printer: Printer(inicio: 'Customizado: {', fim: '}'),\n  );\n  logger.error('Este é um erro');\n  logger.warning('Este é um warning');\n  logger.info('Esta é uma info');\n}\n```\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/__404error.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"logger API docs, for the Dart programming language.\">\n  <title>logger - Dart API docs</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li class=\"self-crumb\">logger package</li>\n  </ol>\n  <div class=\"self-name\">logger</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n  <div id=\"dartdoc-main-content\" class=\"main-content\">\n    <h1>404: Something's gone wrong :-(</h1>\n\n    <section class=\"desc\">\n      <p>You've tried to visit a page that doesn't exist.  Luckily this site\n         has other <a href=\"index.html\">pages</a>.</p>\n      <p>If you were looking for something specific, try searching:\n      <form class=\"search-body\" role=\"search\">\n        <input type=\"text\" id=\"search-body\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n      </form>\n      </p>\n\n    </section>\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li class=\"self-crumb\">logger package</li>\n</ol>\n\n\n    <h5><span class=\"package-name\">logger</span> <span class=\"package-kind\">package</span></h5>\n    <ol>\n      <li class=\"section-title\">Libraries</li>\n      <li><a href=\"logger/logger-library.html\">logger</a></li>\n</ol>\n\n  </div>\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div>\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"static-assets/highlight.pack.js?v1\"></script>\n<script src=\"static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/categories.json",
    "content": "[]\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"logger API docs, for the Dart programming language.\">\n  <title>logger - Dart API docs</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li class=\"self-crumb\">logger package</li>\n  </ol>\n  <div class=\"self-name\">logger</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n  <div id=\"dartdoc-main-content\" class=\"main-content\">\n      \n<section class=\"desc markdown\">\n  <p>Um package para facilitar a criação de logs nas aplicações.</p>\n<h2 id=\"utilizao\">Utilização</h2>\n<p>A utilização do <code>logger</code> é muito simples:</p>\n<pre class=\"language-dart\"><code class=\"language-dart\">import 'package:logger/logger.dart';\n\nvoid main() {\n  const logger = Logger(\n    nivel: Nivel.warning,\n    printer: Printer(inicio: 'Customizado: {', fim: '}'),\n  );\n  logger.error('Este é um erro');\n  logger.warning('Este é um warning');\n  logger.info('Esta é uma info');\n}\n</code></pre>\n</section>\n\n\n      <section class=\"summary\">\n          <h2>Libraries</h2>\n        <dl>\n          <dt id=\"logger\">\n  <span class=\"name\"><a href=\"logger/logger-library.html\">logger</a></span> \n\n</dt>\n<dd>\n</dd>\n\n        </dl>\n      </section>\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li class=\"self-crumb\">logger package</li>\n</ol>\n\n\n    <h5 class=\"hidden-xs\"><span class=\"package-name\">logger</span> <span class=\"package-kind\">package</span></h5>\n    <ol>\n      <li class=\"section-title\">Libraries</li>\n      <li><a href=\"logger/logger-library.html\">logger</a></li>\n</ol>\n\n  </div>\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div>\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"static-assets/highlight.pack.js?v1\"></script>\n<script src=\"static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/index.json",
    "content": "[{\"name\":\"logger\",\"qualifiedName\":\"logger\",\"href\":\"logger/logger-library.html\",\"kind\":9,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"\"},{\"name\":\"Cores\",\"qualifiedName\":\"logger.Cores\",\"href\":\"logger/Cores.html\",\"kind\":5,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Enum com as cores utilizadas para personalizar a fonte de log no terminal.\",\"enclosedBy\":{\"name\":\"logger\",\"kind\":9,\"href\":\"logger/logger-library.html\"}},{\"name\":\"Cores\",\"qualifiedName\":\"logger.Cores.Cores\",\"href\":\"logger/Cores/Cores.html\",\"kind\":2,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"\",\"enclosedBy\":{\"name\":\"Cores\",\"kind\":5,\"href\":\"logger/Cores.html\"}},{\"name\":\"ansi\",\"qualifiedName\":\"logger.Cores.ansi\",\"href\":\"logger/Cores/ansi.html\",\"kind\":16,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"\",\"enclosedBy\":{\"name\":\"Cores\",\"kind\":5,\"href\":\"logger/Cores.html\"}},{\"name\":\"values\",\"qualifiedName\":\"logger.Cores.values\",\"href\":\"logger/Cores/values-constant.html\",\"kind\":1,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"A constant List of the values in this enum, in order of their declaration.\",\"enclosedBy\":{\"name\":\"Cores\",\"kind\":5,\"href\":\"logger/Cores.html\"}},{\"name\":\"Logger\",\"qualifiedName\":\"logger.Logger\",\"href\":\"logger/Logger-class.html\",\"kind\":3,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Controla a impressão de logs, feitas através do printer.\\nImprime logs de acordo com o nivel informado.\",\"enclosedBy\":{\"name\":\"logger\",\"kind\":9,\"href\":\"logger/logger-library.html\"}},{\"name\":\"Logger\",\"qualifiedName\":\"logger.Logger.Logger\",\"href\":\"logger/Logger/Logger.html\",\"kind\":2,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"\",\"enclosedBy\":{\"name\":\"Logger\",\"kind\":3,\"href\":\"logger/Logger-class.html\"}},{\"name\":\"error\",\"qualifiedName\":\"logger.Logger.error\",\"href\":\"logger/Logger/error.html\",\"kind\":10,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Imprime logs de Nivel.error com a cor Cores.vermelho.\",\"enclosedBy\":{\"name\":\"Logger\",\"kind\":3,\"href\":\"logger/Logger-class.html\"}},{\"name\":\"info\",\"qualifiedName\":\"logger.Logger.info\",\"href\":\"logger/Logger/info.html\",\"kind\":10,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Imprime logs de Nivel.info com a cor Cores.verde.\",\"enclosedBy\":{\"name\":\"Logger\",\"kind\":3,\"href\":\"logger/Logger-class.html\"}},{\"name\":\"nivel\",\"qualifiedName\":\"logger.Logger.nivel\",\"href\":\"logger/Logger/nivel.html\",\"kind\":16,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Permite definir o nivel dos logs impressos.\",\"enclosedBy\":{\"name\":\"Logger\",\"kind\":3,\"href\":\"logger/Logger-class.html\"}},{\"name\":\"printer\",\"qualifiedName\":\"logger.Logger.printer\",\"href\":\"logger/Logger/printer.html\",\"kind\":16,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Impressora responsável por imprimir o log de acordo com a plataforma.\",\"enclosedBy\":{\"name\":\"Logger\",\"kind\":3,\"href\":\"logger/Logger-class.html\"}},{\"name\":\"warning\",\"qualifiedName\":\"logger.Logger.warning\",\"href\":\"logger/Logger/warning.html\",\"kind\":10,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Imprime logs de Nivel.warning com a cor Cores.azul.\",\"enclosedBy\":{\"name\":\"Logger\",\"kind\":3,\"href\":\"logger/Logger-class.html\"}},{\"name\":\"Nivel\",\"qualifiedName\":\"logger.Nivel\",\"href\":\"logger/Nivel.html\",\"kind\":5,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Controla o Nivel permitido do log para ser impresso, quanto mais crítico\\nmais restrito é, e menos níveis são impressos.\\nAbaixo as opções ordenadas pelo menos crítico:\",\"enclosedBy\":{\"name\":\"logger\",\"kind\":9,\"href\":\"logger/logger-library.html\"}},{\"name\":\"Nivel\",\"qualifiedName\":\"logger.Nivel.Nivel\",\"href\":\"logger/Nivel/Nivel.html\",\"kind\":2,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"\",\"enclosedBy\":{\"name\":\"Nivel\",\"kind\":5,\"href\":\"logger/Nivel.html\"}},{\"name\":\"values\",\"qualifiedName\":\"logger.Nivel.values\",\"href\":\"logger/Nivel/values-constant.html\",\"kind\":1,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"A constant List of the values in this enum, in order of their declaration.\",\"enclosedBy\":{\"name\":\"Nivel\",\"kind\":5,\"href\":\"logger/Nivel.html\"}},{\"name\":\"Printer\",\"qualifiedName\":\"logger.Printer\",\"href\":\"logger/Printer-class.html\",\"kind\":3,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Uma impressora de logs utilizada por Logger que funciona em todas\\nas plataformas.\",\"enclosedBy\":{\"name\":\"logger\",\"kind\":9,\"href\":\"logger/logger-library.html\"}},{\"name\":\"Printer\",\"qualifiedName\":\"logger.Printer.Printer\",\"href\":\"logger/Printer/Printer.html\",\"kind\":2,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"\",\"enclosedBy\":{\"name\":\"Printer\",\"kind\":3,\"href\":\"logger/Printer-class.html\"}},{\"name\":\"fim\",\"qualifiedName\":\"logger.Printer.fim\",\"href\":\"logger/Printer/fim.html\",\"kind\":16,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Utilizado para personalizar o término de cada linha impressa no log.\\nPor padrão não contém um valor.\",\"enclosedBy\":{\"name\":\"Printer\",\"kind\":3,\"href\":\"logger/Printer-class.html\"}},{\"name\":\"inicio\",\"qualifiedName\":\"logger.Printer.inicio\",\"href\":\"logger/Printer/inicio.html\",\"kind\":16,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Utilizado para personalizar o início de cada linha impressa no log.\\nPor padrão não contém um valor.\",\"enclosedBy\":{\"name\":\"Printer\",\"kind\":3,\"href\":\"logger/Printer-class.html\"}},{\"name\":\"log\",\"qualifiedName\":\"logger.Printer.log\",\"href\":\"logger/Printer/log.html\",\"kind\":10,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Imprime o object de log de acordo com a plataforma utilizada.\\nÉ possível personalizar a cor do texto impresso.\",\"enclosedBy\":{\"name\":\"Printer\",\"kind\":3,\"href\":\"logger/Printer-class.html\"}},{\"name\":\"resetarCor\",\"qualifiedName\":\"logger.resetarCor\",\"href\":\"logger/resetarCor-constant.html\",\"kind\":19,\"overriddenDepth\":0,\"packageRank\":0,\"desc\":\"Código ANSI utilizado para resetar a cor da fonte no terminal.\",\"enclosedBy\":{\"name\":\"logger\",\"kind\":9,\"href\":\"logger/logger-library.html\"}}]\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/Cores.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Cores constructor from Enum Cores from the logger library, for the Dart programming language.\">\n  <title>Cores constructor - Cores - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n    <li class=\"self-crumb\">Cores const constructor</li>\n  </ol>\n  <div class=\"self-name\">Cores</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n  <div\n      id=\"dartdoc-main-content\"\n      class=\"main-content\"\n      data-above-sidebar=\"logger&#47;Cores-enum-sidebar.html\"\n      data-below-sidebar=\"\">\n      <div>\n<h1><span class=\"kind-constructor\">Cores</span> constructor \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      const\n      <span class=\"name \">Cores</span>(<wbr><ol class=\"parameter-list single-line\"> <li><span class=\"parameter\" id=\"-param-ansi\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span> <span class=\"parameter-name\">ansi</span></span></li>\n</ol>)\n    </section>\n\n    \n\n\n    \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">const Cores(this.ansi);</code></pre>\n</section>\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n    <li class=\"self-crumb\">Cores const constructor</li>\n</ol>\n\n\n    <h5>Cores enum</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-left-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/ansi.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the ansi property from the Cores enum, for the Dart programming language.\">\n  <title>ansi property - Cores enum - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n    <li class=\"self-crumb\">ansi property</li>\n  </ol>\n  <div class=\"self-name\">ansi</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Cores-enum-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-property\">ansi</span> property \n</h1></div>\n\n      <section class=\"multi-line-signature\">\n        \n        <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a>\n        <span class=\"name \">ansi</span>\n        <div class=\"features\"><span class=\"feature\">final</span></div>\n\n      </section>\n      \n\n      \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">final String ansi;</code></pre>\n</section>\n\n\n</div> <!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n    <li class=\"self-crumb\">ansi property</li>\n</ol>\n\n\n  <h5>Cores enum</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div><!--/.sidebar-offcanvas-->\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/toString.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the toString method from the Cores extension, for the Dart programming language.\">\n  <title>toString method - Cores extension - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\"\n      data-using-base-href=\"false\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <button id=\"sidenav-left-toggle\" type=\"button\">&nbsp;</button>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n    <li class=\"self-crumb\">toString method</li>\n  </ol>\n  <div class=\"self-name\">toString</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<main>\n\n\n  <div id=\"dartdoc-main-content\" class=\"main-content\">\n      <div>\n<h1><span class=\"kind-method\">toString</span> method \n    <a href=\"https://dart.dev/null-safety\" class=\"feature feature-null-safety\" title=\"Supports the null safety language feature.\">Null safety</a>\n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      \n\n<span class=\"returntype\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/String-class.html\">String</a></span>\n<span class=\"name \">toString</span>(<wbr>)\n\n      \n\n    </section>\n    \n\n\n    \n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n  <li><a href=\"../../index.html\">logger</a></li>\n  <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n  <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n  <li class=\"self-crumb\">toString method</li>\n</ol>\n\n\n    <h5>Cores enum</h5>\n    <ol>\n\n\n    <li class=\"section-title\"><a href=\"../../logger/Cores.html#constants\">Constants</a></li>\n    <li>azul</li>\n    <li>values</li>\n    <li>verde</li>\n    <li>vermelho</li>\n\n    <li class=\"section-title\">\n      <a href=\"../../logger/Cores.html#instance-properties\">Properties</a>\n    </li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/hashCode.html\">hashCode</a></li>\n    <li>index</li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/runtimeType.html\">runtimeType</a></li>\n\n    <li class=\"section-title\"><a href=\"../../logger/Cores.html#instance-methods\">Methods</a></li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></li>\n    <li><a href=\"../../logger/Cores/toString.html\">toString</a></li>\n\n    <li class=\"section-title inherited\"><a href=\"../../logger/Cores.html#operators\">Operators</a></li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/operator_equals.html\">operator ==</a></li>\n\n\n</ol>\n\n  </div><!--/.sidebar-offcanvas-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/script.js?v1\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/values-constant.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the values constant from the Cores enum, for the Dart programming language.\">\n  <title>values constant - Cores enum - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n    <li class=\"self-crumb\">values constant</li>\n  </ol>\n  <div class=\"self-name\">values</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Cores-enum-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-property\">values</span> constant \n</h1></div>\n\n      <section class=\"multi-line-signature\">\n        \n        <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/List-class.html\">List</a><span class=\"signature\">&lt;<wbr><span class=\"type-parameter\"><a href=\"../../logger/Cores.html\">Cores</a></span>&gt;</span>\n        const <span class=\"name \">values</span>\n        \n\n      </section>\n      \n<section class=\"desc markdown\">\n  <p>A constant List of the values in this enum, in order of their declaration.</p>\n</section>\n\n      \n\n\n</div> <!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Cores.html\">Cores</a></li>\n    <li class=\"self-crumb\">values constant</li>\n</ol>\n\n\n  <h5>Cores enum</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div><!--/.sidebar-offcanvas-->\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores-enum-sidebar.html",
    "content": "<ol>\n\n        <li class=\"section-title\"><a href=\"logger/Cores.html#constructors\">Constructors</a></li>\n          <li><a href=\"logger/Cores/Cores.html\">Cores</a></li>\n\n        <li class=\"section-title\"><a href=\"logger/Cores.html#values\">Values</a></li>\n          <li><a href=\"logger/Cores.html#verde\">verde</a></li>\n          <li><a href=\"logger/Cores.html#vermelho\">vermelho</a></li>\n          <li><a href=\"logger/Cores.html#azul\">azul</a></li>\n\n    \n        <li class=\"section-title\">\n          <a href=\"logger/Cores.html#instance-properties\">Properties</a>\n        </li>\n          <li><a href=\"logger/Cores/ansi.html\">ansi</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Enum/index.html\">index</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></li>\n\n        <li class=\"section-title inherited\"><a href=\"logger/Cores.html#instance-methods\">Methods</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></li>\n\n        <li class=\"section-title inherited\"><a href=\"logger/Cores.html#operators\">Operators</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></li>\n\n    \n\n    \n\n\n        <li class=\"section-title\"><a href=\"logger/Cores.html#constants\">Constants</a></li>\n          <li><a href=\"logger/Cores/values-constant.html\">values</a></li>\n</ol>\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Cores enum from the logger library, for the Dart programming language.\">\n  <title>Cores enum - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger.dart</a></li>\n    <li class=\"self-crumb\">Cores enum</li>\n  </ol>\n  <div class=\"self-name\">Cores</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;logger-library-sidebar.html\"\n    data-below-sidebar=\"logger&#47;Cores-enum-sidebar.html\">\n    <div>\n\n      <h1>\n        <span class=\"kind-enum\">Cores</span>\n        enum \n \n\n      </h1>\n    </div>\n\n    \n<section class=\"desc markdown\">\n  <p>Enum com as cores utilizadas para personalizar a fonte de log no terminal.</p>\n</section>\n\n\n      <section>\n        <dl class=\"dl-horizontal\">\n          \n  <dt>Inheritance</dt>\n  <dd>\n    <ul class=\"gt-separated dark eNum-relationships\">\n      <li><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></li>\n        <li><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Enum-class.html\">Enum</a></li>\n      <li>Cores</li>\n    </ul>\n  </dd>\n\n          \n          \n          \n\n\n        </dl>\n      </section>\n\n    \n  <section class=\"summary offset-anchor\" id=\"constructors\">\n    <h2>Constructors</h2>\n\n    <dl class=\"constructor-summary-list\">\n        <dt id=\"Cores\" class=\"callable\">\n          <span class=\"name\"><a href=\"../logger/Cores/Cores.html\">Cores</a></span><span class=\"signature\">(<span class=\"parameter\" id=\"-param-ansi\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span> <span class=\"parameter-name\">ansi</span></span>)</span>\n        </dt>\n        <dd>\n          \n            <div class=\"constructor-modifier features\">const</div>\n        </dd>\n    </dl>\n  </section>\n\n      <section class=\"summary offset-anchor\" id=\"values\">\n        <h2>Values</h2>\n\n        <dl class=\"properties\">\n            <dt id=\"verde\" class=\"constant\">\n    <span class=\"name \">verde</span>\n  <span class=\"signature\">&#8594; const <a href=\"../logger/Cores.html\">Cores</a></span>\n  \n\n</dt>\n<dd>\n  \n  \n\n    <div>\n      <span class=\"signature\"><code>const Cores(&#39;\\x1b[32m&#39;)</code></span>\n    </div>\n</dd>\n\n            <dt id=\"vermelho\" class=\"constant\">\n    <span class=\"name \">vermelho</span>\n  <span class=\"signature\">&#8594; const <a href=\"../logger/Cores.html\">Cores</a></span>\n  \n\n</dt>\n<dd>\n  \n  \n\n    <div>\n      <span class=\"signature\"><code>const Cores(&#39;\\x1b[31m&#39;)</code></span>\n    </div>\n</dd>\n\n            <dt id=\"azul\" class=\"constant\">\n    <span class=\"name \">azul</span>\n  <span class=\"signature\">&#8594; const <a href=\"../logger/Cores.html\">Cores</a></span>\n  \n\n</dt>\n<dd>\n  \n  \n\n    <div>\n      <span class=\"signature\"><code>const Cores(&#39;\\x1b[36m&#39;)</code></span>\n    </div>\n</dd>\n\n        </dl>\n      </section>\n\n    \n  <section\n      class=\"summary offset-anchor\"\n      id=\"instance-properties\">\n    <h2>Properties</h2>\n    <dl class=\"properties\">\n        <dt id=\"ansi\" class=\"property\">\n  <span class=\"name\"><a href=\"../logger/Cores/ansi.html\">ansi</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  \n\n</dt>\n<dd>\n  \n  <div class=\"features\"><span class=\"feature\">final</span></div>\n\n</dd>\n\n        <dt id=\"hashCode\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/int-class.html\">int</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The hash code for this object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"index\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Enum/index.html\">index</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/int-class.html\">int</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A numeric identifier for the enumerated value.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"runtimeType\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Type-class.html\">Type</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A representation of the runtime type of the object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor inherited\"\n      id=\"instance-methods\">\n    <h2>Methods</h2>\n    <dl class=\"callables\">\n        <dt id=\"noSuchMethod\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"noSuchMethod-param-invocation\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Invocation-class.html\">Invocation</a></span> <span class=\"parameter-name\">invocation</span></span>)\n    <span class=\"returntype parameter\">&#8594; dynamic</span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  Invoked when a nonexistent method or property is accessed.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"toString\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></span><span class=\"signature\">(<wbr>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A string representation of this object.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor inherited\"\n      id=\"operators\">\n    <h2>Operators</h2>\n    <dl class=\"callables\">\n        <dt id=\"operator ==\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"==-param-other\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">other</span></span>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/bool-class.html\">bool</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The equality operator.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n    \n    \n\n  <section class=\"summary offset-anchor\" id=\"constants\">\n    <h2>Constants</h2>\n\n    <dl class=\"properties\">\n        <dt id=\"values\" class=\"constant\">\n    <span class=\"name \"><a href=\"../logger/Cores/values-constant.html\">values</a></span>\n  <span class=\"signature\">&#8594; const <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/List-class.html\">List</a><span class=\"signature\">&lt;<wbr><span class=\"type-parameter\"><a href=\"../logger/Cores.html\">Cores</a></span>&gt;</span></span>\n  \n\n</dt>\n<dd>\n  A constant List of the values in this enum, in order of their declaration.\n  \n\n</dd>\n\n    </dl>\n  </section>\n</div><!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger</a></li>\n    <li class=\"self-crumb\">Cores enum</li>\n</ol>\n\n\n  <h5>logger library</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div>\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!-- /.sidebar-offcanvas -->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/Logger.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Logger constructor from Class Logger from the logger library, for the Dart programming language.\">\n  <title>Logger constructor - Logger - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">Logger const constructor</li>\n  </ol>\n  <div class=\"self-name\">Logger</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n  <div\n      id=\"dartdoc-main-content\"\n      class=\"main-content\"\n      data-above-sidebar=\"logger&#47;Logger-class-sidebar.html\"\n      data-below-sidebar=\"\">\n      <div>\n<h1><span class=\"kind-constructor\">Logger</span> constructor \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      const\n      <span class=\"name \">Logger</span>(<wbr>{<ol class=\"parameter-list\"> <li><span class=\"parameter\" id=\"-param-printer\"><span class=\"type-annotation\"><a href=\"../../logger/Printer-class.html\">Printer</a></span> <span class=\"parameter-name\">printer</span> = <span class=\"default-value\">const Printer()</span>, </span></li>\n<li><span class=\"parameter\" id=\"-param-nivel\"><span>required</span> <span class=\"type-annotation\"><a href=\"../../logger/Nivel.html\">Nivel</a></span> <span class=\"parameter-name\">nivel</span>, </span></li>\n</ol>})\n    </section>\n\n    \n\n\n    \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">const Logger({\n  this.printer = const Printer(),\n  required this.nivel,\n});</code></pre>\n</section>\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">Logger const constructor</li>\n</ol>\n\n\n    <h5>Logger class</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-left-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/error.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the error method from the Logger class, for the Dart programming language.\">\n  <title>error method - Logger class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">error method</li>\n  </ol>\n  <div class=\"self-name\">error</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Logger-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-method\">error</span> method \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      \n\n<span class=\"returntype\">void</span>\n<span class=\"name \">error</span>(<wbr><ol class=\"parameter-list single-line\"> <li><span class=\"parameter\" id=\"error-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span></li>\n</ol>)\n\n      \n\n    </section>\n    \n<section class=\"desc markdown\">\n  <p>Imprime logs de <a href=\"../../logger/Nivel.html\">Nivel.error</a> com a cor <a href=\"../../logger/Cores.html\">Cores.vermelho</a>.</p>\n</section>\n\n\n    \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">void error(Object object) {\n  if (_habilitado(Nivel.error)) {\n    printer.log(Cores.vermelho, &#39;[ERROR] $object&#39;);\n  }\n}</code></pre>\n</section>\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">error method</li>\n</ol>\n\n\n    <h5>Logger class</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/info.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the info method from the Logger class, for the Dart programming language.\">\n  <title>info method - Logger class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">info method</li>\n  </ol>\n  <div class=\"self-name\">info</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Logger-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-method\">info</span> method \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      \n\n<span class=\"returntype\">void</span>\n<span class=\"name \">info</span>(<wbr><ol class=\"parameter-list single-line\"> <li><span class=\"parameter\" id=\"info-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span></li>\n</ol>)\n\n      \n\n    </section>\n    \n<section class=\"desc markdown\">\n  <p>Imprime logs de <a href=\"../../logger/Nivel.html\">Nivel.info</a> com a cor <a href=\"../../logger/Cores.html\">Cores.verde</a>.</p>\n</section>\n\n\n    \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">void info(Object object) {\n  if (_habilitado(Nivel.info)) printer.log(Cores.verde, &#39;[INFO] $object&#39;);\n}</code></pre>\n</section>\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">info method</li>\n</ol>\n\n\n    <h5>Logger class</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/nivel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the nivel property from the Logger class, for the Dart programming language.\">\n  <title>nivel property - Logger class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">nivel property</li>\n  </ol>\n  <div class=\"self-name\">nivel</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Logger-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-property\">nivel</span> property \n</h1></div>\n\n      <section class=\"multi-line-signature\">\n        \n        <a href=\"../../logger/Nivel.html\">Nivel</a>\n        <span class=\"name \">nivel</span>\n        <div class=\"features\"><span class=\"feature\">final</span></div>\n\n      </section>\n      \n<section class=\"desc markdown\">\n  <p>Permite definir o <a href=\"../../logger/Logger/nivel.html\">nivel</a> dos logs impressos.</p>\n</section>\n\n      \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">final Nivel nivel;</code></pre>\n</section>\n\n\n</div> <!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">nivel property</li>\n</ol>\n\n\n  <h5>Logger class</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div><!--/.sidebar-offcanvas-->\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/printer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the printer property from the Logger class, for the Dart programming language.\">\n  <title>printer property - Logger class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">printer property</li>\n  </ol>\n  <div class=\"self-name\">printer</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Logger-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-property\">printer</span> property \n</h1></div>\n\n      <section class=\"multi-line-signature\">\n        \n        <a href=\"../../logger/Printer-class.html\">Printer</a>\n        <span class=\"name \">printer</span>\n        <div class=\"features\"><span class=\"feature\">final</span></div>\n\n      </section>\n      \n<section class=\"desc markdown\">\n  <p>Impressora responsável por imprimir o log de acordo com a plataforma.</p>\n</section>\n\n      \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">final Printer printer;</code></pre>\n</section>\n\n\n</div> <!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">printer property</li>\n</ol>\n\n\n  <h5>Logger class</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div><!--/.sidebar-offcanvas-->\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/warning.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the warning method from the Logger class, for the Dart programming language.\">\n  <title>warning method - Logger class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">warning method</li>\n  </ol>\n  <div class=\"self-name\">warning</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Logger-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-method\">warning</span> method \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      \n\n<span class=\"returntype\">void</span>\n<span class=\"name \">warning</span>(<wbr><ol class=\"parameter-list single-line\"> <li><span class=\"parameter\" id=\"warning-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span></li>\n</ol>)\n\n      \n\n    </section>\n    \n<section class=\"desc markdown\">\n  <p>Imprime logs de <a href=\"../../logger/Nivel.html\">Nivel.warning</a> com a cor <a href=\"../../logger/Cores.html\">Cores.azul</a>.</p>\n</section>\n\n\n    \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">void warning(Object object) {\n  if (_habilitado(Nivel.warning)) {\n    printer.log(Cores.azul, &#39;[WARNING] $object&#39;);\n  }\n}</code></pre>\n</section>\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Logger-class.html\">Logger</a></li>\n    <li class=\"self-crumb\">warning method</li>\n</ol>\n\n\n    <h5>Logger class</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger-class-sidebar.html",
    "content": "<ol>\n\n        <li class=\"section-title\"><a href=\"logger/Logger-class.html#constructors\">Constructors</a></li>\n          <li><a href=\"logger/Logger/Logger.html\">Logger</a></li>\n\n\n    \n        <li class=\"section-title\">\n          <a href=\"logger/Logger-class.html#instance-properties\">Properties</a>\n        </li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></li>\n          <li><a href=\"logger/Logger/nivel.html\">nivel</a></li>\n          <li><a href=\"logger/Logger/printer.html\">printer</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></li>\n\n        <li class=\"section-title\"><a href=\"logger/Logger-class.html#instance-methods\">Methods</a></li>\n          <li><a href=\"logger/Logger/error.html\">error</a></li>\n          <li><a href=\"logger/Logger/info.html\">info</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></li>\n          <li><a href=\"logger/Logger/warning.html\">warning</a></li>\n\n        <li class=\"section-title inherited\"><a href=\"logger/Logger-class.html#operators\">Operators</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></li>\n\n    \n\n    \n\n\n</ol>\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger-class.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Logger class from the logger library, for the Dart programming language.\">\n  <title>Logger class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger.dart</a></li>\n    <li class=\"self-crumb\">Logger class</li>\n  </ol>\n  <div class=\"self-name\">Logger</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;logger-library-sidebar.html\"\n    data-below-sidebar=\"logger&#47;Logger-class-sidebar.html\">\n    <div>\n<h1><span class=\"kind-class\">Logger</span> class \n \n</h1></div>\n\n    \n<section class=\"desc markdown\">\n  <p>Controla a impressão de logs, feitas através do <a href=\"../logger/Logger/printer.html\">printer</a>.\nImprime logs de acordo com o <a href=\"../logger/Logger/nivel.html\">nivel</a> informado.</p>\n</section>\n\n\n\n    \n  <section class=\"summary offset-anchor\" id=\"constructors\">\n    <h2>Constructors</h2>\n\n    <dl class=\"constructor-summary-list\">\n        <dt id=\"Logger\" class=\"callable\">\n          <span class=\"name\"><a href=\"../logger/Logger/Logger.html\">Logger</a></span><span class=\"signature\">({<span class=\"parameter\" id=\"-param-printer\"><span class=\"type-annotation\"><a href=\"../logger/Printer-class.html\">Printer</a></span> <span class=\"parameter-name\">printer</span> = <span class=\"default-value\">const Printer()</span>, </span><span class=\"parameter\" id=\"-param-nivel\"><span>required</span> <span class=\"type-annotation\"><a href=\"../logger/Nivel.html\">Nivel</a></span> <span class=\"parameter-name\">nivel</span></span>})</span>\n        </dt>\n        <dd>\n          \n            <div class=\"constructor-modifier features\">const</div>\n        </dd>\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor\"\n      id=\"instance-properties\">\n    <h2>Properties</h2>\n    <dl class=\"properties\">\n        <dt id=\"hashCode\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/int-class.html\">int</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The hash code for this object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"nivel\" class=\"property\">\n  <span class=\"name\"><a href=\"../logger/Logger/nivel.html\">nivel</a></span>\n  <span class=\"signature\">&#8594; <a href=\"../logger/Nivel.html\">Nivel</a></span>\n  \n\n</dt>\n<dd>\n  Permite definir o <a href=\"../logger/Logger/nivel.html\">nivel</a> dos logs impressos.\n  <div class=\"features\"><span class=\"feature\">final</span></div>\n\n</dd>\n\n        <dt id=\"printer\" class=\"property\">\n  <span class=\"name\"><a href=\"../logger/Logger/printer.html\">printer</a></span>\n  <span class=\"signature\">&#8594; <a href=\"../logger/Printer-class.html\">Printer</a></span>\n  \n\n</dt>\n<dd>\n  Impressora responsável por imprimir o log de acordo com a plataforma.\n  <div class=\"features\"><span class=\"feature\">final</span></div>\n\n</dd>\n\n        <dt id=\"runtimeType\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Type-class.html\">Type</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A representation of the runtime type of the object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor\"\n      id=\"instance-methods\">\n    <h2>Methods</h2>\n    <dl class=\"callables\">\n        <dt id=\"error\" class=\"callable\">\n  <span class=\"name\"><a href=\"../logger/Logger/error.html\">error</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"error-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span>)\n    <span class=\"returntype parameter\">&#8594; void</span>\n  </span>\n  \n\n</dt>\n<dd>\n  Imprime logs de <a href=\"../logger/Nivel.html\">Nivel.error</a> com a cor <a href=\"../logger/Cores.html\">Cores.vermelho</a>.\n  \n\n</dd>\n\n        <dt id=\"info\" class=\"callable\">\n  <span class=\"name\"><a href=\"../logger/Logger/info.html\">info</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"info-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span>)\n    <span class=\"returntype parameter\">&#8594; void</span>\n  </span>\n  \n\n</dt>\n<dd>\n  Imprime logs de <a href=\"../logger/Nivel.html\">Nivel.info</a> com a cor <a href=\"../logger/Cores.html\">Cores.verde</a>.\n  \n\n</dd>\n\n        <dt id=\"noSuchMethod\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"noSuchMethod-param-invocation\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Invocation-class.html\">Invocation</a></span> <span class=\"parameter-name\">invocation</span></span>)\n    <span class=\"returntype parameter\">&#8594; dynamic</span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  Invoked when a nonexistent method or property is accessed.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"toString\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></span><span class=\"signature\">(<wbr>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A string representation of this object.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"warning\" class=\"callable\">\n  <span class=\"name\"><a href=\"../logger/Logger/warning.html\">warning</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"warning-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span>)\n    <span class=\"returntype parameter\">&#8594; void</span>\n  </span>\n  \n\n</dt>\n<dd>\n  Imprime logs de <a href=\"../logger/Nivel.html\">Nivel.warning</a> com a cor <a href=\"../logger/Cores.html\">Cores.azul</a>.\n  \n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor inherited\"\n      id=\"operators\">\n    <h2>Operators</h2>\n    <dl class=\"callables\">\n        <dt id=\"operator ==\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"==-param-other\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">other</span></span>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/bool-class.html\">bool</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The equality operator.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n    \n    \n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger</a></li>\n    <li class=\"self-crumb\">Logger class</li>\n</ol>\n\n\n    <h5>logger library</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div>\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel/Nivel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Nivel constructor from Enum Nivel from the logger library, for the Dart programming language.\">\n  <title>Nivel constructor - Nivel - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Nivel.html\">Nivel</a></li>\n    <li class=\"self-crumb\">Nivel const constructor</li>\n  </ol>\n  <div class=\"self-name\">Nivel</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n  <div\n      id=\"dartdoc-main-content\"\n      class=\"main-content\"\n      data-above-sidebar=\"logger&#47;Nivel-enum-sidebar.html\"\n      data-below-sidebar=\"\">\n      <div>\n<h1><span class=\"kind-constructor\">Nivel</span> constructor \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      const\n      <span class=\"name \">Nivel</span>(<wbr>)\n    </section>\n\n    \n\n\n    \n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Nivel.html\">Nivel</a></li>\n    <li class=\"self-crumb\">Nivel const constructor</li>\n</ol>\n\n\n    <h5>Nivel enum</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-left-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel/toString.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the toString method from the Nivel extension, for the Dart programming language.\">\n  <title>toString method - Nivel extension - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\"\n      data-using-base-href=\"false\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <button id=\"sidenav-left-toggle\" type=\"button\">&nbsp;</button>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Nivel.html\">Nivel</a></li>\n    <li class=\"self-crumb\">toString method</li>\n  </ol>\n  <div class=\"self-name\">toString</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<main>\n\n\n  <div id=\"dartdoc-main-content\" class=\"main-content\">\n      <div>\n<h1><span class=\"kind-method\">toString</span> method \n    <a href=\"https://dart.dev/null-safety\" class=\"feature feature-null-safety\" title=\"Supports the null safety language feature.\">Null safety</a>\n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      \n\n<span class=\"returntype\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/String-class.html\">String</a></span>\n<span class=\"name \">toString</span>(<wbr>)\n\n      \n\n    </section>\n    \n\n\n    \n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n  <li><a href=\"../../index.html\">logger</a></li>\n  <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n  <li><a href=\"../../logger/Nivel.html\">Nivel</a></li>\n  <li class=\"self-crumb\">toString method</li>\n</ol>\n\n\n    <h5>Nivel enum</h5>\n    <ol>\n\n\n    <li class=\"section-title\"><a href=\"../../logger/Nivel.html#constants\">Constants</a></li>\n    <li>error</li>\n    <li>info</li>\n    <li>values</li>\n    <li>warning</li>\n\n    <li class=\"section-title\">\n      <a href=\"../../logger/Nivel.html#instance-properties\">Properties</a>\n    </li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/hashCode.html\">hashCode</a></li>\n    <li>index</li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/runtimeType.html\">runtimeType</a></li>\n\n    <li class=\"section-title\"><a href=\"../../logger/Nivel.html#instance-methods\">Methods</a></li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></li>\n    <li><a href=\"../../logger/Nivel/toString.html\">toString</a></li>\n\n    <li class=\"section-title inherited\"><a href=\"../../logger/Nivel.html#operators\">Operators</a></li>\n    <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Object/operator_equals.html\">operator ==</a></li>\n\n\n</ol>\n\n  </div><!--/.sidebar-offcanvas-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/script.js?v1\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel/values-constant.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the values constant from the Nivel enum, for the Dart programming language.\">\n  <title>values constant - Nivel enum - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Nivel.html\">Nivel</a></li>\n    <li class=\"self-crumb\">values constant</li>\n  </ol>\n  <div class=\"self-name\">values</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Nivel-enum-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-property\">values</span> constant \n</h1></div>\n\n      <section class=\"multi-line-signature\">\n        \n        <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/List-class.html\">List</a><span class=\"signature\">&lt;<wbr><span class=\"type-parameter\"><a href=\"../../logger/Nivel.html\">Nivel</a></span>&gt;</span>\n        const <span class=\"name \">values</span>\n        \n\n      </section>\n      \n<section class=\"desc markdown\">\n  <p>A constant List of the values in this enum, in order of their declaration.</p>\n</section>\n\n      \n\n\n</div> <!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Nivel.html\">Nivel</a></li>\n    <li class=\"self-crumb\">values constant</li>\n</ol>\n\n\n  <h5>Nivel enum</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div><!--/.sidebar-offcanvas-->\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel-enum-sidebar.html",
    "content": "<ol>\n\n        <li class=\"section-title\"><a href=\"logger/Nivel.html#constructors\">Constructors</a></li>\n          <li><a href=\"logger/Nivel/Nivel.html\">Nivel</a></li>\n\n        <li class=\"section-title\"><a href=\"logger/Nivel.html#values\">Values</a></li>\n          <li><a href=\"logger/Nivel.html#info\">info</a></li>\n          <li><a href=\"logger/Nivel.html#warning\">warning</a></li>\n          <li><a href=\"logger/Nivel.html#error\">error</a></li>\n\n    \n        <li class=\"section-title inherited\">\n          <a href=\"logger/Nivel.html#instance-properties\">Properties</a>\n        </li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Enum/index.html\">index</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></li>\n\n        <li class=\"section-title inherited\"><a href=\"logger/Nivel.html#instance-methods\">Methods</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></li>\n\n        <li class=\"section-title inherited\"><a href=\"logger/Nivel.html#operators\">Operators</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></li>\n\n    \n\n    \n\n\n        <li class=\"section-title\"><a href=\"logger/Nivel.html#constants\">Constants</a></li>\n          <li><a href=\"logger/Nivel/values-constant.html\">values</a></li>\n</ol>\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Nivel enum from the logger library, for the Dart programming language.\">\n  <title>Nivel enum - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger.dart</a></li>\n    <li class=\"self-crumb\">Nivel enum</li>\n  </ol>\n  <div class=\"self-name\">Nivel</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;logger-library-sidebar.html\"\n    data-below-sidebar=\"logger&#47;Nivel-enum-sidebar.html\">\n    <div>\n\n      <h1>\n        <span class=\"kind-enum\">Nivel</span>\n        enum \n \n\n      </h1>\n    </div>\n\n    \n<section class=\"desc markdown\">\n  <p>Controla o <a href=\"../logger/Nivel.html\">Nivel</a> permitido do log para ser impresso, quanto mais crítico\nmais restrito é, e menos níveis são impressos.\nAbaixo as opções ordenadas pelo menos crítico:</p>\n<ul>\n<li><a href=\"../logger/Nivel.html\">Nivel.info</a> signica que serão impressos todos os níveis.</li>\n<li><a href=\"../logger/Nivel.html\">Nivel.warning</a> são impressos os logs de <a href=\"../logger/Nivel.html\">Nivel.warning</a> e <a href=\"../logger/Nivel.html\">Nivel.error</a></li>\n<li><a href=\"../logger/Nivel.html\">Nivel.error</a> é o nível mais restrito, e apenas <a href=\"../logger/Nivel.html\">Nivel.error</a> são impressos.</li>\n</ul>\n</section>\n\n\n      <section>\n        <dl class=\"dl-horizontal\">\n          \n  <dt>Inheritance</dt>\n  <dd>\n    <ul class=\"gt-separated dark eNum-relationships\">\n      <li><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></li>\n        <li><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Enum-class.html\">Enum</a></li>\n      <li>Nivel</li>\n    </ul>\n  </dd>\n\n          \n          \n          \n\n\n        </dl>\n      </section>\n\n    \n  <section class=\"summary offset-anchor\" id=\"constructors\">\n    <h2>Constructors</h2>\n\n    <dl class=\"constructor-summary-list\">\n        <dt id=\"Nivel\" class=\"callable\">\n          <span class=\"name\"><a href=\"../logger/Nivel/Nivel.html\">Nivel</a></span><span class=\"signature\">()</span>\n        </dt>\n        <dd>\n          \n            <div class=\"constructor-modifier features\">const</div>\n        </dd>\n    </dl>\n  </section>\n\n      <section class=\"summary offset-anchor\" id=\"values\">\n        <h2>Values</h2>\n\n        <dl class=\"properties\">\n            <dt id=\"info\" class=\"constant\">\n    <span class=\"name \">info</span>\n  <span class=\"signature\">&#8594; const <a href=\"../logger/Nivel.html\">Nivel</a></span>\n  \n\n</dt>\n<dd>\n  \n  \n\n</dd>\n\n            <dt id=\"warning\" class=\"constant\">\n    <span class=\"name \">warning</span>\n  <span class=\"signature\">&#8594; const <a href=\"../logger/Nivel.html\">Nivel</a></span>\n  \n\n</dt>\n<dd>\n  \n  \n\n</dd>\n\n            <dt id=\"error\" class=\"constant\">\n    <span class=\"name \">error</span>\n  <span class=\"signature\">&#8594; const <a href=\"../logger/Nivel.html\">Nivel</a></span>\n  \n\n</dt>\n<dd>\n  \n  \n\n</dd>\n\n        </dl>\n      </section>\n\n    \n  <section\n      class=\"summary offset-anchor inherited\"\n      id=\"instance-properties\">\n    <h2>Properties</h2>\n    <dl class=\"properties\">\n        <dt id=\"hashCode\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/int-class.html\">int</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The hash code for this object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"index\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Enum/index.html\">index</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/int-class.html\">int</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A numeric identifier for the enumerated value.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"runtimeType\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Type-class.html\">Type</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A representation of the runtime type of the object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor inherited\"\n      id=\"instance-methods\">\n    <h2>Methods</h2>\n    <dl class=\"callables\">\n        <dt id=\"noSuchMethod\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"noSuchMethod-param-invocation\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Invocation-class.html\">Invocation</a></span> <span class=\"parameter-name\">invocation</span></span>)\n    <span class=\"returntype parameter\">&#8594; dynamic</span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  Invoked when a nonexistent method or property is accessed.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"toString\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></span><span class=\"signature\">(<wbr>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A string representation of this object.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor inherited\"\n      id=\"operators\">\n    <h2>Operators</h2>\n    <dl class=\"callables\">\n        <dt id=\"operator ==\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"==-param-other\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">other</span></span>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/bool-class.html\">bool</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The equality operator.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n    \n    \n\n  <section class=\"summary offset-anchor\" id=\"constants\">\n    <h2>Constants</h2>\n\n    <dl class=\"properties\">\n        <dt id=\"values\" class=\"constant\">\n    <span class=\"name \"><a href=\"../logger/Nivel/values-constant.html\">values</a></span>\n  <span class=\"signature\">&#8594; const <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/List-class.html\">List</a><span class=\"signature\">&lt;<wbr><span class=\"type-parameter\"><a href=\"../logger/Nivel.html\">Nivel</a></span>&gt;</span></span>\n  \n\n</dt>\n<dd>\n  A constant List of the values in this enum, in order of their declaration.\n  \n\n</dd>\n\n    </dl>\n  </section>\n</div><!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger</a></li>\n    <li class=\"self-crumb\">Nivel enum</li>\n</ol>\n\n\n  <h5>logger library</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div>\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!-- /.sidebar-offcanvas -->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/Printer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Printer constructor from Class Printer from the logger library, for the Dart programming language.\">\n  <title>Printer constructor - Printer - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">Printer const constructor</li>\n  </ol>\n  <div class=\"self-name\">Printer</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n  <div\n      id=\"dartdoc-main-content\"\n      class=\"main-content\"\n      data-above-sidebar=\"logger&#47;Printer-class-sidebar.html\"\n      data-below-sidebar=\"\">\n      <div>\n<h1><span class=\"kind-constructor\">Printer</span> constructor \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      const\n      <span class=\"name \">Printer</span>(<wbr>{<ol class=\"parameter-list\"> <li><span class=\"parameter\" id=\"-param-inicio\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span> <span class=\"parameter-name\">inicio</span> = <span class=\"default-value\">&#39;&#39;</span>, </span></li>\n<li><span class=\"parameter\" id=\"-param-fim\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span> <span class=\"parameter-name\">fim</span> = <span class=\"default-value\">&#39;&#39;</span>, </span></li>\n</ol>})\n    </section>\n\n    \n\n\n    \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">const Printer({this.inicio = &#39;&#39;, this.fim = &#39;&#39;});</code></pre>\n</section>\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">Printer const constructor</li>\n</ol>\n\n\n    <h5>Printer class</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-left-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/fim.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the fim property from the Printer class, for the Dart programming language.\">\n  <title>fim property - Printer class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">fim property</li>\n  </ol>\n  <div class=\"self-name\">fim</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Printer-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-property\">fim</span> property \n</h1></div>\n\n      <section class=\"multi-line-signature\">\n        \n        <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a>\n        <span class=\"name \">fim</span>\n        <div class=\"features\"><span class=\"feature\">final</span></div>\n\n      </section>\n      \n<section class=\"desc markdown\">\n  <p>Utilizado para personalizar o término de cada linha impressa no log.\nPor padrão não contém um valor.</p>\n</section>\n\n      \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">final String fim;</code></pre>\n</section>\n\n\n</div> <!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">fim property</li>\n</ol>\n\n\n  <h5>Printer class</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div><!--/.sidebar-offcanvas-->\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/inicio.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the inicio property from the Printer class, for the Dart programming language.\">\n  <title>inicio property - Printer class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">inicio property</li>\n  </ol>\n  <div class=\"self-name\">inicio</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Printer-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-property\">inicio</span> property \n</h1></div>\n\n      <section class=\"multi-line-signature\">\n        \n        <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a>\n        <span class=\"name \">inicio</span>\n        <div class=\"features\"><span class=\"feature\">final</span></div>\n\n      </section>\n      \n<section class=\"desc markdown\">\n  <p>Utilizado para personalizar o início de cada linha impressa no log.\nPor padrão não contém um valor.</p>\n</section>\n\n      \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">final String inicio;</code></pre>\n</section>\n\n\n</div> <!-- /.main-content -->\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">inicio property</li>\n</ol>\n\n\n  <h5>Printer class</h5>\n  <div id=\"dartdoc-sidebar-left-content\"></div>\n</div><!--/.sidebar-offcanvas-->\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/log.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the log method from the Printer class, for the Dart programming language.\">\n  <title>log method - Printer class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger.dart</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">log method</li>\n  </ol>\n  <div class=\"self-name\">log</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;Printer-class-sidebar.html\"\n    data-below-sidebar=\"\">\n    <div>\n<h1><span class=\"kind-method\">log</span> method \n</h1></div>\n\n    <section class=\"multi-line-signature\">\n      \n\n<span class=\"returntype\">void</span>\n<span class=\"name \">log</span>(<wbr><ol class=\"parameter-list single-line\"> <li><span class=\"parameter\" id=\"log-param-cor\"><span class=\"type-annotation\"><a href=\"../../logger/Cores.html\">Cores</a></span> <span class=\"parameter-name\">cor</span>, </span></li>\n<li><span class=\"parameter\" id=\"log-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span></li>\n</ol>)\n\n      \n\n    </section>\n    \n<section class=\"desc markdown\">\n  <p>Imprime o <code>object</code> de log de acordo com a plataforma utilizada.\nÉ possível personalizar a <code>cor</code> do texto impresso.</p>\n</section>\n\n\n    \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">void log(Cores cor, Object object) {\n  printer.log(\n    &#39;${cor.ansi}&#39;\n    &#39;$inicio$object$fim&#39;\n    &#39;$resetarCor&#39;,\n  );\n}</code></pre>\n</section>\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../../index.html\">logger</a></li>\n    <li><a href=\"../../logger/logger-library.html\">logger</a></li>\n    <li><a href=\"../../logger/Printer-class.html\">Printer</a></li>\n    <li class=\"self-crumb\">log method</li>\n</ol>\n\n\n    <h5>Printer class</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer-class-sidebar.html",
    "content": "<ol>\n\n        <li class=\"section-title\"><a href=\"logger/Printer-class.html#constructors\">Constructors</a></li>\n          <li><a href=\"logger/Printer/Printer.html\">Printer</a></li>\n\n\n    \n        <li class=\"section-title\">\n          <a href=\"logger/Printer-class.html#instance-properties\">Properties</a>\n        </li>\n          <li><a href=\"logger/Printer/fim.html\">fim</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></li>\n          <li><a href=\"logger/Printer/inicio.html\">inicio</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></li>\n\n        <li class=\"section-title\"><a href=\"logger/Printer-class.html#instance-methods\">Methods</a></li>\n          <li><a href=\"logger/Printer/log.html\">log</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></li>\n\n        <li class=\"section-title inherited\"><a href=\"logger/Printer-class.html#operators\">Operators</a></li>\n          <li class=\"inherited\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></li>\n\n    \n\n    \n\n\n</ol>\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer-class.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the Printer class from the logger library, for the Dart programming language.\">\n  <title>Printer class - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger.dart</a></li>\n    <li class=\"self-crumb\">Printer class</li>\n  </ol>\n  <div class=\"self-name\">Printer</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"logger&#47;logger-library-sidebar.html\"\n    data-below-sidebar=\"logger&#47;Printer-class-sidebar.html\">\n    <div>\n<h1><span class=\"kind-class\">Printer</span> class \n \n</h1></div>\n\n    \n<section class=\"desc markdown\">\n  <p>Uma impressora de logs utilizada por <a href=\"../logger/Logger-class.html\">Logger</a> que funciona em todas\nas plataformas.</p>\n</section>\n\n\n\n    \n  <section class=\"summary offset-anchor\" id=\"constructors\">\n    <h2>Constructors</h2>\n\n    <dl class=\"constructor-summary-list\">\n        <dt id=\"Printer\" class=\"callable\">\n          <span class=\"name\"><a href=\"../logger/Printer/Printer.html\">Printer</a></span><span class=\"signature\">({<span class=\"parameter\" id=\"-param-inicio\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span> <span class=\"parameter-name\">inicio</span> = <span class=\"default-value\">&#39;&#39;</span>, </span><span class=\"parameter\" id=\"-param-fim\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span> <span class=\"parameter-name\">fim</span> = <span class=\"default-value\">&#39;&#39;</span></span>})</span>\n        </dt>\n        <dd>\n          \n            <div class=\"constructor-modifier features\">const</div>\n        </dd>\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor\"\n      id=\"instance-properties\">\n    <h2>Properties</h2>\n    <dl class=\"properties\">\n        <dt id=\"fim\" class=\"property\">\n  <span class=\"name\"><a href=\"../logger/Printer/fim.html\">fim</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  \n\n</dt>\n<dd>\n  Utilizado para personalizar o término de cada linha impressa no log.\nPor padrão não contém um valor.\n  <div class=\"features\"><span class=\"feature\">final</span></div>\n\n</dd>\n\n        <dt id=\"hashCode\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/hashCode.html\">hashCode</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/int-class.html\">int</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The hash code for this object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"inicio\" class=\"property\">\n  <span class=\"name\"><a href=\"../logger/Printer/inicio.html\">inicio</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  \n\n</dt>\n<dd>\n  Utilizado para personalizar o início de cada linha impressa no log.\nPor padrão não contém um valor.\n  <div class=\"features\"><span class=\"feature\">final</span></div>\n\n</dd>\n\n        <dt id=\"runtimeType\" class=\"property inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/runtimeType.html\">runtimeType</a></span>\n  <span class=\"signature\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Type-class.html\">Type</a></span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A representation of the runtime type of the object.\n  <div class=\"features\"><span class=\"feature\">no setter</span><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor\"\n      id=\"instance-methods\">\n    <h2>Methods</h2>\n    <dl class=\"callables\">\n        <dt id=\"log\" class=\"callable\">\n  <span class=\"name\"><a href=\"../logger/Printer/log.html\">log</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"log-param-cor\"><span class=\"type-annotation\"><a href=\"../logger/Cores.html\">Cores</a></span> <span class=\"parameter-name\">cor</span>, </span><span class=\"parameter\" id=\"log-param-object\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">object</span></span>)\n    <span class=\"returntype parameter\">&#8594; void</span>\n  </span>\n  \n\n</dt>\n<dd>\n  Imprime o <code>object</code> de log de acordo com a plataforma utilizada.\nÉ possível personalizar a <code>cor</code> do texto impresso.\n  \n\n</dd>\n\n        <dt id=\"noSuchMethod\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/noSuchMethod.html\">noSuchMethod</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"noSuchMethod-param-invocation\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Invocation-class.html\">Invocation</a></span> <span class=\"parameter-name\">invocation</span></span>)\n    <span class=\"returntype parameter\">&#8594; dynamic</span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  Invoked when a nonexistent method or property is accessed.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n        <dt id=\"toString\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/toString.html\">toString</a></span><span class=\"signature\">(<wbr>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  A string representation of this object.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n  <section\n      class=\"summary offset-anchor inherited\"\n      id=\"operators\">\n    <h2>Operators</h2>\n    <dl class=\"callables\">\n        <dt id=\"operator ==\" class=\"callable inherited\">\n  <span class=\"name\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object/operator_equals.html\">operator ==</a></span><span class=\"signature\">(<wbr><span class=\"parameter\" id=\"==-param-other\"><span class=\"type-annotation\"><a href=\"https://api.dart.dev/stable/3.5.1/dart-core/Object-class.html\">Object</a></span> <span class=\"parameter-name\">other</span></span>)\n    <span class=\"returntype parameter\">&#8594; <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/bool-class.html\">bool</a></span>\n  </span>\n  \n\n</dt>\n<dd class=\"inherited\">\n  The equality operator.\n  <div class=\"features\"><span class=\"feature\">inherited</span></div>\n\n</dd>\n\n    </dl>\n  </section>\n    \n    \n    \n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger</a></li>\n    <li class=\"self-crumb\">Printer class</li>\n</ol>\n\n\n    <h5>logger library</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div>\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/ansiCores-constant.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the ansiCores constant from the logger library, for the Dart programming language.\">\n  <title>ansiCores constant - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../\"\n      data-using-base-href=\"false\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <button id=\"sidenav-left-toggle\" type=\"button\">&nbsp;</button>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger</a></li>\n    <li class=\"self-crumb\">ansiCores constant</li>\n  </ol>\n  <div class=\"self-name\">ansiCores</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<main>\n\n\n  <div id=\"dartdoc-main-content\" class=\"main-content\">\n      <div>\n<h1><span class=\"kind-top-level-property\">ansiCores</span> top-level constant \n    <a href=\"https://dart.dev/null-safety\" class=\"feature feature-null-safety\" title=\"Supports the null safety language feature.\">Null safety</a>\n \n</h1></div>\n\n        <section class=\"multi-line-signature\">\n          <a href=\"https://api.dart.dev/stable/2.16.0/dart-core/Map-class.html\">Map</a><span class=\"signature\">&lt;<wbr><span class=\"type-parameter\"><a href=\"../logger/Cores.html\">Cores</a></span>, <span class=\"type-parameter\"><a href=\"https://api.dart.dev/stable/2.16.0/dart-core/String-class.html\">String</a></span>&gt;</span>\n          const <span class=\"name \">ansiCores</span>\n          \n\n        </section>\n        \n<section class=\"desc markdown\">\n  <p>Map com o código ANSI utilizado para personalizar as cores de fonte no terminal.</p>\n</section>\n\n        \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">const ansiCores = {\n  Cores.vermelho: &#39;\\x1b[31m&#39;,\n  Cores.verde: &#39;\\x1b[32m&#39;,\n  Cores.azul: &#39;\\x1b[36m&#39;,\n};</code></pre>\n</section>\n\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n  <li><a href=\"../index.html\">logger</a></li>\n  <li><a href=\"../logger/logger-library.html\">logger</a></li>\n  <li class=\"self-crumb\">ansiCores constant</li>\n</ol>\n\n\n    <h5>logger library</h5>\n    <ol>\n  <li class=\"section-title\"><a href=\"../logger/logger-library.html#classes\">Classes</a></li>\n  <li><a href=\"../logger/Logger-class.html\">Logger</a></li>\n  <li><a href=\"../logger/Printer-class.html\">Printer</a></li>\n\n\n\n  <li class=\"section-title\"><a href=\"../logger/logger-library.html#constants\">Constants</a></li>\n  <li><a href=\"../logger/ansiCores-constant.html\">ansiCores</a></li>\n  <li><a href=\"../logger/resetarCor-constant.html\">resetarCor</a></li>\n\n\n\n  <li class=\"section-title\"><a href=\"../logger/logger-library.html#enums\">Enums</a></li>\n  <li><a href=\"../logger/Cores.html\">Cores</a></li>\n  <li><a href=\"../logger/Nivel.html\">Nivel</a></li>\n\n\n</ol>\n\n  </div><!--/.sidebar-offcanvas-left-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../static-assets/script.js?v1\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/logger-library-sidebar.html",
    "content": "<ol>\n      <li class=\"section-title\"><a href=\"logger/logger-library.html#classes\">Classes</a></li>\n        <li><a href=\"logger/Logger-class.html\">Logger</a></li>\n        <li><a href=\"logger/Printer-class.html\">Printer</a></li>\n\n      <li class=\"section-title\"><a href=\"logger/logger-library.html#enums\">Enums</a></li>\n        <li><a href=\"logger/Cores.html\">Cores</a></li>\n        <li><a href=\"logger/Nivel.html\">Nivel</a></li>\n\n\n\n      <li class=\"section-title\"><a href=\"logger/logger-library.html#constants\">Constants</a></li>\n        <li><a href=\"logger/resetarCor-constant.html\">resetarCor</a></li>\n\n\n\n\n\n</ol>\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/logger-library.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"logger library API docs, for the Dart programming language.\">\n  <title>logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li class=\"self-crumb\">logger.dart</li>\n  </ol>\n  <div class=\"self-name\">logger</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div\n    id=\"dartdoc-main-content\"\n    class=\"main-content\"\n    data-above-sidebar=\"\"\n    data-below-sidebar=\"logger&#47;logger-library-sidebar.html\">\n  \n    <div>\n      \n\n      <h1>\n        <span class=\"kind-library\">logger</span>\n        library \n \n\n      </h1>\n    </div>\n\n    \n\n\n    <section class=\"summary offset-anchor\" id=\"classes\">\n      <h2>Classes</h2>\n\n      <dl>\n          <dt id=\"Logger\">\n  <span class=\"name \"><a href=\"../logger/Logger-class.html\">Logger</a></span> \n\n</dt>\n<dd>\n  Controla a impressão de logs, feitas através do <a href=\"../logger/Logger/printer.html\">printer</a>.\nImprime logs de acordo com o <a href=\"../logger/Logger/nivel.html\">nivel</a> informado.\n</dd>\n\n          <dt id=\"Printer\">\n  <span class=\"name \"><a href=\"../logger/Printer-class.html\">Printer</a></span> \n\n</dt>\n<dd>\n  Uma impressora de logs utilizada por <a href=\"../logger/Logger-class.html\">Logger</a> que funciona em todas\nas plataformas.\n</dd>\n\n      </dl>\n    </section>\n\n    <section class=\"summary offset-anchor\" id=\"enums\">\n      <h2>Enums</h2>\n\n      <dl>\n          <dt id=\"Cores\">\n  <span class=\"name \"><a href=\"../logger/Cores.html\">Cores</a></span> \n\n</dt>\n<dd>\n  Enum com as cores utilizadas para personalizar a fonte de log no terminal.\n</dd>\n\n          <dt id=\"Nivel\">\n  <span class=\"name \"><a href=\"../logger/Nivel.html\">Nivel</a></span> \n\n</dt>\n<dd>\n  Controla o <a href=\"../logger/Nivel.html\">Nivel</a> permitido do log para ser impresso, quanto mais crítico\nmais restrito é, e menos níveis são impressos.\nAbaixo as opções ordenadas pelo menos crítico:\n</dd>\n\n      </dl>\n    </section>\n\n\n\n\n    <section class=\"summary offset-anchor\" id=\"constants\">\n      <h2>Constants</h2>\n\n      <dl class=\"properties\">\n          <dt id=\"resetarCor\" class=\"constant\">\n    <span class=\"name \"><a href=\"../logger/resetarCor-constant.html\">resetarCor</a></span>\n  <span class=\"signature\">&#8594; const <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a></span>\n  \n\n</dt>\n<dd>\n  Código ANSI utilizado para resetar a cor da fonte no terminal.\n  \n\n</dd>\n\n      </dl>\n    </section>\n\n\n\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li class=\"self-crumb\">logger.dart</li>\n</ol>\n\n\n    <h5><span class=\"package-name\">logger</span> <span class=\"package-kind\">package</span></h5>\n    <ol>\n      <li class=\"section-title\">Libraries</li>\n      <li><a href=\"../logger/logger-library.html\">logger</a></li>\n</ol>\n\n  </div>\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n    <h5>logger library</h5>\n  </div><!--/sidebar-offcanvas-right-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/logger/resetarCor-constant.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"API docs for the resetarCor constant from the logger library, for the Dart programming language.\">\n  <title>resetarCor constant - logger library - Dart API</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"../static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"../static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"../static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"../\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger.dart</a></li>\n    <li class=\"self-crumb\">resetarCor constant</li>\n  </ol>\n  <div class=\"self-name\">resetarCor</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n  <div\n      id=\"dartdoc-main-content\"\n      class=\"main-content\"\n      data-above-sidebar=\"logger&#47;logger-library-sidebar.html\"\n      data-below-sidebar=\"\">\n      <div>\n<h1><span class=\"kind-top-level-property\">resetarCor</span> top-level constant \n \n</h1></div>\n\n        <section class=\"multi-line-signature\">\n          \n          <a href=\"https://api.dart.dev/stable/3.5.1/dart-core/String-class.html\">String</a>\n          const <span class=\"name \">resetarCor</span>\n          \n\n        </section>\n        \n<section class=\"desc markdown\">\n  <p>Código ANSI utilizado para resetar a cor da fonte no terminal.</p>\n</section>\n\n        \n<section class=\"summary source-code\" id=\"source\">\n  <h2><span>Implementation</span></h2>\n  <pre class=\"language-dart\"><code class=\"language-dart\">const resetarCor = &#39;\\x1b[m&#39;;</code></pre>\n</section>\n\n\n\n  </div> <!-- /.main-content -->\n\n  <div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n    <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"../index.html\">logger</a></li>\n    <li><a href=\"../logger/logger-library.html\">logger</a></li>\n    <li class=\"self-crumb\">resetarCor constant</li>\n</ol>\n\n\n    <h5>logger library</h5>\n    <div id=\"dartdoc-sidebar-left-content\"></div>\n  </div><!--/.sidebar-offcanvas-left-->\n\n  <div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n  </div><!--/.sidebar-offcanvas-->\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"../static-assets/highlight.pack.js?v1\"></script>\n<script src=\"../static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/search.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1, user-scalable=no\">\n  <meta name=\"description\" content=\"logger API docs, for the Dart programming language.\">\n  <title>logger - Dart API docs</title>\n\n\n  \n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n  <link href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\" rel=\"stylesheet\">\n  \n  <link rel=\"stylesheet\" href=\"static-assets/github.css?v1\">\n  <link rel=\"stylesheet\" href=\"static-assets/styles.css?v1\">\n  <link rel=\"icon\" href=\"static-assets/favicon.png?v1\">\n\n  \n</head>\n\n\n<body data-base-href=\"./\" data-using-base-href=\"false\" class=\"light-theme\">\n\n<div id=\"overlay-under-drawer\"></div>\n\n<header id=\"title\">\n  <span id=\"sidenav-left-toggle\" class=\"material-symbols-outlined\" role=\"button\" tabindex=\"0\">menu</span>\n  <ol class=\"breadcrumbs gt-separated dark hidden-xs\">\n    <li><a href=\"index.html\">logger</a></li>\n    <li class=\"self-crumb\">Search</li>\n  </ol>\n  <div class=\"self-name\">logger</div>\n  <form class=\"search navbar-right\" role=\"search\">\n    <input type=\"text\" id=\"search-box\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n  <div class=\"toggle\" id=\"theme-button\" title=\"Toggle brightness\">\n    <label for=\"theme\">\n      <input type=\"checkbox\" id=\"theme\" value=\"light-theme\">\n      <span id=\"dark-theme-button\" class=\"material-symbols-outlined\">\n        dark_mode\n      </span>\n      <span id=\"light-theme-button\" class=\"material-symbols-outlined\">\n        light_mode\n      </span>\n    </label>\n  </div>\n</header>\n<main>\n\n<div id=\"dartdoc-main-content\" class=\"main-content\">\n</div>\n\n<div id=\"dartdoc-sidebar-left\" class=\"sidebar sidebar-offcanvas-left\">\n  <!-- The search input and breadcrumbs below are only responsively visible at low resolutions. -->\n<header id=\"header-search-sidebar\" class=\"hidden-l\">\n  <form class=\"search-sidebar\" role=\"search\">\n    <input type=\"text\" id=\"search-sidebar\" autocomplete=\"off\" disabled class=\"form-control typeahead\" placeholder=\"Loading search...\">\n  </form>\n</header>\n\n<ol class=\"breadcrumbs gt-separated dark hidden-l\" id=\"sidebar-nav\">\n    <li><a href=\"index.html\">logger</a></li>\n    <li class=\"self-crumb\">Search</li>\n</ol>\n\n\n  <h5 class=\"hidden-xs\"><span class=\"package-name\">logger</span> <span class=\"package-kind\">package</span></h5>\n  <ol>\n      <li class=\"section-title\">Libraries</li>\n      <li><a href=\"logger/logger-library.html\">logger</a></li>\n</ol>\n\n</div>\n\n<div id=\"dartdoc-sidebar-right\" class=\"sidebar sidebar-offcanvas-right\">\n</div>\n\n</main>\n\n<footer>\n  <span class=\"no-break\">\n    logger\n      1.0.0\n  </span>\n\n  \n</footer>\n\n\n\n<script src=\"static-assets/highlight.pack.js?v1\"></script>\n<script src=\"static-assets/docs.dart.js\"></script>\n\n\n\n</body>\n\n</html>\n\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/docs.dart.js",
    "content": "(function dartProgram(){function copyProperties(a,b){var s=Object.keys(a)\nfor(var r=0;r<s.length;r++){var q=s[r]\nb[q]=a[q]}}function mixinPropertiesHard(a,b){var s=Object.keys(a)\nfor(var r=0;r<s.length;r++){var q=s[r]\nif(!b.hasOwnProperty(q)){b[q]=a[q]}}}function mixinPropertiesEasy(a,b){Object.assign(b,a)}var z=function(){var s=function(){}\ns.prototype={p:{}}\nvar r=new s()\nif(!(Object.getPrototypeOf(r)&&Object.getPrototypeOf(r).p===s.prototype.p))return false\ntry{if(typeof navigator!=\"undefined\"&&typeof navigator.userAgent==\"string\"&&navigator.userAgent.indexOf(\"Chrome/\")>=0)return true\nif(typeof version==\"function\"&&version.length==0){var q=version()\nif(/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(q))return true}}catch(p){}return false}()\nfunction inherit(a,b){a.prototype.constructor=a\na.prototype[\"$i\"+a.name]=a\nif(b!=null){if(z){Object.setPrototypeOf(a.prototype,b.prototype)\nreturn}var s=Object.create(b.prototype)\ncopyProperties(a.prototype,s)\na.prototype=s}}function inheritMany(a,b){for(var s=0;s<b.length;s++){inherit(b[s],a)}}function mixinEasy(a,b){mixinPropertiesEasy(b.prototype,a.prototype)\na.prototype.constructor=a}function mixinHard(a,b){mixinPropertiesHard(b.prototype,a.prototype)\na.prototype.constructor=a}function lazy(a,b,c,d){var s=a\na[b]=s\na[c]=function(){if(a[b]===s){a[b]=d()}a[c]=function(){return this[b]}\nreturn a[b]}}function lazyFinal(a,b,c,d){var s=a\na[b]=s\na[c]=function(){if(a[b]===s){var r=d()\nif(a[b]!==s){A.k4(b)}a[b]=r}var q=a[b]\na[c]=function(){return q}\nreturn q}}function makeConstList(a){a.immutable$list=Array\na.fixed$length=Array\nreturn a}function convertToFastObject(a){function t(){}t.prototype=a\nnew t()\nreturn a}function convertAllToFastObject(a){for(var s=0;s<a.length;++s){convertToFastObject(a[s])}}var y=0\nfunction instanceTearOffGetter(a,b){var s=null\nreturn a?function(c){if(s===null)s=A.eE(b)\nreturn new s(c,this)}:function(){if(s===null)s=A.eE(b)\nreturn new s(this,null)}}function staticTearOffGetter(a){var s=null\nreturn function(){if(s===null)s=A.eE(a).prototype\nreturn s}}var x=0\nfunction tearOffParameters(a,b,c,d,e,f,g,h,i,j){if(typeof h==\"number\"){h+=x}return{co:a,iS:b,iI:c,rC:d,dV:e,cs:f,fs:g,fT:h,aI:i||0,nDA:j}}function installStaticTearOff(a,b,c,d,e,f,g,h){var s=tearOffParameters(a,true,false,c,d,e,f,g,h,false)\nvar r=staticTearOffGetter(s)\na[b]=r}function installInstanceTearOff(a,b,c,d,e,f,g,h,i,j){c=!!c\nvar s=tearOffParameters(a,false,c,d,e,f,g,h,i,!!j)\nvar r=instanceTearOffGetter(c,s)\na[b]=r}function setOrUpdateInterceptorsByTag(a){var s=v.interceptorsByTag\nif(!s){v.interceptorsByTag=a\nreturn}copyProperties(a,s)}function setOrUpdateLeafTags(a){var s=v.leafTags\nif(!s){v.leafTags=a\nreturn}copyProperties(a,s)}function updateTypes(a){var s=v.types\nvar r=s.length\ns.push.apply(s,a)\nreturn r}function updateHolder(a,b){copyProperties(b,a)\nreturn a}var hunkHelpers=function(){var s=function(a,b,c,d,e){return function(f,g,h,i){return installInstanceTearOff(f,g,a,b,c,d,[h],i,e,false)}},r=function(a,b,c,d){return function(e,f,g,h){return installStaticTearOff(e,f,a,b,c,[g],h,d)}}\nreturn{inherit:inherit,inheritMany:inheritMany,mixin:mixinEasy,mixinHard:mixinHard,installStaticTearOff:installStaticTearOff,installInstanceTearOff:installInstanceTearOff,_instance_0u:s(0,0,null,[\"$0\"],0),_instance_1u:s(0,1,null,[\"$1\"],0),_instance_2u:s(0,2,null,[\"$2\"],0),_instance_0i:s(1,0,null,[\"$0\"],0),_instance_1i:s(1,1,null,[\"$1\"],0),_instance_2i:s(1,2,null,[\"$2\"],0),_static_0:r(0,null,[\"$0\"],0),_static_1:r(1,null,[\"$1\"],0),_static_2:r(2,null,[\"$2\"],0),makeConstList:makeConstList,lazy:lazy,lazyFinal:lazyFinal,updateHolder:updateHolder,convertToFastObject:convertToFastObject,updateTypes:updateTypes,setOrUpdateInterceptorsByTag:setOrUpdateInterceptorsByTag,setOrUpdateLeafTags:setOrUpdateLeafTags}}()\nfunction initializeDeferredHunk(a){x=v.types.length\na(hunkHelpers,v,w,$)}var J={\neJ(a,b,c,d){return{i:a,p:b,e:c,x:d}},\neG(a){var s,r,q,p,o,n=a[v.dispatchPropertyName]\nif(n==null)if($.eH==null){A.jQ()\nn=a[v.dispatchPropertyName]}if(n!=null){s=n.p\nif(!1===s)return n.i\nif(!0===s)return a\nr=Object.getPrototypeOf(a)\nif(s===r)return n.i\nif(n.e===r)throw A.a(A.fe(\"Return interceptor for \"+A.i(s(a,n))))}q=a.constructor\nif(q==null)p=null\nelse{o=$.dm\nif(o==null)o=$.dm=v.getIsolateTag(\"_$dart_js\")\np=q[o]}if(p!=null)return p\np=A.jV(a)\nif(p!=null)return p\nif(typeof a==\"function\")return B.J\ns=Object.getPrototypeOf(a)\nif(s==null)return B.w\nif(s===Object.prototype)return B.w\nif(typeof q==\"function\"){o=$.dm\nif(o==null)o=$.dm=v.getIsolateTag(\"_$dart_js\")\nObject.defineProperty(q,o,{value:B.j,enumerable:false,writable:true,configurable:true})\nreturn B.j}return B.j},\nhQ(a,b){if(a<0||a>4294967295)throw A.a(A.H(a,0,4294967295,\"length\",null))\nreturn J.hS(new Array(a),b)},\nhR(a,b){if(a<0)throw A.a(A.a_(\"Length must be a non-negative integer: \"+a,null))\nreturn A.h(new Array(a),b.i(\"o<0>\"))},\neX(a,b){if(a<0)throw A.a(A.a_(\"Length must be a non-negative integer: \"+a,null))\nreturn A.h(new Array(a),b.i(\"o<0>\"))},\nhS(a,b){return J.eg(A.h(a,b.i(\"o<0>\")))},\neg(a){a.fixed$length=Array\nreturn a},\neY(a){a.fixed$length=Array\na.immutable$list=Array\nreturn a},\nhT(a,b){return J.hu(a,b)},\nX(a){if(typeof a==\"number\"){if(Math.floor(a)==a)return J.aP.prototype\nreturn J.bI.prototype}if(typeof a==\"string\")return J.ai.prototype\nif(a==null)return J.aQ.prototype\nif(typeof a==\"boolean\")return J.bH.prototype\nif(Array.isArray(a))return J.o.prototype\nif(typeof a!=\"object\"){if(typeof a==\"function\")return J.a1.prototype\nif(typeof a==\"symbol\")return J.aU.prototype\nif(typeof a==\"bigint\")return J.aS.prototype\nreturn a}if(a instanceof A.l)return a\nreturn J.eG(a)},\nao(a){if(typeof a==\"string\")return J.ai.prototype\nif(a==null)return a\nif(Array.isArray(a))return J.o.prototype\nif(typeof a!=\"object\"){if(typeof a==\"function\")return J.a1.prototype\nif(typeof a==\"symbol\")return J.aU.prototype\nif(typeof a==\"bigint\")return J.aS.prototype\nreturn a}if(a instanceof A.l)return a\nreturn J.eG(a)},\ne_(a){if(a==null)return a\nif(Array.isArray(a))return J.o.prototype\nif(typeof a!=\"object\"){if(typeof a==\"function\")return J.a1.prototype\nif(typeof a==\"symbol\")return J.aU.prototype\nif(typeof a==\"bigint\")return J.aS.prototype\nreturn a}if(a instanceof A.l)return a\nreturn J.eG(a)},\njJ(a){if(typeof a==\"number\")return J.aR.prototype\nif(typeof a==\"string\")return J.ai.prototype\nif(a==null)return a\nif(!(a instanceof A.l))return J.ax.prototype\nreturn a},\nF(a,b){if(a==null)return b==null\nif(typeof a!=\"object\")return b!=null&&a===b\nreturn J.X(a).F(a,b)},\nhr(a,b){if(typeof b===\"number\")if(Array.isArray(a)||typeof a==\"string\"||A.h4(a,a[v.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]\nreturn J.ao(a).k(a,b)},\nhs(a,b,c){if(typeof b===\"number\")if((Array.isArray(a)||A.h4(a,a[v.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c\nreturn J.e_(a).q(a,b,c)},\nht(a,b){return J.e_(a).X(a,b)},\nhu(a,b){return J.jJ(a).aL(a,b)},\nhv(a,b){return J.ao(a).ag(a,b)},\nef(a,b){return J.e_(a).E(a,b)},\nZ(a){return J.X(a).gn(a)},\nL(a){return J.e_(a).gB(a)},\naI(a){return J.ao(a).gl(a)},\nhw(a){return J.X(a).gt(a)},\nhx(a,b){return J.X(a).b_(a,b)},\naq(a){return J.X(a).h(a)},\nbG:function bG(){},\nbH:function bH(){},\naQ:function aQ(){},\naT:function aT(){},\na2:function a2(){},\nbX:function bX(){},\nax:function ax(){},\na1:function a1(){},\naS:function aS(){},\naU:function aU(){},\no:function o(a){this.$ti=a},\ncF:function cF(a){this.$ti=a},\nar:function ar(a,b,c){var _=this\n_.a=a\n_.b=b\n_.c=0\n_.d=null\n_.$ti=c},\naR:function aR(){},\naP:function aP(){},\nbI:function bI(){},\nai:function ai(){}},A={eh:function eh(){},\nhA(a,b,c){if(b.i(\"c<0>\").b(a))return new A.b9(a,b.i(\"@<0>\").A(c).i(\"b9<1,2>\"))\nreturn new A.af(a,b.i(\"@<0>\").A(c).i(\"af<1,2>\"))},\ne0(a){var s,r=a^48\nif(r<=9)return r\ns=a|32\nif(97<=s&&s<=102)return s-87\nreturn-1},\na6(a,b){a=a+b&536870911\na=a+((a&524287)<<10)&536870911\nreturn a^a>>>6},\nen(a){a=a+((a&67108863)<<3)&536870911\na^=a>>>11\nreturn a+((a&16383)<<15)&536870911},\ncn(a,b,c){return a},\neI(a){var s,r\nfor(s=$.ap.length,r=0;r<s;++r)if(a===$.ap[r])return!0\nreturn!1},\nhW(a,b,c,d){if(t.U.b(a))return new A.aM(a,b,c.i(\"@<0>\").A(d).i(\"aM<1,2>\"))\nreturn new A.aj(a,b,c.i(\"@<0>\").A(d).i(\"aj<1,2>\"))},\neV(){return new A.b5(\"No element\")},\na8:function a8(){},\nbA:function bA(a,b){this.a=a\nthis.$ti=b},\naf:function af(a,b){this.a=a\nthis.$ti=b},\nb9:function b9(a,b){this.a=a\nthis.$ti=b},\nb8:function b8(){},\nM:function M(a,b){this.a=a\nthis.$ti=b},\naV:function aV(a){this.a=a},\nbB:function bB(a){this.a=a},\ncR:function cR(){},\nc:function c(){},\nJ:function J(){},\nau:function au(a,b,c){var _=this\n_.a=a\n_.b=b\n_.c=0\n_.d=null\n_.$ti=c},\naj:function aj(a,b,c){this.a=a\nthis.b=b\nthis.$ti=c},\naM:function aM(a,b,c){this.a=a\nthis.b=b\nthis.$ti=c},\nav:function av(a,b,c){var _=this\n_.a=null\n_.b=a\n_.c=b\n_.$ti=c},\nak:function ak(a,b,c){this.a=a\nthis.b=b\nthis.$ti=c},\naO:function aO(){},\nc1:function c1(){},\nay:function ay(){},\na5:function a5(a){this.a=a},\nbp:function bp(){},\nhG(){throw A.a(A.T(\"Cannot modify unmodifiable Map\"))},\nh9(a){var s=v.mangledGlobalNames[a]\nif(s!=null)return s\nreturn\"minified:\"+a},\nh4(a,b){var s\nif(b!=null){s=b.x\nif(s!=null)return s}return t.p.b(a)},\ni(a){var s\nif(typeof a==\"string\")return a\nif(typeof a==\"number\"){if(a!==0)return\"\"+a}else if(!0===a)return\"true\"\nelse if(!1===a)return\"false\"\nelse if(a==null)return\"null\"\ns=J.aq(a)\nreturn s},\nbY(a){var s,r=$.f2\nif(r==null)r=$.f2=Symbol(\"identityHashCode\")\ns=a[r]\nif(s==null){s=Math.random()*0x3fffffff|0\na[r]=s}return s},\nf3(a,b){var s,r,q,p,o,n=null,m=/^\\s*[+-]?((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$/i.exec(a)\nif(m==null)return n\ns=m[3]\nif(b==null){if(s!=null)return parseInt(a,10)\nif(m[2]!=null)return parseInt(a,16)\nreturn n}if(b<2||b>36)throw A.a(A.H(b,2,36,\"radix\",n))\nif(b===10&&s!=null)return parseInt(a,10)\nif(b<10||s==null){r=b<=10?47+b:86+b\nq=m[1]\nfor(p=q.length,o=0;o<p;++o)if((q.charCodeAt(o)|32)>r)return n}return parseInt(a,b)},\ncQ(a){return A.i0(a)},\ni0(a){var s,r,q,p\nif(a instanceof A.l)return A.C(A.aG(a),null)\ns=J.X(a)\nif(s===B.I||s===B.K||t.o.b(a)){r=B.l(a)\nif(r!==\"Object\"&&r!==\"\")return r\nq=a.constructor\nif(typeof q==\"function\"){p=q.name\nif(typeof p==\"string\"&&p!==\"Object\"&&p!==\"\")return p}}return A.C(A.aG(a),null)},\nf4(a){if(a==null||typeof a==\"number\"||A.ez(a))return J.aq(a)\nif(typeof a==\"string\")return JSON.stringify(a)\nif(a instanceof A.ag)return a.h(0)\nif(a instanceof A.bf)return a.aH(!0)\nreturn\"Instance of '\"+A.cQ(a)+\"'\"},\ni3(a,b,c){var s,r,q,p\nif(c<=500&&b===0&&c===a.length)return String.fromCharCode.apply(null,a)\nfor(s=b,r=\"\";s<c;s=q){q=s+500\np=q<c?q:c\nr+=String.fromCharCode.apply(null,a.subarray(s,p))}return r},\nQ(a){var s\nif(0<=a){if(a<=65535)return String.fromCharCode(a)\nif(a<=1114111){s=a-65536\nreturn String.fromCharCode((B.c.V(s,10)|55296)>>>0,s&1023|56320)}}throw A.a(A.H(a,0,1114111,null,null))},\na3(a,b,c){var s,r,q={}\nq.a=0\ns=[]\nr=[]\nq.a=b.length\nB.b.aI(s,b)\nq.b=\"\"\nif(c!=null&&c.a!==0)c.C(0,new A.cP(q,r,s))\nreturn J.hx(a,new A.cD(B.ac,0,s,r,0))},\ni1(a,b,c){var s,r,q\nif(Array.isArray(b))s=c==null||c.a===0\nelse s=!1\nif(s){r=b.length\nif(r===0){if(!!a.$0)return a.$0()}else if(r===1){if(!!a.$1)return a.$1(b[0])}else if(r===2){if(!!a.$2)return a.$2(b[0],b[1])}else if(r===3){if(!!a.$3)return a.$3(b[0],b[1],b[2])}else if(r===4){if(!!a.$4)return a.$4(b[0],b[1],b[2],b[3])}else if(r===5)if(!!a.$5)return a.$5(b[0],b[1],b[2],b[3],b[4])\nq=a[\"\"+\"$\"+r]\nif(q!=null)return q.apply(a,b)}return A.i_(a,b,c)},\ni_(a,b,c){var s,r,q,p,o,n,m,l,k,j,i,h,g=Array.isArray(b)?b:A.bL(b,!0,t.z),f=g.length,e=a.$R\nif(f<e)return A.a3(a,g,c)\ns=a.$D\nr=s==null\nq=!r?s():null\np=J.X(a)\no=p.$C\nif(typeof o==\"string\")o=p[o]\nif(r){if(c!=null&&c.a!==0)return A.a3(a,g,c)\nif(f===e)return o.apply(a,g)\nreturn A.a3(a,g,c)}if(Array.isArray(q)){if(c!=null&&c.a!==0)return A.a3(a,g,c)\nn=e+q.length\nif(f>n)return A.a3(a,g,null)\nif(f<n){m=q.slice(f-e)\nif(g===b)g=A.bL(g,!0,t.z)\nB.b.aI(g,m)}return o.apply(a,g)}else{if(f>e)return A.a3(a,g,c)\nif(g===b)g=A.bL(g,!0,t.z)\nl=Object.keys(q)\nif(c==null)for(r=l.length,k=0;k<l.length;l.length===r||(0,A.co)(l),++k){j=q[l[k]]\nif(B.n===j)return A.a3(a,g,c)\nB.b.ad(g,j)}else{for(r=l.length,i=0,k=0;k<l.length;l.length===r||(0,A.co)(l),++k){h=l[k]\nif(c.H(h)){++i\nB.b.ad(g,c.k(0,h))}else{j=q[h]\nif(B.n===j)return A.a3(a,g,c)\nB.b.ad(g,j)}}if(i!==c.a)return A.a3(a,g,c)}return o.apply(a,g)}},\ni2(a){var s=a.$thrownJsError\nif(s==null)return null\nreturn A.ac(s)},\neF(a,b){var s,r=\"index\"\nif(!A.fP(b))return new A.G(!0,b,r,null)\ns=J.aI(a)\nif(b<0||b>=s)return A.eU(b,s,a,r)\nreturn A.i4(b,r)},\njG(a,b,c){if(a>c)return A.H(a,0,c,\"start\",null)\nif(b!=null)if(b<a||b>c)return A.H(b,a,c,\"end\",null)\nreturn new A.G(!0,b,\"end\",null)},\njz(a){return new A.G(!0,a,null,null)},\na(a){return A.h3(new Error(),a)},\nh3(a,b){var s\nif(b==null)b=new A.R()\na.dartException=b\ns=A.k5\nif(\"defineProperty\" in Object){Object.defineProperty(a,\"message\",{get:s})\na.name=\"\"}else a.toString=s\nreturn a},\nk5(){return J.aq(this.dartException)},\naH(a){throw A.a(a)},\nh8(a,b){throw A.h3(b,a)},\nco(a){throw A.a(A.as(a))},\nS(a){var s,r,q,p,o,n\na=A.k_(a.replace(String({}),\"$receiver$\"))\ns=a.match(/\\\\\\$[a-zA-Z]+\\\\\\$/g)\nif(s==null)s=A.h([],t.s)\nr=s.indexOf(\"\\\\$arguments\\\\$\")\nq=s.indexOf(\"\\\\$argumentsExpr\\\\$\")\np=s.indexOf(\"\\\\$expr\\\\$\")\no=s.indexOf(\"\\\\$method\\\\$\")\nn=s.indexOf(\"\\\\$receiver\\\\$\")\nreturn new A.cU(a.replace(new RegExp(\"\\\\\\\\\\\\$arguments\\\\\\\\\\\\$\",\"g\"),\"((?:x|[^x])*)\").replace(new RegExp(\"\\\\\\\\\\\\$argumentsExpr\\\\\\\\\\\\$\",\"g\"),\"((?:x|[^x])*)\").replace(new RegExp(\"\\\\\\\\\\\\$expr\\\\\\\\\\\\$\",\"g\"),\"((?:x|[^x])*)\").replace(new RegExp(\"\\\\\\\\\\\\$method\\\\\\\\\\\\$\",\"g\"),\"((?:x|[^x])*)\").replace(new RegExp(\"\\\\\\\\\\\\$receiver\\\\\\\\\\\\$\",\"g\"),\"((?:x|[^x])*)\"),r,q,p,o,n)},\ncV(a){return function($expr$){var $argumentsExpr$=\"$arguments$\"\ntry{$expr$.$method$($argumentsExpr$)}catch(s){return s.message}}(a)},\nfd(a){return function($expr$){try{$expr$.$method$}catch(s){return s.message}}(a)},\nei(a,b){var s=b==null,r=s?null:b.method\nreturn new A.bJ(a,r,s?null:b.receiver)},\nae(a){if(a==null)return new A.cO(a)\nif(a instanceof A.aN)return A.ad(a,a.a)\nif(typeof a!==\"object\")return a\nif(\"dartException\" in a)return A.ad(a,a.dartException)\nreturn A.jy(a)},\nad(a,b){if(t.Q.b(b))if(b.$thrownJsError==null)b.$thrownJsError=a\nreturn b},\njy(a){var s,r,q,p,o,n,m,l,k,j,i,h,g\nif(!(\"message\" in a))return a\ns=a.message\nif(\"number\" in a&&typeof a.number==\"number\"){r=a.number\nq=r&65535\nif((B.c.V(r,16)&8191)===10)switch(q){case 438:return A.ad(a,A.ei(A.i(s)+\" (Error \"+q+\")\",null))\ncase 445:case 5007:A.i(s)\nreturn A.ad(a,new A.b1())}}if(a instanceof TypeError){p=$.ha()\no=$.hb()\nn=$.hc()\nm=$.hd()\nl=$.hg()\nk=$.hh()\nj=$.hf()\n$.he()\ni=$.hj()\nh=$.hi()\ng=p.D(s)\nif(g!=null)return A.ad(a,A.ei(s,g))\nelse{g=o.D(s)\nif(g!=null){g.method=\"call\"\nreturn A.ad(a,A.ei(s,g))}else if(n.D(s)!=null||m.D(s)!=null||l.D(s)!=null||k.D(s)!=null||j.D(s)!=null||m.D(s)!=null||i.D(s)!=null||h.D(s)!=null)return A.ad(a,new A.b1())}return A.ad(a,new A.c0(typeof s==\"string\"?s:\"\"))}if(a instanceof RangeError){if(typeof s==\"string\"&&s.indexOf(\"call stack\")!==-1)return new A.b4()\ns=function(b){try{return String(b)}catch(f){}return null}(a)\nreturn A.ad(a,new A.G(!1,null,null,typeof s==\"string\"?s.replace(/^RangeError:\\s*/,\"\"):s))}if(typeof InternalError==\"function\"&&a instanceof InternalError)if(typeof s==\"string\"&&s===\"too much recursion\")return new A.b4()\nreturn a},\nac(a){var s\nif(a instanceof A.aN)return a.b\nif(a==null)return new A.bg(a)\ns=a.$cachedTrace\nif(s!=null)return s\ns=new A.bg(a)\nif(typeof a===\"object\")a.$cachedTrace=s\nreturn s},\nh5(a){if(a==null)return J.Z(a)\nif(typeof a==\"object\")return A.bY(a)\nreturn J.Z(a)},\njI(a,b){var s,r,q,p=a.length\nfor(s=0;s<p;s=q){r=s+1\nq=r+1\nb.q(0,a[s],a[r])}return b},\njb(a,b,c,d,e,f){switch(b){case 0:return a.$0()\ncase 1:return a.$1(c)\ncase 2:return a.$2(c,d)\ncase 3:return a.$3(c,d,e)\ncase 4:return a.$4(c,d,e,f)}throw A.a(new A.d9(\"Unsupported number of arguments for wrapped closure\"))},\naF(a,b){var s=a.$identity\nif(!!s)return s\ns=A.jE(a,b)\na.$identity=s\nreturn s},\njE(a,b){var s\nswitch(b){case 0:s=a.$0\nbreak\ncase 1:s=a.$1\nbreak\ncase 2:s=a.$2\nbreak\ncase 3:s=a.$3\nbreak\ncase 4:s=a.$4\nbreak\ndefault:s=null}if(s!=null)return s.bind(a)\nreturn function(c,d,e){return function(f,g,h,i){return e(c,d,f,g,h,i)}}(a,b,A.jb)},\nhF(a2){var s,r,q,p,o,n,m,l,k,j,i=a2.co,h=a2.iS,g=a2.iI,f=a2.nDA,e=a2.aI,d=a2.fs,c=a2.cs,b=d[0],a=c[0],a0=i[b],a1=a2.fT\na1.toString\ns=h?Object.create(new A.cS().constructor.prototype):Object.create(new A.aJ(null,null).constructor.prototype)\ns.$initialize=s.constructor\nr=h?function static_tear_off(){this.$initialize()}:function tear_off(a3,a4){this.$initialize(a3,a4)}\ns.constructor=r\nr.prototype=s\ns.$_name=b\ns.$_target=a0\nq=!h\nif(q)p=A.eT(b,a0,g,f)\nelse{s.$static_name=b\np=a0}s.$S=A.hB(a1,h,g)\ns[a]=p\nfor(o=p,n=1;n<d.length;++n){m=d[n]\nif(typeof m==\"string\"){l=i[m]\nk=m\nm=l}else k=\"\"\nj=c[n]\nif(j!=null){if(q)m=A.eT(k,m,g,f)\ns[j]=m}if(n===e)o=m}s.$C=o\ns.$R=a2.rC\ns.$D=a2.dV\nreturn r},\nhB(a,b,c){if(typeof a==\"number\")return a\nif(typeof a==\"string\"){if(b)throw A.a(\"Cannot compute signature for static tearoff.\")\nreturn function(d,e){return function(){return e(this,d)}}(a,A.hy)}throw A.a(\"Error in functionType of tearoff\")},\nhC(a,b,c,d){var s=A.eS\nswitch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,s)\ncase 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,s)\ncase 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,s)\ncase 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,s)\ncase 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,s)\ncase 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,s)\ndefault:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,s)}},\neT(a,b,c,d){if(c)return A.hE(a,b,d)\nreturn A.hC(b.length,d,a,b)},\nhD(a,b,c,d){var s=A.eS,r=A.hz\nswitch(b?-1:a){case 0:throw A.a(new A.bZ(\"Intercepted function with no arguments.\"))\ncase 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,r,s)\ncase 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,r,s)\ncase 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,r,s)\ncase 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,r,s)\ncase 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,r,s)\ncase 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,r,s)\ndefault:return function(e,f,g){return function(){var q=[g(this)]\nArray.prototype.push.apply(q,arguments)\nreturn e.apply(f(this),q)}}(d,r,s)}},\nhE(a,b,c){var s,r\nif($.eQ==null)$.eQ=A.eP(\"interceptor\")\nif($.eR==null)$.eR=A.eP(\"receiver\")\ns=b.length\nr=A.hD(s,c,a,b)\nreturn r},\neE(a){return A.hF(a)},\nhy(a,b){return A.bl(v.typeUniverse,A.aG(a.a),b)},\neS(a){return a.a},\nhz(a){return a.b},\neP(a){var s,r,q,p=new A.aJ(\"receiver\",\"interceptor\"),o=J.eg(Object.getOwnPropertyNames(p))\nfor(s=o.length,r=0;r<s;++r){q=o[r]\nif(p[q]===a)return q}throw A.a(A.a_(\"Field name \"+a+\" not found.\",null))},\nkH(a){throw A.a(new A.c8(a))},\njK(a){return v.getIsolateTag(a)},\njV(a){var s,r,q,p,o,n=$.h2.$1(a),m=$.dZ[n]\nif(m!=null){Object.defineProperty(a,v.dispatchPropertyName,{value:m,enumerable:false,writable:true,configurable:true})\nreturn m.i}s=$.e9[n]\nif(s!=null)return s\nr=v.interceptorsByTag[n]\nif(r==null){q=$.h_.$2(a,n)\nif(q!=null){m=$.dZ[q]\nif(m!=null){Object.defineProperty(a,v.dispatchPropertyName,{value:m,enumerable:false,writable:true,configurable:true})\nreturn m.i}s=$.e9[q]\nif(s!=null)return s\nr=v.interceptorsByTag[q]\nn=q}}if(r==null)return null\ns=r.prototype\np=n[0]\nif(p===\"!\"){m=A.ea(s)\n$.dZ[n]=m\nObject.defineProperty(a,v.dispatchPropertyName,{value:m,enumerable:false,writable:true,configurable:true})\nreturn m.i}if(p===\"~\"){$.e9[n]=s\nreturn s}if(p===\"-\"){o=A.ea(s)\nObject.defineProperty(Object.getPrototypeOf(a),v.dispatchPropertyName,{value:o,enumerable:false,writable:true,configurable:true})\nreturn o.i}if(p===\"+\")return A.h6(a,s)\nif(p===\"*\")throw A.a(A.fe(n))\nif(v.leafTags[n]===true){o=A.ea(s)\nObject.defineProperty(Object.getPrototypeOf(a),v.dispatchPropertyName,{value:o,enumerable:false,writable:true,configurable:true})\nreturn o.i}else return A.h6(a,s)},\nh6(a,b){var s=Object.getPrototypeOf(a)\nObject.defineProperty(s,v.dispatchPropertyName,{value:J.eJ(b,s,null,null),enumerable:false,writable:true,configurable:true})\nreturn b},\nea(a){return J.eJ(a,!1,null,!!a.$iD)},\njX(a,b,c){var s=b.prototype\nif(v.leafTags[a]===true)return A.ea(s)\nelse return J.eJ(s,c,null,null)},\njQ(){if(!0===$.eH)return\n$.eH=!0\nA.jR()},\njR(){var s,r,q,p,o,n,m,l\n$.dZ=Object.create(null)\n$.e9=Object.create(null)\nA.jP()\ns=v.interceptorsByTag\nr=Object.getOwnPropertyNames(s)\nif(typeof window!=\"undefined\"){window\nq=function(){}\nfor(p=0;p<r.length;++p){o=r[p]\nn=$.h7.$1(o)\nif(n!=null){m=A.jX(o,s[o],n)\nif(m!=null){Object.defineProperty(n,v.dispatchPropertyName,{value:m,enumerable:false,writable:true,configurable:true})\nq.prototype=n}}}}for(p=0;p<r.length;++p){o=r[p]\nif(/^[A-Za-z_]/.test(o)){l=s[o]\ns[\"!\"+o]=l\ns[\"~\"+o]=l\ns[\"-\"+o]=l\ns[\"+\"+o]=l\ns[\"*\"+o]=l}}},\njP(){var s,r,q,p,o,n,m=B.y()\nm=A.aE(B.z,A.aE(B.A,A.aE(B.m,A.aE(B.m,A.aE(B.B,A.aE(B.C,A.aE(B.D(B.l),m)))))))\nif(typeof dartNativeDispatchHooksTransformer!=\"undefined\"){s=dartNativeDispatchHooksTransformer\nif(typeof s==\"function\")s=[s]\nif(Array.isArray(s))for(r=0;r<s.length;++r){q=s[r]\nif(typeof q==\"function\")m=q(m)||m}}p=m.getTag\no=m.getUnknownTag\nn=m.prototypeForTag\n$.h2=new A.e1(p)\n$.h_=new A.e2(o)\n$.h7=new A.e3(n)},\naE(a,b){return a(b)||b},\njF(a,b){var s=b.length,r=v.rttc[\"\"+s+\";\"+a]\nif(r==null)return null\nif(s===0)return r\nif(s===r.length)return r.apply(null,b)\nreturn r(b)},\neZ(a,b,c,d,e,f){var s=b?\"m\":\"\",r=c?\"\":\"i\",q=d?\"u\":\"\",p=e?\"s\":\"\",o=f?\"g\":\"\",n=function(g,h){try{return new RegExp(g,h)}catch(m){return m}}(a,s+r+q+p+o)\nif(n instanceof RegExp)return n\nthrow A.a(A.z(\"Illegal RegExp pattern (\"+String(n)+\")\",a,null))},\nk2(a,b,c){var s=a.indexOf(b,c)\nreturn s>=0},\nk_(a){if(/[[\\]{}()*+?.\\\\^$|]/.test(a))return a.replace(/[[\\]{}()*+?.\\\\^$|]/g,\"\\\\$&\")\nreturn a},\nfX(a){return a},\nk3(a,b,c,d){var s,r,q,p=new A.d3(b,a,0),o=t.F,n=0,m=\"\"\nfor(;p.m();){s=p.d\nif(s==null)s=o.a(s)\nr=s.b\nq=r.index\nm=m+A.i(A.fX(B.a.j(a,n,q)))+A.i(c.$1(s))\nn=q+r[0].length}p=m+A.i(A.fX(B.a.K(a,n)))\nreturn p.charCodeAt(0)==0?p:p},\ncg:function cg(a,b){this.a=a\nthis.b=b},\naL:function aL(a,b){this.a=a\nthis.$ti=b},\naK:function aK(){},\nah:function ah(a,b,c){this.a=a\nthis.b=b\nthis.$ti=c},\ncD:function cD(a,b,c,d,e){var _=this\n_.a=a\n_.c=b\n_.d=c\n_.e=d\n_.f=e},\ncP:function cP(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\ncU:function cU(a,b,c,d,e,f){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d\n_.e=e\n_.f=f},\nb1:function b1(){},\nbJ:function bJ(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\nc0:function c0(a){this.a=a},\ncO:function cO(a){this.a=a},\naN:function aN(a,b){this.a=a\nthis.b=b},\nbg:function bg(a){this.a=a\nthis.b=null},\nag:function ag(){},\ncs:function cs(){},\nct:function ct(){},\ncT:function cT(){},\ncS:function cS(){},\naJ:function aJ(a,b){this.a=a\nthis.b=b},\nc8:function c8(a){this.a=a},\nbZ:function bZ(a){this.a=a},\ndp:function dp(){},\nN:function N(a){var _=this\n_.a=0\n_.f=_.e=_.d=_.c=_.b=null\n_.r=0\n_.$ti=a},\ncG:function cG(a){this.a=a},\ncJ:function cJ(a,b){this.a=a\nthis.b=b\nthis.c=null},\nO:function O(a,b){this.a=a\nthis.$ti=b},\nbK:function bK(a,b){var _=this\n_.a=a\n_.b=b\n_.d=_.c=null},\ne1:function e1(a){this.a=a},\ne2:function e2(a){this.a=a},\ne3:function e3(a){this.a=a},\nbf:function bf(){},\ncf:function cf(){},\ncE:function cE(a,b){var _=this\n_.a=a\n_.b=b\n_.d=_.c=null},\nce:function ce(a){this.b=a},\nd3:function d3(a,b,c){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=null},\nj0(a){return a},\nhX(a){return new Int8Array(a)},\nhY(a){return new Uint8Array(a)},\nV(a,b,c){if(a>>>0!==a||a>=c)throw A.a(A.eF(b,a))},\niX(a,b,c){var s\nif(!(a>>>0!==a))s=b>>>0!==b||a>b||b>c\nelse s=!0\nif(s)throw A.a(A.jG(a,b,c))\nreturn b},\nbM:function bM(){},\naZ:function aZ(){},\nbN:function bN(){},\naw:function aw(){},\naX:function aX(){},\naY:function aY(){},\nbO:function bO(){},\nbP:function bP(){},\nbQ:function bQ(){},\nbR:function bR(){},\nbS:function bS(){},\nbT:function bT(){},\nbU:function bU(){},\nb_:function b_(){},\nb0:function b0(){},\nbb:function bb(){},\nbc:function bc(){},\nbd:function bd(){},\nbe:function be(){},\nf7(a,b){var s=b.c\nreturn s==null?b.c=A.er(a,b.x,!0):s},\nem(a,b){var s=b.c\nreturn s==null?b.c=A.bj(a,\"a0\",[b.x]):s},\nf8(a){var s=a.w\nif(s===6||s===7||s===8)return A.f8(a.x)\nreturn s===12||s===13},\ni5(a){return a.as},\nbt(a){return A.ck(v.typeUniverse,a,!1)},\naa(a1,a2,a3,a4){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=a2.w\nswitch(a0){case 5:case 1:case 2:case 3:case 4:return a2\ncase 6:s=a2.x\nr=A.aa(a1,s,a3,a4)\nif(r===s)return a2\nreturn A.fs(a1,r,!0)\ncase 7:s=a2.x\nr=A.aa(a1,s,a3,a4)\nif(r===s)return a2\nreturn A.er(a1,r,!0)\ncase 8:s=a2.x\nr=A.aa(a1,s,a3,a4)\nif(r===s)return a2\nreturn A.fq(a1,r,!0)\ncase 9:q=a2.y\np=A.aD(a1,q,a3,a4)\nif(p===q)return a2\nreturn A.bj(a1,a2.x,p)\ncase 10:o=a2.x\nn=A.aa(a1,o,a3,a4)\nm=a2.y\nl=A.aD(a1,m,a3,a4)\nif(n===o&&l===m)return a2\nreturn A.ep(a1,n,l)\ncase 11:k=a2.x\nj=a2.y\ni=A.aD(a1,j,a3,a4)\nif(i===j)return a2\nreturn A.fr(a1,k,i)\ncase 12:h=a2.x\ng=A.aa(a1,h,a3,a4)\nf=a2.y\ne=A.jv(a1,f,a3,a4)\nif(g===h&&e===f)return a2\nreturn A.fp(a1,g,e)\ncase 13:d=a2.y\na4+=d.length\nc=A.aD(a1,d,a3,a4)\no=a2.x\nn=A.aa(a1,o,a3,a4)\nif(c===d&&n===o)return a2\nreturn A.eq(a1,n,c,!0)\ncase 14:b=a2.x\nif(b<a4)return a2\na=a3[b-a4]\nif(a==null)return a2\nreturn a\ndefault:throw A.a(A.by(\"Attempted to substitute unexpected RTI kind \"+a0))}},\naD(a,b,c,d){var s,r,q,p,o=b.length,n=A.dI(o)\nfor(s=!1,r=0;r<o;++r){q=b[r]\np=A.aa(a,q,c,d)\nif(p!==q)s=!0\nn[r]=p}return s?n:b},\njw(a,b,c,d){var s,r,q,p,o,n,m=b.length,l=A.dI(m)\nfor(s=!1,r=0;r<m;r+=3){q=b[r]\np=b[r+1]\no=b[r+2]\nn=A.aa(a,o,c,d)\nif(n!==o)s=!0\nl.splice(r,3,q,p,n)}return s?l:b},\njv(a,b,c,d){var s,r=b.a,q=A.aD(a,r,c,d),p=b.b,o=A.aD(a,p,c,d),n=b.c,m=A.jw(a,n,c,d)\nif(q===r&&o===p&&m===n)return b\ns=new A.cb()\ns.a=q\ns.b=o\ns.c=m\nreturn s},\nh(a,b){a[v.arrayRti]=b\nreturn a},\nh1(a){var s=a.$S\nif(s!=null){if(typeof s==\"number\")return A.jM(s)\nreturn a.$S()}return null},\njS(a,b){var s\nif(A.f8(b))if(a instanceof A.ag){s=A.h1(a)\nif(s!=null)return s}return A.aG(a)},\naG(a){if(a instanceof A.l)return A.E(a)\nif(Array.isArray(a))return A.am(a)\nreturn A.ey(J.X(a))},\nam(a){var s=a[v.arrayRti],r=t.b\nif(s==null)return r\nif(s.constructor!==r.constructor)return r\nreturn s},\nE(a){var s=a.$ti\nreturn s!=null?s:A.ey(a)},\ney(a){var s=a.constructor,r=s.$ccache\nif(r!=null)return r\nreturn A.j9(a,s)},\nj9(a,b){var s=a instanceof A.ag?Object.getPrototypeOf(Object.getPrototypeOf(a)).constructor:b,r=A.iy(v.typeUniverse,s.name)\nb.$ccache=r\nreturn r},\njM(a){var s,r=v.types,q=r[a]\nif(typeof q==\"string\"){s=A.ck(v.typeUniverse,q,!1)\nr[a]=s\nreturn s}return q},\njL(a){return A.an(A.E(a))},\neC(a){var s\nif(a instanceof A.bf)return A.jH(a.$r,a.aB())\ns=a instanceof A.ag?A.h1(a):null\nif(s!=null)return s\nif(t.k.b(a))return J.hw(a).a\nif(Array.isArray(a))return A.am(a)\nreturn A.aG(a)},\nan(a){var s=a.r\nreturn s==null?a.r=A.fL(a):s},\nfL(a){var s,r,q=a.as,p=q.replace(/\\*/g,\"\")\nif(p===q)return a.r=new A.dA(a)\ns=A.ck(v.typeUniverse,p,!0)\nr=s.r\nreturn r==null?s.r=A.fL(s):r},\njH(a,b){var s,r,q=b,p=q.length\nif(p===0)return t.d\ns=A.bl(v.typeUniverse,A.eC(q[0]),\"@<0>\")\nfor(r=1;r<p;++r)s=A.ft(v.typeUniverse,s,A.eC(q[r]))\nreturn A.bl(v.typeUniverse,s,a)},\nK(a){return A.an(A.ck(v.typeUniverse,a,!1))},\nj8(a){var s,r,q,p,o,n,m=this\nif(m===t.K)return A.W(m,a,A.jg)\nif(!A.Y(m))s=m===t._\nelse s=!0\nif(s)return A.W(m,a,A.jk)\ns=m.w\nif(s===7)return A.W(m,a,A.j4)\nif(s===1)return A.W(m,a,A.fQ)\nr=s===6?m.x:m\nq=r.w\nif(q===8)return A.W(m,a,A.jc)\nif(r===t.S)p=A.fP\nelse if(r===t.i||r===t.H)p=A.jf\nelse if(r===t.N)p=A.ji\nelse p=r===t.y?A.ez:null\nif(p!=null)return A.W(m,a,p)\nif(q===9){o=r.x\nif(r.y.every(A.jT)){m.f=\"$i\"+o\nif(o===\"f\")return A.W(m,a,A.je)\nreturn A.W(m,a,A.jj)}}else if(q===11){n=A.jF(r.x,r.y)\nreturn A.W(m,a,n==null?A.fQ:n)}return A.W(m,a,A.j2)},\nW(a,b,c){a.b=c\nreturn a.b(b)},\nj7(a){var s,r=this,q=A.j1\nif(!A.Y(r))s=r===t._\nelse s=!0\nif(s)q=A.iU\nelse if(r===t.K)q=A.iS\nelse{s=A.bu(r)\nif(s)q=A.j3}r.a=q\nreturn r.a(a)},\ncm(a){var s,r=a.w\nif(!A.Y(a))if(!(a===t._))if(!(a===t.A))if(r!==7)if(!(r===6&&A.cm(a.x)))s=r===8&&A.cm(a.x)||a===t.P||a===t.T\nelse s=!0\nelse s=!0\nelse s=!0\nelse s=!0\nelse s=!0\nreturn s},\nj2(a){var s=this\nif(a==null)return A.cm(s)\nreturn A.jU(v.typeUniverse,A.jS(a,s),s)},\nj4(a){if(a==null)return!0\nreturn this.x.b(a)},\njj(a){var s,r=this\nif(a==null)return A.cm(r)\ns=r.f\nif(a instanceof A.l)return!!a[s]\nreturn!!J.X(a)[s]},\nje(a){var s,r=this\nif(a==null)return A.cm(r)\nif(typeof a!=\"object\")return!1\nif(Array.isArray(a))return!0\ns=r.f\nif(a instanceof A.l)return!!a[s]\nreturn!!J.X(a)[s]},\nj1(a){var s=this\nif(a==null){if(A.bu(s))return a}else if(s.b(a))return a\nA.fM(a,s)},\nj3(a){var s=this\nif(a==null)return a\nelse if(s.b(a))return a\nA.fM(a,s)},\nfM(a,b){throw A.a(A.ip(A.fi(a,A.C(b,null))))},\nfi(a,b){return A.at(a)+\": type '\"+A.C(A.eC(a),null)+\"' is not a subtype of type '\"+b+\"'\"},\nip(a){return new A.bh(\"TypeError: \"+a)},\nB(a,b){return new A.bh(\"TypeError: \"+A.fi(a,b))},\njc(a){var s=this,r=s.w===6?s.x:s\nreturn r.x.b(a)||A.em(v.typeUniverse,r).b(a)},\njg(a){return a!=null},\niS(a){if(a!=null)return a\nthrow A.a(A.B(a,\"Object\"))},\njk(a){return!0},\niU(a){return a},\nfQ(a){return!1},\nez(a){return!0===a||!1===a},\nkt(a){if(!0===a)return!0\nif(!1===a)return!1\nthrow A.a(A.B(a,\"bool\"))},\nkv(a){if(!0===a)return!0\nif(!1===a)return!1\nif(a==null)return a\nthrow A.a(A.B(a,\"bool\"))},\nku(a){if(!0===a)return!0\nif(!1===a)return!1\nif(a==null)return a\nthrow A.a(A.B(a,\"bool?\"))},\nkw(a){if(typeof a==\"number\")return a\nthrow A.a(A.B(a,\"double\"))},\nky(a){if(typeof a==\"number\")return a\nif(a==null)return a\nthrow A.a(A.B(a,\"double\"))},\nkx(a){if(typeof a==\"number\")return a\nif(a==null)return a\nthrow A.a(A.B(a,\"double?\"))},\nfP(a){return typeof a==\"number\"&&Math.floor(a)===a},\nfE(a){if(typeof a==\"number\"&&Math.floor(a)===a)return a\nthrow A.a(A.B(a,\"int\"))},\nkz(a){if(typeof a==\"number\"&&Math.floor(a)===a)return a\nif(a==null)return a\nthrow A.a(A.B(a,\"int\"))},\nfF(a){if(typeof a==\"number\"&&Math.floor(a)===a)return a\nif(a==null)return a\nthrow A.a(A.B(a,\"int?\"))},\njf(a){return typeof a==\"number\"},\nkA(a){if(typeof a==\"number\")return a\nthrow A.a(A.B(a,\"num\"))},\nkC(a){if(typeof a==\"number\")return a\nif(a==null)return a\nthrow A.a(A.B(a,\"num\"))},\nkB(a){if(typeof a==\"number\")return a\nif(a==null)return a\nthrow A.a(A.B(a,\"num?\"))},\nji(a){return typeof a==\"string\"},\nfG(a){if(typeof a==\"string\")return a\nthrow A.a(A.B(a,\"String\"))},\nkD(a){if(typeof a==\"string\")return a\nif(a==null)return a\nthrow A.a(A.B(a,\"String\"))},\niT(a){if(typeof a==\"string\")return a\nif(a==null)return a\nthrow A.a(A.B(a,\"String?\"))},\nfU(a,b){var s,r,q\nfor(s=\"\",r=\"\",q=0;q<a.length;++q,r=\", \")s+=r+A.C(a[q],b)\nreturn s},\njp(a,b){var s,r,q,p,o,n,m=a.x,l=a.y\nif(\"\"===m)return\"(\"+A.fU(l,b)+\")\"\ns=l.length\nr=m.split(\",\")\nq=r.length-s\nfor(p=\"(\",o=\"\",n=0;n<s;++n,o=\", \"){p+=o\nif(q===0)p+=\"{\"\np+=A.C(l[n],b)\nif(q>=0)p+=\" \"+r[q];++q}return p+\"})\"},\nfN(a3,a4,a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2=\", \"\nif(a5!=null){s=a5.length\nif(a4==null){a4=A.h([],t.s)\nr=null}else r=a4.length\nq=a4.length\nfor(p=s;p>0;--p)a4.push(\"T\"+(q+p))\nfor(o=t.X,n=t._,m=\"<\",l=\"\",p=0;p<s;++p,l=a2){m=B.a.b6(m+l,a4[a4.length-1-p])\nk=a5[p]\nj=k.w\nif(!(j===2||j===3||j===4||j===5||k===o))i=k===n\nelse i=!0\nif(!i)m+=\" extends \"+A.C(k,a4)}m+=\">\"}else{m=\"\"\nr=null}o=a3.x\nh=a3.y\ng=h.a\nf=g.length\ne=h.b\nd=e.length\nc=h.c\nb=c.length\na=A.C(o,a4)\nfor(a0=\"\",a1=\"\",p=0;p<f;++p,a1=a2)a0+=a1+A.C(g[p],a4)\nif(d>0){a0+=a1+\"[\"\nfor(a1=\"\",p=0;p<d;++p,a1=a2)a0+=a1+A.C(e[p],a4)\na0+=\"]\"}if(b>0){a0+=a1+\"{\"\nfor(a1=\"\",p=0;p<b;p+=3,a1=a2){a0+=a1\nif(c[p+1])a0+=\"required \"\na0+=A.C(c[p+2],a4)+\" \"+c[p]}a0+=\"}\"}if(r!=null){a4.toString\na4.length=r}return m+\"(\"+a0+\") => \"+a},\nC(a,b){var s,r,q,p,o,n,m=a.w\nif(m===5)return\"erased\"\nif(m===2)return\"dynamic\"\nif(m===3)return\"void\"\nif(m===1)return\"Never\"\nif(m===4)return\"any\"\nif(m===6)return A.C(a.x,b)\nif(m===7){s=a.x\nr=A.C(s,b)\nq=s.w\nreturn(q===12||q===13?\"(\"+r+\")\":r)+\"?\"}if(m===8)return\"FutureOr<\"+A.C(a.x,b)+\">\"\nif(m===9){p=A.jx(a.x)\no=a.y\nreturn o.length>0?p+(\"<\"+A.fU(o,b)+\">\"):p}if(m===11)return A.jp(a,b)\nif(m===12)return A.fN(a,b,null)\nif(m===13)return A.fN(a.x,b,a.y)\nif(m===14){n=a.x\nreturn b[b.length-1-n]}return\"?\"},\njx(a){var s=v.mangledGlobalNames[a]\nif(s!=null)return s\nreturn\"minified:\"+a},\niz(a,b){var s=a.tR[b]\nfor(;typeof s==\"string\";)s=a.tR[s]\nreturn s},\niy(a,b){var s,r,q,p,o,n=a.eT,m=n[b]\nif(m==null)return A.ck(a,b,!1)\nelse if(typeof m==\"number\"){s=m\nr=A.bk(a,5,\"#\")\nq=A.dI(s)\nfor(p=0;p<s;++p)q[p]=r\no=A.bj(a,b,q)\nn[b]=o\nreturn o}else return m},\nix(a,b){return A.fC(a.tR,b)},\niw(a,b){return A.fC(a.eT,b)},\nck(a,b,c){var s,r=a.eC,q=r.get(b)\nif(q!=null)return q\ns=A.fn(A.fl(a,null,b,c))\nr.set(b,s)\nreturn s},\nbl(a,b,c){var s,r,q=b.z\nif(q==null)q=b.z=new Map()\ns=q.get(c)\nif(s!=null)return s\nr=A.fn(A.fl(a,b,c,!0))\nq.set(c,r)\nreturn r},\nft(a,b,c){var s,r,q,p=b.Q\nif(p==null)p=b.Q=new Map()\ns=c.as\nr=p.get(s)\nif(r!=null)return r\nq=A.ep(a,b,c.w===10?c.y:[c])\np.set(s,q)\nreturn q},\nU(a,b){b.a=A.j7\nb.b=A.j8\nreturn b},\nbk(a,b,c){var s,r,q=a.eC.get(c)\nif(q!=null)return q\ns=new A.I(null,null)\ns.w=b\ns.as=c\nr=A.U(a,s)\na.eC.set(c,r)\nreturn r},\nfs(a,b,c){var s,r=b.as+\"*\",q=a.eC.get(r)\nif(q!=null)return q\ns=A.iu(a,b,r,c)\na.eC.set(r,s)\nreturn s},\niu(a,b,c,d){var s,r,q\nif(d){s=b.w\nif(!A.Y(b))r=b===t.P||b===t.T||s===7||s===6\nelse r=!0\nif(r)return b}q=new A.I(null,null)\nq.w=6\nq.x=b\nq.as=c\nreturn A.U(a,q)},\ner(a,b,c){var s,r=b.as+\"?\",q=a.eC.get(r)\nif(q!=null)return q\ns=A.it(a,b,r,c)\na.eC.set(r,s)\nreturn s},\nit(a,b,c,d){var s,r,q,p\nif(d){s=b.w\nif(!A.Y(b))if(!(b===t.P||b===t.T))if(s!==7)r=s===8&&A.bu(b.x)\nelse r=!0\nelse r=!0\nelse r=!0\nif(r)return b\nelse if(s===1||b===t.A)return t.P\nelse if(s===6){q=b.x\nif(q.w===8&&A.bu(q.x))return q\nelse return A.f7(a,b)}}p=new A.I(null,null)\np.w=7\np.x=b\np.as=c\nreturn A.U(a,p)},\nfq(a,b,c){var s,r=b.as+\"/\",q=a.eC.get(r)\nif(q!=null)return q\ns=A.ir(a,b,r,c)\na.eC.set(r,s)\nreturn s},\nir(a,b,c,d){var s,r\nif(d){s=b.w\nif(A.Y(b)||b===t.K||b===t._)return b\nelse if(s===1)return A.bj(a,\"a0\",[b])\nelse if(b===t.P||b===t.T)return t.W}r=new A.I(null,null)\nr.w=8\nr.x=b\nr.as=c\nreturn A.U(a,r)},\niv(a,b){var s,r,q=\"\"+b+\"^\",p=a.eC.get(q)\nif(p!=null)return p\ns=new A.I(null,null)\ns.w=14\ns.x=b\ns.as=q\nr=A.U(a,s)\na.eC.set(q,r)\nreturn r},\nbi(a){var s,r,q,p=a.length\nfor(s=\"\",r=\"\",q=0;q<p;++q,r=\",\")s+=r+a[q].as\nreturn s},\niq(a){var s,r,q,p,o,n=a.length\nfor(s=\"\",r=\"\",q=0;q<n;q+=3,r=\",\"){p=a[q]\no=a[q+1]?\"!\":\":\"\ns+=r+p+o+a[q+2].as}return s},\nbj(a,b,c){var s,r,q,p=b\nif(c.length>0)p+=\"<\"+A.bi(c)+\">\"\ns=a.eC.get(p)\nif(s!=null)return s\nr=new A.I(null,null)\nr.w=9\nr.x=b\nr.y=c\nif(c.length>0)r.c=c[0]\nr.as=p\nq=A.U(a,r)\na.eC.set(p,q)\nreturn q},\nep(a,b,c){var s,r,q,p,o,n\nif(b.w===10){s=b.x\nr=b.y.concat(c)}else{r=c\ns=b}q=s.as+(\";<\"+A.bi(r)+\">\")\np=a.eC.get(q)\nif(p!=null)return p\no=new A.I(null,null)\no.w=10\no.x=s\no.y=r\no.as=q\nn=A.U(a,o)\na.eC.set(q,n)\nreturn n},\nfr(a,b,c){var s,r,q=\"+\"+(b+\"(\"+A.bi(c)+\")\"),p=a.eC.get(q)\nif(p!=null)return p\ns=new A.I(null,null)\ns.w=11\ns.x=b\ns.y=c\ns.as=q\nr=A.U(a,s)\na.eC.set(q,r)\nreturn r},\nfp(a,b,c){var s,r,q,p,o,n=b.as,m=c.a,l=m.length,k=c.b,j=k.length,i=c.c,h=i.length,g=\"(\"+A.bi(m)\nif(j>0){s=l>0?\",\":\"\"\ng+=s+\"[\"+A.bi(k)+\"]\"}if(h>0){s=l>0?\",\":\"\"\ng+=s+\"{\"+A.iq(i)+\"}\"}r=n+(g+\")\")\nq=a.eC.get(r)\nif(q!=null)return q\np=new A.I(null,null)\np.w=12\np.x=b\np.y=c\np.as=r\no=A.U(a,p)\na.eC.set(r,o)\nreturn o},\neq(a,b,c,d){var s,r=b.as+(\"<\"+A.bi(c)+\">\"),q=a.eC.get(r)\nif(q!=null)return q\ns=A.is(a,b,c,r,d)\na.eC.set(r,s)\nreturn s},\nis(a,b,c,d,e){var s,r,q,p,o,n,m,l\nif(e){s=c.length\nr=A.dI(s)\nfor(q=0,p=0;p<s;++p){o=c[p]\nif(o.w===1){r[p]=o;++q}}if(q>0){n=A.aa(a,b,r,0)\nm=A.aD(a,c,r,0)\nreturn A.eq(a,n,m,c!==m)}}l=new A.I(null,null)\nl.w=13\nl.x=b\nl.y=c\nl.as=d\nreturn A.U(a,l)},\nfl(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}},\nfn(a){var s,r,q,p,o,n,m,l=a.r,k=a.s\nfor(s=l.length,r=0;r<s;){q=l.charCodeAt(r)\nif(q>=48&&q<=57)r=A.ii(r+1,q,l,k)\nelse if((((q|32)>>>0)-97&65535)<26||q===95||q===36||q===124)r=A.fm(a,r,l,k,!1)\nelse if(q===46)r=A.fm(a,r,l,k,!0)\nelse{++r\nswitch(q){case 44:break\ncase 58:k.push(!1)\nbreak\ncase 33:k.push(!0)\nbreak\ncase 59:k.push(A.a9(a.u,a.e,k.pop()))\nbreak\ncase 94:k.push(A.iv(a.u,k.pop()))\nbreak\ncase 35:k.push(A.bk(a.u,5,\"#\"))\nbreak\ncase 64:k.push(A.bk(a.u,2,\"@\"))\nbreak\ncase 126:k.push(A.bk(a.u,3,\"~\"))\nbreak\ncase 60:k.push(a.p)\na.p=k.length\nbreak\ncase 62:A.ik(a,k)\nbreak\ncase 38:A.ij(a,k)\nbreak\ncase 42:p=a.u\nk.push(A.fs(p,A.a9(p,a.e,k.pop()),a.n))\nbreak\ncase 63:p=a.u\nk.push(A.er(p,A.a9(p,a.e,k.pop()),a.n))\nbreak\ncase 47:p=a.u\nk.push(A.fq(p,A.a9(p,a.e,k.pop()),a.n))\nbreak\ncase 40:k.push(-3)\nk.push(a.p)\na.p=k.length\nbreak\ncase 41:A.ih(a,k)\nbreak\ncase 91:k.push(a.p)\na.p=k.length\nbreak\ncase 93:o=k.splice(a.p)\nA.fo(a.u,a.e,o)\na.p=k.pop()\nk.push(o)\nk.push(-1)\nbreak\ncase 123:k.push(a.p)\na.p=k.length\nbreak\ncase 125:o=k.splice(a.p)\nA.im(a.u,a.e,o)\na.p=k.pop()\nk.push(o)\nk.push(-2)\nbreak\ncase 43:n=l.indexOf(\"(\",r)\nk.push(l.substring(r,n))\nk.push(-4)\nk.push(a.p)\na.p=k.length\nr=n+1\nbreak\ndefault:throw\"Bad character \"+q}}}m=k.pop()\nreturn A.a9(a.u,a.e,m)},\nii(a,b,c,d){var s,r,q=b-48\nfor(s=c.length;a<s;++a){r=c.charCodeAt(a)\nif(!(r>=48&&r<=57))break\nq=q*10+(r-48)}d.push(q)\nreturn a},\nfm(a,b,c,d,e){var s,r,q,p,o,n,m=b+1\nfor(s=c.length;m<s;++m){r=c.charCodeAt(m)\nif(r===46){if(e)break\ne=!0}else{if(!((((r|32)>>>0)-97&65535)<26||r===95||r===36||r===124))q=r>=48&&r<=57\nelse q=!0\nif(!q)break}}p=c.substring(b,m)\nif(e){s=a.u\no=a.e\nif(o.w===10)o=o.x\nn=A.iz(s,o.x)[p]\nif(n==null)A.aH('No \"'+p+'\" in \"'+A.i5(o)+'\"')\nd.push(A.bl(s,o,n))}else d.push(p)\nreturn m},\nik(a,b){var s,r=a.u,q=A.fk(a,b),p=b.pop()\nif(typeof p==\"string\")b.push(A.bj(r,p,q))\nelse{s=A.a9(r,a.e,p)\nswitch(s.w){case 12:b.push(A.eq(r,s,q,a.n))\nbreak\ndefault:b.push(A.ep(r,s,q))\nbreak}}},\nih(a,b){var s,r,q,p,o,n=null,m=a.u,l=b.pop()\nif(typeof l==\"number\")switch(l){case-1:s=b.pop()\nr=n\nbreak\ncase-2:r=b.pop()\ns=n\nbreak\ndefault:b.push(l)\nr=n\ns=r\nbreak}else{b.push(l)\nr=n\ns=r}q=A.fk(a,b)\nl=b.pop()\nswitch(l){case-3:l=b.pop()\nif(s==null)s=m.sEA\nif(r==null)r=m.sEA\np=A.a9(m,a.e,l)\no=new A.cb()\no.a=q\no.b=s\no.c=r\nb.push(A.fp(m,p,o))\nreturn\ncase-4:b.push(A.fr(m,b.pop(),q))\nreturn\ndefault:throw A.a(A.by(\"Unexpected state under `()`: \"+A.i(l)))}},\nij(a,b){var s=b.pop()\nif(0===s){b.push(A.bk(a.u,1,\"0&\"))\nreturn}if(1===s){b.push(A.bk(a.u,4,\"1&\"))\nreturn}throw A.a(A.by(\"Unexpected extended operation \"+A.i(s)))},\nfk(a,b){var s=b.splice(a.p)\nA.fo(a.u,a.e,s)\na.p=b.pop()\nreturn s},\na9(a,b,c){if(typeof c==\"string\")return A.bj(a,c,a.sEA)\nelse if(typeof c==\"number\"){b.toString\nreturn A.il(a,b,c)}else return c},\nfo(a,b,c){var s,r=c.length\nfor(s=0;s<r;++s)c[s]=A.a9(a,b,c[s])},\nim(a,b,c){var s,r=c.length\nfor(s=2;s<r;s+=3)c[s]=A.a9(a,b,c[s])},\nil(a,b,c){var s,r,q=b.w\nif(q===10){if(c===0)return b.x\ns=b.y\nr=s.length\nif(c<=r)return s[c-1]\nc-=r\nb=b.x\nq=b.w}else if(c===0)return b\nif(q!==9)throw A.a(A.by(\"Indexed base must be an interface type\"))\ns=b.y\nif(c<=s.length)return s[c-1]\nthrow A.a(A.by(\"Bad index \"+c+\" for \"+b.h(0)))},\njU(a,b,c){var s,r=b.d\nif(r==null)r=b.d=new Map()\ns=r.get(c)\nif(s==null){s=A.q(a,b,null,c,null,!1)?1:0\nr.set(c,s)}if(0===s)return!1\nif(1===s)return!0\nreturn!0},\nq(a,b,c,d,e,f){var s,r,q,p,o,n,m,l,k,j,i\nif(b===d)return!0\nif(!A.Y(d))s=d===t._\nelse s=!0\nif(s)return!0\nr=b.w\nif(r===4)return!0\nif(A.Y(b))return!1\ns=b.w\nif(s===1)return!0\nq=r===14\nif(q)if(A.q(a,c[b.x],c,d,e,!1))return!0\np=d.w\ns=b===t.P||b===t.T\nif(s){if(p===8)return A.q(a,b,c,d.x,e,!1)\nreturn d===t.P||d===t.T||p===7||p===6}if(d===t.K){if(r===8)return A.q(a,b.x,c,d,e,!1)\nif(r===6)return A.q(a,b.x,c,d,e,!1)\nreturn r!==7}if(r===6)return A.q(a,b.x,c,d,e,!1)\nif(p===6){s=A.f7(a,d)\nreturn A.q(a,b,c,s,e,!1)}if(r===8){if(!A.q(a,b.x,c,d,e,!1))return!1\nreturn A.q(a,A.em(a,b),c,d,e,!1)}if(r===7){s=A.q(a,t.P,c,d,e,!1)\nreturn s&&A.q(a,b.x,c,d,e,!1)}if(p===8){if(A.q(a,b,c,d.x,e,!1))return!0\nreturn A.q(a,b,c,A.em(a,d),e,!1)}if(p===7){s=A.q(a,b,c,t.P,e,!1)\nreturn s||A.q(a,b,c,d.x,e,!1)}if(q)return!1\ns=r!==12\nif((!s||r===13)&&d===t.Y)return!0\no=r===11\nif(o&&d===t.L)return!0\nif(p===13){if(b===t.g)return!0\nif(r!==13)return!1\nn=b.y\nm=d.y\nl=n.length\nif(l!==m.length)return!1\nc=c==null?n:n.concat(c)\ne=e==null?m:m.concat(e)\nfor(k=0;k<l;++k){j=n[k]\ni=m[k]\nif(!A.q(a,j,c,i,e,!1)||!A.q(a,i,e,j,c,!1))return!1}return A.fO(a,b.x,c,d.x,e,!1)}if(p===12){if(b===t.g)return!0\nif(s)return!1\nreturn A.fO(a,b,c,d,e,!1)}if(r===9){if(p!==9)return!1\nreturn A.jd(a,b,c,d,e,!1)}if(o&&p===11)return A.jh(a,b,c,d,e,!1)\nreturn!1},\nfO(a3,a4,a5,a6,a7,a8){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2\nif(!A.q(a3,a4.x,a5,a6.x,a7,!1))return!1\ns=a4.y\nr=a6.y\nq=s.a\np=r.a\no=q.length\nn=p.length\nif(o>n)return!1\nm=n-o\nl=s.b\nk=r.b\nj=l.length\ni=k.length\nif(o+j<n+i)return!1\nfor(h=0;h<o;++h){g=q[h]\nif(!A.q(a3,p[h],a7,g,a5,!1))return!1}for(h=0;h<m;++h){g=l[h]\nif(!A.q(a3,p[o+h],a7,g,a5,!1))return!1}for(h=0;h<i;++h){g=l[m+h]\nif(!A.q(a3,k[h],a7,g,a5,!1))return!1}f=s.c\ne=r.c\nd=f.length\nc=e.length\nfor(b=0,a=0;a<c;a+=3){a0=e[a]\nfor(;!0;){if(b>=d)return!1\na1=f[b]\nb+=3\nif(a0<a1)return!1\na2=f[b-2]\nif(a1<a0){if(a2)return!1\ncontinue}g=e[a+1]\nif(a2&&!g)return!1\ng=f[b-1]\nif(!A.q(a3,e[a+2],a7,g,a5,!1))return!1\nbreak}}for(;b<d;){if(f[b+1])return!1\nb+=3}return!0},\njd(a,b,c,d,e,f){var s,r,q,p,o,n=b.x,m=d.x\nfor(;n!==m;){s=a.tR[n]\nif(s==null)return!1\nif(typeof s==\"string\"){n=s\ncontinue}r=s[m]\nif(r==null)return!1\nq=r.length\np=q>0?new Array(q):v.typeUniverse.sEA\nfor(o=0;o<q;++o)p[o]=A.bl(a,b,r[o])\nreturn A.fD(a,p,null,c,d.y,e,!1)}return A.fD(a,b.y,null,c,d.y,e,!1)},\nfD(a,b,c,d,e,f,g){var s,r=b.length\nfor(s=0;s<r;++s)if(!A.q(a,b[s],d,e[s],f,!1))return!1\nreturn!0},\njh(a,b,c,d,e,f){var s,r=b.y,q=d.y,p=r.length\nif(p!==q.length)return!1\nif(b.x!==d.x)return!1\nfor(s=0;s<p;++s)if(!A.q(a,r[s],c,q[s],e,!1))return!1\nreturn!0},\nbu(a){var s,r=a.w\nif(!(a===t.P||a===t.T))if(!A.Y(a))if(r!==7)if(!(r===6&&A.bu(a.x)))s=r===8&&A.bu(a.x)\nelse s=!0\nelse s=!0\nelse s=!0\nelse s=!0\nreturn s},\njT(a){var s\nif(!A.Y(a))s=a===t._\nelse s=!0\nreturn s},\nY(a){var s=a.w\nreturn s===2||s===3||s===4||s===5||a===t.X},\nfC(a,b){var s,r,q=Object.keys(b),p=q.length\nfor(s=0;s<p;++s){r=q[s]\na[r]=b[r]}},\ndI(a){return a>0?new Array(a):v.typeUniverse.sEA},\nI:function I(a,b){var _=this\n_.a=a\n_.b=b\n_.r=_.f=_.d=_.c=null\n_.w=0\n_.as=_.Q=_.z=_.y=_.x=null},\ncb:function cb(){this.c=this.b=this.a=null},\ndA:function dA(a){this.a=a},\nca:function ca(){},\nbh:function bh(a){this.a=a},\nib(){var s,r,q={}\nif(self.scheduleImmediate!=null)return A.jA()\nif(self.MutationObserver!=null&&self.document!=null){s=self.document.createElement(\"div\")\nr=self.document.createElement(\"span\")\nq.a=null\nnew self.MutationObserver(A.aF(new A.d5(q),1)).observe(s,{childList:true})\nreturn new A.d4(q,s,r)}else if(self.setImmediate!=null)return A.jB()\nreturn A.jC()},\nic(a){self.scheduleImmediate(A.aF(new A.d6(a),0))},\nid(a){self.setImmediate(A.aF(new A.d7(a),0))},\nie(a){A.io(0,a)},\nio(a,b){var s=new A.dy()\ns.bf(a,b)\nreturn s},\nfS(a){return new A.c5(new A.v($.r,a.i(\"v<0>\")),a.i(\"c5<0>\"))},\nfK(a,b){a.$2(0,null)\nb.b=!0\nreturn b.a},\nfH(a,b){A.iV(a,b)},\nfJ(a,b){b.ae(a)},\nfI(a,b){b.af(A.ae(a),A.ac(a))},\niV(a,b){var s,r,q=new A.dK(b),p=new A.dL(b)\nif(a instanceof A.v)a.aG(q,p,t.z)\nelse{s=t.z\nif(a instanceof A.v)a.au(q,p,s)\nelse{r=new A.v($.r,t.e)\nr.a=8\nr.c=a\nr.aG(q,p,s)}}},\nfZ(a){var s=function(b,c){return function(d,e){while(true){try{b(d,e)\nbreak}catch(r){e=r\nd=c}}}}(a,1)\nreturn $.r.b1(new A.dY(s))},\ncp(a,b){var s=A.cn(a,\"error\",t.K)\nreturn new A.bz(s,b==null?A.eN(a):b)},\neN(a){var s\nif(t.Q.b(a)){s=a.gR()\nif(s!=null)return s}return B.H},\nfj(a,b){var s,r\nfor(;s=a.a,(s&4)!==0;)a=a.c\nif(a===b){b.S(new A.G(!0,a,null,\"Cannot complete a future with itself\"),A.f9())\nreturn}s|=b.a&1\na.a=s\nif((s&24)!==0){r=b.ab()\nb.T(a)\nA.ba(b,r)}else{r=b.c\nb.aE(a)\na.aa(r)}},\nig(a,b){var s,r,q={},p=q.a=a\nfor(;s=p.a,(s&4)!==0;){p=p.c\nq.a=p}if(p===b){b.S(new A.G(!0,p,null,\"Cannot complete a future with itself\"),A.f9())\nreturn}if((s&24)===0){r=b.c\nb.aE(p)\nq.a.aa(r)\nreturn}if((s&16)===0&&b.c==null){b.T(p)\nreturn}b.a^=2\nA.aC(null,null,b.b,new A.dd(q,b))},\nba(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g={},f=g.a=a\nfor(;!0;){s={}\nr=f.a\nq=(r&16)===0\np=!q\nif(b==null){if(p&&(r&1)===0){f=f.c\nA.eB(f.a,f.b)}return}s.a=b\no=b.a\nfor(f=b;o!=null;f=o,o=n){f.a=null\nA.ba(g.a,f)\ns.a=o\nn=o.a}r=g.a\nm=r.c\ns.b=p\ns.c=m\nif(q){l=f.c\nl=(l&1)!==0||(l&15)===8}else l=!0\nif(l){k=f.b.b\nif(p){r=r.b===k\nr=!(r||r)}else r=!1\nif(r){A.eB(m.a,m.b)\nreturn}j=$.r\nif(j!==k)$.r=k\nelse j=null\nf=f.c\nif((f&15)===8)new A.dk(s,g,p).$0()\nelse if(q){if((f&1)!==0)new A.dj(s,m).$0()}else if((f&2)!==0)new A.di(g,s).$0()\nif(j!=null)$.r=j\nf=s.c\nif(f instanceof A.v){r=s.a.$ti\nr=r.i(\"a0<2>\").b(f)||!r.y[1].b(f)}else r=!1\nif(r){i=s.a.b\nif((f.a&24)!==0){h=i.c\ni.c=null\nb=i.U(h)\ni.a=f.a&30|i.a&1\ni.c=f.c\ng.a=f\ncontinue}else A.fj(f,i)\nreturn}}i=s.a.b\nh=i.c\ni.c=null\nb=i.U(h)\nf=s.b\nr=s.c\nif(!f){i.a=8\ni.c=r}else{i.a=i.a&1|16\ni.c=r}g.a=i\nf=i}},\njq(a,b){if(t.C.b(a))return b.b1(a)\nif(t.v.b(a))return a\nthrow A.a(A.eM(a,\"onError\",u.c))},\njn(){var s,r\nfor(s=$.aB;s!=null;s=$.aB){$.bs=null\nr=s.b\n$.aB=r\nif(r==null)$.br=null\ns.a.$0()}},\nju(){$.eA=!0\ntry{A.jn()}finally{$.bs=null\n$.eA=!1\nif($.aB!=null)$.eL().$1(A.h0())}},\nfW(a){var s=new A.c6(a),r=$.br\nif(r==null){$.aB=$.br=s\nif(!$.eA)$.eL().$1(A.h0())}else $.br=r.b=s},\njt(a){var s,r,q,p=$.aB\nif(p==null){A.fW(a)\n$.bs=$.br\nreturn}s=new A.c6(a)\nr=$.bs\nif(r==null){s.b=p\n$.aB=$.bs=s}else{q=r.b\ns.b=q\n$.bs=r.b=s\nif(q==null)$.br=s}},\nk0(a){var s=null,r=$.r\nif(B.d===r){A.aC(s,s,B.d,a)\nreturn}A.aC(s,s,r,r.aJ(a))},\nkb(a){A.cn(a,\"stream\",t.K)\nreturn new A.ci()},\neB(a,b){A.jt(new A.dW(a,b))},\nfT(a,b,c,d){var s,r=$.r\nif(r===c)return d.$0()\n$.r=c\ns=r\ntry{r=d.$0()\nreturn r}finally{$.r=s}},\njs(a,b,c,d,e){var s,r=$.r\nif(r===c)return d.$1(e)\n$.r=c\ns=r\ntry{r=d.$1(e)\nreturn r}finally{$.r=s}},\njr(a,b,c,d,e,f){var s,r=$.r\nif(r===c)return d.$2(e,f)\n$.r=c\ns=r\ntry{r=d.$2(e,f)\nreturn r}finally{$.r=s}},\naC(a,b,c,d){if(B.d!==c)d=c.aJ(d)\nA.fW(d)},\nd5:function d5(a){this.a=a},\nd4:function d4(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\nd6:function d6(a){this.a=a},\nd7:function d7(a){this.a=a},\ndy:function dy(){},\ndz:function dz(a,b){this.a=a\nthis.b=b},\nc5:function c5(a,b){this.a=a\nthis.b=!1\nthis.$ti=b},\ndK:function dK(a){this.a=a},\ndL:function dL(a){this.a=a},\ndY:function dY(a){this.a=a},\nbz:function bz(a,b){this.a=a\nthis.b=b},\nc7:function c7(){},\nb7:function b7(a,b){this.a=a\nthis.$ti=b},\naz:function az(a,b,c,d,e){var _=this\n_.a=null\n_.b=a\n_.c=b\n_.d=c\n_.e=d\n_.$ti=e},\nv:function v(a,b){var _=this\n_.a=0\n_.b=a\n_.c=null\n_.$ti=b},\nda:function da(a,b){this.a=a\nthis.b=b},\ndh:function dh(a,b){this.a=a\nthis.b=b},\nde:function de(a){this.a=a},\ndf:function df(a){this.a=a},\ndg:function dg(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\ndd:function dd(a,b){this.a=a\nthis.b=b},\ndc:function dc(a,b){this.a=a\nthis.b=b},\ndb:function db(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\ndk:function dk(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\ndl:function dl(a){this.a=a},\ndj:function dj(a,b){this.a=a\nthis.b=b},\ndi:function di(a,b){this.a=a\nthis.b=b},\nc6:function c6(a){this.a=a\nthis.b=null},\nci:function ci(){},\ndJ:function dJ(){},\ndW:function dW(a,b){this.a=a\nthis.b=b},\ndq:function dq(){},\ndr:function dr(a,b){this.a=a\nthis.b=b},\nf_(a,b,c){return A.jI(a,new A.N(b.i(\"@<0>\").A(c).i(\"N<1,2>\")))},\nej(a,b){return new A.N(a.i(\"@<0>\").A(b).i(\"N<1,2>\"))},\nek(a){var s,r={}\nif(A.eI(a))return\"{...}\"\ns=new A.y(\"\")\ntry{$.ap.push(a)\ns.a+=\"{\"\nr.a=!0\na.C(0,new A.cK(r,s))\ns.a+=\"}\"}finally{$.ap.pop()}r=s.a\nreturn r.charCodeAt(0)==0?r:r},\ne:function e(){},\nP:function P(){},\ncK:function cK(a,b){this.a=a\nthis.b=b},\ncl:function cl(){},\naW:function aW(){},\na7:function a7(a,b){this.a=a\nthis.$ti=b},\nbm:function bm(){},\njo(a,b){var s,r,q,p=null\ntry{p=JSON.parse(a)}catch(r){s=A.ae(r)\nq=A.z(String(s),null,null)\nthrow A.a(q)}q=A.dM(p)\nreturn q},\ndM(a){var s\nif(a==null)return null\nif(typeof a!=\"object\")return a\nif(!Array.isArray(a))return new A.cc(a,Object.create(null))\nfor(s=0;s<a.length;++s)a[s]=A.dM(a[s])\nreturn a},\niQ(a,b,c){var s,r,q,p,o=c-b\nif(o<=4096)s=$.hp()\nelse s=new Uint8Array(o)\nfor(r=J.ao(a),q=0;q<o;++q){p=r.k(a,b+q)\nif((p&255)!==p)p=255\ns[q]=p}return s},\niP(a,b,c,d){var s=a?$.ho():$.hn()\nif(s==null)return null\nif(0===c&&d===b.length)return A.fB(s,b)\nreturn A.fB(s,b.subarray(c,d))},\nfB(a,b){var s,r\ntry{s=a.decode(b)\nreturn s}catch(r){}return null},\neO(a,b,c,d,e,f){if(B.c.a1(f,4)!==0)throw A.a(A.z(\"Invalid base64 padding, padded length must be multiple of four, is \"+f,a,c))\nif(d+e!==f)throw A.a(A.z(\"Invalid base64 padding, '=' not at the end\",a,b))\nif(e>2)throw A.a(A.z(\"Invalid base64 padding, more than two '=' characters\",a,b))},\niR(a){switch(a){case 65:return\"Missing extension byte\"\ncase 67:return\"Unexpected extension byte\"\ncase 69:return\"Invalid UTF-8 byte\"\ncase 71:return\"Overlong encoding\"\ncase 73:return\"Out of unicode range\"\ncase 75:return\"Encoded surrogate\"\ncase 77:return\"Unfinished UTF-8 octet sequence\"\ndefault:return\"\"}},\ncc:function cc(a,b){this.a=a\nthis.b=b\nthis.c=null},\ncd:function cd(a){this.a=a},\ndG:function dG(){},\ndF:function dF(){},\ncq:function cq(){},\ncr:function cr(){},\nbC:function bC(){},\nbE:function bE(){},\ncv:function cv(){},\ncy:function cy(){},\ncx:function cx(){},\ncH:function cH(){},\ncI:function cI(a){this.a=a},\nd0:function d0(){},\nd2:function d2(){},\ndH:function dH(a){this.b=0\nthis.c=a},\nd1:function d1(a){this.a=a},\ndE:function dE(a){this.a=a\nthis.b=16\nthis.c=0},\ne8(a,b){var s=A.f3(a,b)\nif(s!=null)return s\nthrow A.a(A.z(a,null,null))},\nhH(a,b){a=A.a(a)\na.stack=b.h(0)\nthrow a\nthrow A.a(\"unreachable\")},\nf0(a,b,c,d){var s,r=c?J.hR(a,d):J.hQ(a,d)\nif(a!==0&&b!=null)for(s=0;s<r.length;++s)r[s]=b\nreturn r},\nhV(a,b,c){var s,r=A.h([],c.i(\"o<0>\"))\nfor(s=J.L(a);s.m();)r.push(s.gp())\nif(b)return r\nreturn J.eg(r)},\nbL(a,b,c){var s=A.hU(a,c)\nreturn s},\nhU(a,b){var s,r\nif(Array.isArray(a))return A.h(a.slice(0),b.i(\"o<0>\"))\ns=A.h([],b.i(\"o<0>\"))\nfor(r=J.L(a);r.m();)s.push(r.gp())\nreturn s},\nfc(a,b,c){var s,r\nA.f5(b,\"start\")\nif(c!=null){s=c-b\nif(s<0)throw A.a(A.H(c,b,null,\"end\",null))\nif(s===0)return\"\"}r=A.i6(a,b,c)\nreturn r},\ni6(a,b,c){var s=a.length\nif(b>=s)return\"\"\nreturn A.i3(a,b,c==null||c>s?s:c)},\nf6(a,b){return new A.cE(a,A.eZ(a,!1,b,!1,!1,!1))},\nfb(a,b,c){var s=J.L(b)\nif(!s.m())return a\nif(c.length===0){do a+=A.i(s.gp())\nwhile(s.m())}else{a+=A.i(s.gp())\nfor(;s.m();)a=a+c+A.i(s.gp())}return a},\nf1(a,b){return new A.bV(a,b.gbN(),b.gbQ(),b.gbO())},\nfA(a,b,c,d){var s,r,q,p,o,n=\"0123456789ABCDEF\"\nif(c===B.e){s=$.hl()\ns=s.b.test(b)}else s=!1\nif(s)return b\nr=B.G.I(b)\nfor(s=r.length,q=0,p=\"\";q<s;++q){o=r[q]\nif(o<128&&(a[o>>>4]&1<<(o&15))!==0)p+=A.Q(o)\nelse p=d&&o===32?p+\"+\":p+\"%\"+n[o>>>4&15]+n[o&15]}return p.charCodeAt(0)==0?p:p},\niH(a){var s,r,q\nif(!$.hm())return A.iI(a)\ns=new URLSearchParams()\na.C(0,new A.dD(s))\nr=s.toString()\nq=r.length\nif(q>0&&r[q-1]===\"=\")r=B.a.j(r,0,q-1)\nreturn r.replace(/=&|\\*|%7E/g,b=>b===\"=&\"?\"&\":b===\"*\"?\"%2A\":\"~\")},\nf9(){return A.ac(new Error())},\nat(a){if(typeof a==\"number\"||A.ez(a)||a==null)return J.aq(a)\nif(typeof a==\"string\")return JSON.stringify(a)\nreturn A.f4(a)},\nhI(a,b){A.cn(a,\"error\",t.K)\nA.cn(b,\"stackTrace\",t.l)\nA.hH(a,b)},\nby(a){return new A.bx(a)},\na_(a,b){return new A.G(!1,null,b,a)},\neM(a,b,c){return new A.G(!0,a,b,c)},\ni4(a,b){return new A.b2(null,null,!0,a,b,\"Value not in range\")},\nH(a,b,c,d,e){return new A.b2(b,c,!0,a,d,\"Invalid value\")},\nb3(a,b,c){if(0>a||a>c)throw A.a(A.H(a,0,c,\"start\",null))\nif(b!=null){if(a>b||b>c)throw A.a(A.H(b,a,c,\"end\",null))\nreturn b}return c},\nf5(a,b){if(a<0)throw A.a(A.H(a,0,null,b,null))\nreturn a},\neU(a,b,c,d){return new A.bF(b,!0,a,d,\"Index out of range\")},\nT(a){return new A.c2(a)},\nfe(a){return new A.c_(a)},\nfa(a){return new A.b5(a)},\nas(a){return new A.bD(a)},\nz(a,b,c){return new A.cw(a,b,c)},\nhP(a,b,c){var s,r\nif(A.eI(a)){if(b===\"(\"&&c===\")\")return\"(...)\"\nreturn b+\"...\"+c}s=A.h([],t.s)\n$.ap.push(a)\ntry{A.jl(a,s)}finally{$.ap.pop()}r=A.fb(b,s,\", \")+c\nreturn r.charCodeAt(0)==0?r:r},\neW(a,b,c){var s,r\nif(A.eI(a))return b+\"...\"+c\ns=new A.y(b)\n$.ap.push(a)\ntry{r=s\nr.a=A.fb(r.a,a,\", \")}finally{$.ap.pop()}s.a+=c\nr=s.a\nreturn r.charCodeAt(0)==0?r:r},\njl(a,b){var s,r,q,p,o,n,m,l=a.gB(a),k=0,j=0\nwhile(!0){if(!(k<80||j<3))break\nif(!l.m())return\ns=A.i(l.gp())\nb.push(s)\nk+=s.length+2;++j}if(!l.m()){if(j<=5)return\nr=b.pop()\nq=b.pop()}else{p=l.gp();++j\nif(!l.m()){if(j<=4){b.push(A.i(p))\nreturn}r=A.i(p)\nq=b.pop()\nk+=r.length+2}else{o=l.gp();++j\nfor(;l.m();p=o,o=n){n=l.gp();++j\nif(j>100){while(!0){if(!(k>75&&j>3))break\nk-=b.pop().length+2;--j}b.push(\"...\")\nreturn}}q=A.i(p)\nr=A.i(o)\nk+=r.length+q.length+4}}if(j>b.length+2){k+=5\nm=\"...\"}else m=null\nwhile(!0){if(!(k>80&&b.length>3))break\nk-=b.pop().length+2\nif(m==null){k+=5\nm=\"...\"}}if(m!=null)b.push(m)\nb.push(q)\nb.push(r)},\nhZ(a,b,c,d){var s\nif(B.i===c){s=B.c.gn(a)\nb=J.Z(b)\nreturn A.en(A.a6(A.a6($.ee(),s),b))}if(B.i===d){s=B.c.gn(a)\nb=J.Z(b)\nc=J.Z(c)\nreturn A.en(A.a6(A.a6(A.a6($.ee(),s),b),c))}s=B.c.gn(a)\nb=J.Z(b)\nc=J.Z(c)\nd=J.Z(d)\nd=A.en(A.a6(A.a6(A.a6(A.a6($.ee(),s),b),c),d))\nreturn d},\nc4(a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3=null,a4=a5.length\nif(a4>=5){s=((a5.charCodeAt(4)^58)*3|a5.charCodeAt(0)^100|a5.charCodeAt(1)^97|a5.charCodeAt(2)^116|a5.charCodeAt(3)^97)>>>0\nif(s===0)return A.ff(a4<a4?B.a.j(a5,0,a4):a5,5,a3).gb3()\nelse if(s===32)return A.ff(B.a.j(a5,5,a4),0,a3).gb3()}r=A.f0(8,0,!1,t.S)\nr[0]=0\nr[1]=-1\nr[2]=-1\nr[7]=-1\nr[3]=0\nr[4]=0\nr[5]=a4\nr[6]=a4\nif(A.fV(a5,0,a4,0,r)>=14)r[7]=a4\nq=r[1]\nif(q>=0)if(A.fV(a5,0,q,20,r)===20)r[7]=q\np=r[2]+1\no=r[3]\nn=r[4]\nm=r[5]\nl=r[6]\nif(l<m)m=l\nif(n<p)n=m\nelse if(n<=q)n=q+1\nif(o<p)o=n\nk=r[7]<0\nif(k)if(p>q+3){j=a3\nk=!1}else{i=o>0\nif(i&&o+1===n){j=a3\nk=!1}else{if(!B.a.v(a5,\"\\\\\",n))if(p>0)h=B.a.v(a5,\"\\\\\",p-1)||B.a.v(a5,\"\\\\\",p-2)\nelse h=!1\nelse h=!0\nif(h){j=a3\nk=!1}else{if(!(m<a4&&m===n+2&&B.a.v(a5,\"..\",n)))h=m>n+2&&B.a.v(a5,\"/..\",m-3)\nelse h=!0\nif(h)j=a3\nelse if(q===4)if(B.a.v(a5,\"file\",0)){if(p<=0){if(!B.a.v(a5,\"/\",n)){g=\"file:///\"\ns=3}else{g=\"file://\"\ns=2}a5=g+B.a.j(a5,n,a4)\nm+=s\nl+=s\na4=a5.length\np=7\no=7\nn=7}else if(n===m){++l\nf=m+1\na5=B.a.J(a5,n,m,\"/\");++a4\nm=f}j=\"file\"}else if(B.a.v(a5,\"http\",0)){if(i&&o+3===n&&B.a.v(a5,\"80\",o+1)){l-=3\ne=n-3\nm-=3\na5=B.a.J(a5,o,n,\"\")\na4-=3\nn=e}j=\"http\"}else j=a3\nelse if(q===5&&B.a.v(a5,\"https\",0)){if(i&&o+4===n&&B.a.v(a5,\"443\",o+1)){l-=4\ne=n-4\nm-=4\na5=B.a.J(a5,o,n,\"\")\na4-=3\nn=e}j=\"https\"}else j=a3\nk=!h}}}else j=a3\nif(k)return new A.ch(a4<a5.length?B.a.j(a5,0,a4):a5,q,p,o,n,m,l,j)\nif(j==null)if(q>0)j=A.iJ(a5,0,q)\nelse{if(q===0)A.aA(a5,0,\"Invalid empty scheme\")\nj=\"\"}if(p>0){d=q+3\nc=d<p?A.iK(a5,d,p-1):\"\"\nb=A.iE(a5,p,o,!1)\ni=o+1\nif(i<n){a=A.f3(B.a.j(a5,i,n),a3)\na0=A.iG(a==null?A.aH(A.z(\"Invalid port\",a5,i)):a,j)}else a0=a3}else{a0=a3\nb=a0\nc=\"\"}a1=A.iF(a5,n,m,a3,j,b!=null)\na2=m<l?A.eu(a5,m+1,l,a3):a3\nreturn A.es(j,c,b,a0,a1,a2,l<a4?A.iD(a5,l+1,a4):a3)},\nfh(a){var s=t.N\nreturn B.b.bH(A.h(a.split(\"&\"),t.s),A.ej(s,s),new A.d_(B.e))},\nia(a,b,c){var s,r,q,p,o,n,m=\"IPv4 address should contain exactly 4 parts\",l=\"each part must be in the range 0..255\",k=new A.cX(a),j=new Uint8Array(4)\nfor(s=b,r=s,q=0;s<c;++s){p=a.charCodeAt(s)\nif(p!==46){if((p^48)>9)k.$2(\"invalid character\",s)}else{if(q===3)k.$2(m,s)\no=A.e8(B.a.j(a,r,s),null)\nif(o>255)k.$2(l,r)\nn=q+1\nj[q]=o\nr=s+1\nq=n}}if(q!==3)k.$2(m,c)\no=A.e8(B.a.j(a,r,c),null)\nif(o>255)k.$2(l,r)\nj[q]=o\nreturn j},\nfg(a,b,a0){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=null,d=new A.cY(a),c=new A.cZ(d,a)\nif(a.length<2)d.$2(\"address is too short\",e)\ns=A.h([],t.t)\nfor(r=b,q=r,p=!1,o=!1;r<a0;++r){n=a.charCodeAt(r)\nif(n===58){if(r===b){++r\nif(a.charCodeAt(r)!==58)d.$2(\"invalid start colon.\",r)\nq=r}if(r===q){if(p)d.$2(\"only one wildcard `::` is allowed\",r)\ns.push(-1)\np=!0}else s.push(c.$2(q,r))\nq=r+1}else if(n===46)o=!0}if(s.length===0)d.$2(\"too few parts\",e)\nm=q===a0\nl=B.b.ga_(s)\nif(m&&l!==-1)d.$2(\"expected a part after last `:`\",a0)\nif(!m)if(!o)s.push(c.$2(q,a0))\nelse{k=A.ia(a,q,a0)\ns.push((k[0]<<8|k[1])>>>0)\ns.push((k[2]<<8|k[3])>>>0)}if(p){if(s.length>7)d.$2(\"an address with a wildcard must have less than 7 parts\",e)}else if(s.length!==8)d.$2(\"an address without a wildcard must contain exactly 8 parts\",e)\nj=new Uint8Array(16)\nfor(l=s.length,i=9-l,r=0,h=0;r<l;++r){g=s[r]\nif(g===-1)for(f=0;f<i;++f){j[h]=0\nj[h+1]=0\nh+=2}else{j[h]=B.c.V(g,8)\nj[h+1]=g&255\nh+=2}}return j},\nes(a,b,c,d,e,f,g){return new A.bn(a,b,c,d,e,f,g)},\nfu(a){if(a===\"http\")return 80\nif(a===\"https\")return 443\nreturn 0},\naA(a,b,c){throw A.a(A.z(c,a,b))},\niG(a,b){if(a!=null&&a===A.fu(b))return null\nreturn a},\niE(a,b,c,d){var s,r,q,p,o,n\nif(b===c)return\"\"\nif(a.charCodeAt(b)===91){s=c-1\nif(a.charCodeAt(s)!==93)A.aA(a,b,\"Missing end `]` to match `[` in host\")\nr=b+1\nq=A.iB(a,r,s)\nif(q<s){p=q+1\no=A.fz(a,B.a.v(a,\"25\",p)?q+3:p,s,\"%25\")}else o=\"\"\nA.fg(a,r,q)\nreturn B.a.j(a,b,q).toLowerCase()+o+\"]\"}for(n=b;n<c;++n)if(a.charCodeAt(n)===58){q=B.a.Z(a,\"%\",b)\nq=q>=b&&q<c?q:c\nif(q<c){p=q+1\no=A.fz(a,B.a.v(a,\"25\",p)?q+3:p,c,\"%25\")}else o=\"\"\nA.fg(a,b,q)\nreturn\"[\"+B.a.j(a,b,q)+o+\"]\"}return A.iM(a,b,c)},\niB(a,b,c){var s=B.a.Z(a,\"%\",b)\nreturn s>=b&&s<c?s:c},\nfz(a,b,c,d){var s,r,q,p,o,n,m,l,k,j,i=d!==\"\"?new A.y(d):null\nfor(s=b,r=s,q=!0;s<c;){p=a.charCodeAt(s)\nif(p===37){o=A.ev(a,s,!0)\nn=o==null\nif(n&&q){s+=3\ncontinue}if(i==null)i=new A.y(\"\")\nm=i.a+=B.a.j(a,r,s)\nif(n)o=B.a.j(a,s,s+3)\nelse if(o===\"%\")A.aA(a,s,\"ZoneID should not contain % anymore\")\ni.a=m+o\ns+=3\nr=s\nq=!0}else if(p<127&&(B.h[p>>>4]&1<<(p&15))!==0){if(q&&65<=p&&90>=p){if(i==null)i=new A.y(\"\")\nif(r<s){i.a+=B.a.j(a,r,s)\nr=s}q=!1}++s}else{if((p&64512)===55296&&s+1<c){l=a.charCodeAt(s+1)\nif((l&64512)===56320){p=(p&1023)<<10|l&1023|65536\nk=2}else k=1}else k=1\nj=B.a.j(a,r,s)\nif(i==null){i=new A.y(\"\")\nn=i}else n=i\nn.a+=j\nm=A.et(p)\nn.a+=m\ns+=k\nr=s}}if(i==null)return B.a.j(a,b,c)\nif(r<c){j=B.a.j(a,r,c)\ni.a+=j}n=i.a\nreturn n.charCodeAt(0)==0?n:n},\niM(a,b,c){var s,r,q,p,o,n,m,l,k,j,i\nfor(s=b,r=s,q=null,p=!0;s<c;){o=a.charCodeAt(s)\nif(o===37){n=A.ev(a,s,!0)\nm=n==null\nif(m&&p){s+=3\ncontinue}if(q==null)q=new A.y(\"\")\nl=B.a.j(a,r,s)\nif(!p)l=l.toLowerCase()\nk=q.a+=l\nif(m){n=B.a.j(a,s,s+3)\nj=3}else if(n===\"%\"){n=\"%25\"\nj=1}else j=3\nq.a=k+n\ns+=j\nr=s\np=!0}else if(o<127&&(B.a9[o>>>4]&1<<(o&15))!==0){if(p&&65<=o&&90>=o){if(q==null)q=new A.y(\"\")\nif(r<s){q.a+=B.a.j(a,r,s)\nr=s}p=!1}++s}else if(o<=93&&(B.r[o>>>4]&1<<(o&15))!==0)A.aA(a,s,\"Invalid character\")\nelse{if((o&64512)===55296&&s+1<c){i=a.charCodeAt(s+1)\nif((i&64512)===56320){o=(o&1023)<<10|i&1023|65536\nj=2}else j=1}else j=1\nl=B.a.j(a,r,s)\nif(!p)l=l.toLowerCase()\nif(q==null){q=new A.y(\"\")\nm=q}else m=q\nm.a+=l\nk=A.et(o)\nm.a+=k\ns+=j\nr=s}}if(q==null)return B.a.j(a,b,c)\nif(r<c){l=B.a.j(a,r,c)\nif(!p)l=l.toLowerCase()\nq.a+=l}m=q.a\nreturn m.charCodeAt(0)==0?m:m},\niJ(a,b,c){var s,r,q\nif(b===c)return\"\"\nif(!A.fw(a.charCodeAt(b)))A.aA(a,b,\"Scheme not starting with alphabetic character\")\nfor(s=b,r=!1;s<c;++s){q=a.charCodeAt(s)\nif(!(q<128&&(B.o[q>>>4]&1<<(q&15))!==0))A.aA(a,s,\"Illegal scheme character\")\nif(65<=q&&q<=90)r=!0}a=B.a.j(a,b,c)\nreturn A.iA(r?a.toLowerCase():a)},\niA(a){if(a===\"http\")return\"http\"\nif(a===\"file\")return\"file\"\nif(a===\"https\")return\"https\"\nif(a===\"package\")return\"package\"\nreturn a},\niK(a,b,c){return A.bo(a,b,c,B.a8,!1,!1)},\niF(a,b,c,d,e,f){var s,r=e===\"file\",q=r||f\nif(a==null)return r?\"/\":\"\"\nelse s=A.bo(a,b,c,B.p,!0,!0)\nif(s.length===0){if(r)return\"/\"}else if(q&&!B.a.u(s,\"/\"))s=\"/\"+s\nreturn A.iL(s,e,f)},\niL(a,b,c){var s=b.length===0\nif(s&&!c&&!B.a.u(a,\"/\")&&!B.a.u(a,\"\\\\\"))return A.iN(a,!s||c)\nreturn A.iO(a)},\neu(a,b,c,d){if(a!=null){if(d!=null)throw A.a(A.a_(\"Both query and queryParameters specified\",null))\nreturn A.bo(a,b,c,B.f,!0,!1)}if(d==null)return null\nreturn A.iH(d)},\niI(a){var s={},r=new A.y(\"\")\ns.a=\"\"\na.C(0,new A.dB(new A.dC(s,r)))\ns=r.a\nreturn s.charCodeAt(0)==0?s:s},\niD(a,b,c){return A.bo(a,b,c,B.f,!0,!1)},\nev(a,b,c){var s,r,q,p,o,n=b+2\nif(n>=a.length)return\"%\"\ns=a.charCodeAt(b+1)\nr=a.charCodeAt(n)\nq=A.e0(s)\np=A.e0(r)\nif(q<0||p<0)return\"%\"\no=q*16+p\nif(o<127&&(B.h[B.c.V(o,4)]&1<<(o&15))!==0)return A.Q(c&&65<=o&&90>=o?(o|32)>>>0:o)\nif(s>=97||r>=97)return B.a.j(a,b,b+3).toUpperCase()\nreturn null},\net(a){var s,r,q,p,o,n=\"0123456789ABCDEF\"\nif(a<128){s=new Uint8Array(3)\ns[0]=37\ns[1]=n.charCodeAt(a>>>4)\ns[2]=n.charCodeAt(a&15)}else{if(a>2047)if(a>65535){r=240\nq=4}else{r=224\nq=3}else{r=192\nq=2}s=new Uint8Array(3*q)\nfor(p=0;--q,q>=0;r=128){o=B.c.bv(a,6*q)&63|r\ns[p]=37\ns[p+1]=n.charCodeAt(o>>>4)\ns[p+2]=n.charCodeAt(o&15)\np+=3}}return A.fc(s,0,null)},\nbo(a,b,c,d,e,f){var s=A.fy(a,b,c,d,e,f)\nreturn s==null?B.a.j(a,b,c):s},\nfy(a,b,c,d,e,f){var s,r,q,p,o,n,m,l,k,j,i=null\nfor(s=!e,r=b,q=r,p=i;r<c;){o=a.charCodeAt(r)\nif(o<127&&(d[o>>>4]&1<<(o&15))!==0)++r\nelse{if(o===37){n=A.ev(a,r,!1)\nif(n==null){r+=3\ncontinue}if(\"%\"===n){n=\"%25\"\nm=1}else m=3}else if(o===92&&f){n=\"/\"\nm=1}else if(s&&o<=93&&(B.r[o>>>4]&1<<(o&15))!==0){A.aA(a,r,\"Invalid character\")\nm=i\nn=m}else{if((o&64512)===55296){l=r+1\nif(l<c){k=a.charCodeAt(l)\nif((k&64512)===56320){o=(o&1023)<<10|k&1023|65536\nm=2}else m=1}else m=1}else m=1\nn=A.et(o)}if(p==null){p=new A.y(\"\")\nl=p}else l=p\nj=l.a+=B.a.j(a,q,r)\nl.a=j+A.i(n)\nr+=m\nq=r}}if(p==null)return i\nif(q<c){s=B.a.j(a,q,c)\np.a+=s}s=p.a\nreturn s.charCodeAt(0)==0?s:s},\nfx(a){if(B.a.u(a,\".\"))return!0\nreturn B.a.aU(a,\"/.\")!==-1},\niO(a){var s,r,q,p,o,n\nif(!A.fx(a))return a\ns=A.h([],t.s)\nfor(r=a.split(\"/\"),q=r.length,p=!1,o=0;o<q;++o){n=r[o]\nif(J.F(n,\"..\")){if(s.length!==0){s.pop()\nif(s.length===0)s.push(\"\")}p=!0}else{p=\".\"===n\nif(!p)s.push(n)}}if(p)s.push(\"\")\nreturn B.b.aY(s,\"/\")},\niN(a,b){var s,r,q,p,o,n\nif(!A.fx(a))return!b?A.fv(a):a\ns=A.h([],t.s)\nfor(r=a.split(\"/\"),q=r.length,p=!1,o=0;o<q;++o){n=r[o]\nif(\"..\"===n){p=s.length!==0&&B.b.ga_(s)!==\"..\"\nif(p)s.pop()\nelse s.push(\"..\")}else{p=\".\"===n\nif(!p)s.push(n)}}r=s.length\nif(r!==0)r=r===1&&s[0].length===0\nelse r=!0\nif(r)return\"./\"\nif(p||B.b.ga_(s)===\"..\")s.push(\"\")\nif(!b)s[0]=A.fv(s[0])\nreturn B.b.aY(s,\"/\")},\nfv(a){var s,r,q=a.length\nif(q>=2&&A.fw(a.charCodeAt(0)))for(s=1;s<q;++s){r=a.charCodeAt(s)\nif(r===58)return B.a.j(a,0,s)+\"%3A\"+B.a.K(a,s+1)\nif(r>127||(B.o[r>>>4]&1<<(r&15))===0)break}return a},\niC(a,b){var s,r,q\nfor(s=0,r=0;r<2;++r){q=a.charCodeAt(b+r)\nif(48<=q&&q<=57)s=s*16+q-48\nelse{q|=32\nif(97<=q&&q<=102)s=s*16+q-87\nelse throw A.a(A.a_(\"Invalid URL encoding\",null))}}return s},\new(a,b,c,d,e){var s,r,q,p,o=b\nwhile(!0){if(!(o<c)){s=!0\nbreak}r=a.charCodeAt(o)\nif(r<=127)if(r!==37)q=r===43\nelse q=!0\nelse q=!0\nif(q){s=!1\nbreak}++o}if(s)if(B.e===d)return B.a.j(a,b,c)\nelse p=new A.bB(B.a.j(a,b,c))\nelse{p=A.h([],t.t)\nfor(q=a.length,o=b;o<c;++o){r=a.charCodeAt(o)\nif(r>127)throw A.a(A.a_(\"Illegal percent encoding in URI\",null))\nif(r===37){if(o+3>q)throw A.a(A.a_(\"Truncated URI\",null))\np.push(A.iC(a,o+1))\no+=2}else if(r===43)p.push(32)\nelse p.push(r)}}return B.ap.I(p)},\nfw(a){var s=a|32\nreturn 97<=s&&s<=122},\nff(a,b,c){var s,r,q,p,o,n,m,l,k=\"Invalid MIME type\",j=A.h([b-1],t.t)\nfor(s=a.length,r=b,q=-1,p=null;r<s;++r){p=a.charCodeAt(r)\nif(p===44||p===59)break\nif(p===47){if(q<0){q=r\ncontinue}throw A.a(A.z(k,a,r))}}if(q<0&&r>b)throw A.a(A.z(k,a,r))\nfor(;p!==44;){j.push(r);++r\nfor(o=-1;r<s;++r){p=a.charCodeAt(r)\nif(p===61){if(o<0)o=r}else if(p===59||p===44)break}if(o>=0)j.push(o)\nelse{n=B.b.ga_(j)\nif(p!==44||r!==n+7||!B.a.v(a,\"base64\",n+1))throw A.a(A.z(\"Expecting '='\",a,r))\nbreak}}j.push(r)\nm=r+1\nif((j.length&1)===1)a=B.x.bP(a,m,s)\nelse{l=A.fy(a,m,s,B.f,!0,!1)\nif(l!=null)a=B.a.J(a,m,s,l)}return new A.cW(a,j,c)},\nj_(){var s,r,q,p,o,n=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$&'()*+,;=\",m=\".\",l=\":\",k=\"/\",j=\"\\\\\",i=\"?\",h=\"#\",g=\"/\\\\\",f=J.eX(22,t.D)\nfor(s=0;s<22;++s)f[s]=new Uint8Array(96)\nr=new A.dP(f)\nq=new A.dQ()\np=new A.dR()\no=r.$2(0,225)\nq.$3(o,n,1)\nq.$3(o,m,14)\nq.$3(o,l,34)\nq.$3(o,k,3)\nq.$3(o,j,227)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(14,225)\nq.$3(o,n,1)\nq.$3(o,m,15)\nq.$3(o,l,34)\nq.$3(o,g,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(15,225)\nq.$3(o,n,1)\nq.$3(o,\"%\",225)\nq.$3(o,l,34)\nq.$3(o,k,9)\nq.$3(o,j,233)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(1,225)\nq.$3(o,n,1)\nq.$3(o,l,34)\nq.$3(o,k,10)\nq.$3(o,j,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(2,235)\nq.$3(o,n,139)\nq.$3(o,k,131)\nq.$3(o,j,131)\nq.$3(o,m,146)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(3,235)\nq.$3(o,n,11)\nq.$3(o,k,68)\nq.$3(o,j,68)\nq.$3(o,m,18)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(4,229)\nq.$3(o,n,5)\np.$3(o,\"AZ\",229)\nq.$3(o,l,102)\nq.$3(o,\"@\",68)\nq.$3(o,\"[\",232)\nq.$3(o,k,138)\nq.$3(o,j,138)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(5,229)\nq.$3(o,n,5)\np.$3(o,\"AZ\",229)\nq.$3(o,l,102)\nq.$3(o,\"@\",68)\nq.$3(o,k,138)\nq.$3(o,j,138)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(6,231)\np.$3(o,\"19\",7)\nq.$3(o,\"@\",68)\nq.$3(o,k,138)\nq.$3(o,j,138)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(7,231)\np.$3(o,\"09\",7)\nq.$3(o,\"@\",68)\nq.$3(o,k,138)\nq.$3(o,j,138)\nq.$3(o,i,172)\nq.$3(o,h,205)\nq.$3(r.$2(8,8),\"]\",5)\no=r.$2(9,235)\nq.$3(o,n,11)\nq.$3(o,m,16)\nq.$3(o,g,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(16,235)\nq.$3(o,n,11)\nq.$3(o,m,17)\nq.$3(o,g,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(17,235)\nq.$3(o,n,11)\nq.$3(o,k,9)\nq.$3(o,j,233)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(10,235)\nq.$3(o,n,11)\nq.$3(o,m,18)\nq.$3(o,k,10)\nq.$3(o,j,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(18,235)\nq.$3(o,n,11)\nq.$3(o,m,19)\nq.$3(o,g,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(19,235)\nq.$3(o,n,11)\nq.$3(o,g,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(11,235)\nq.$3(o,n,11)\nq.$3(o,k,10)\nq.$3(o,j,234)\nq.$3(o,i,172)\nq.$3(o,h,205)\no=r.$2(12,236)\nq.$3(o,n,12)\nq.$3(o,i,12)\nq.$3(o,h,205)\no=r.$2(13,237)\nq.$3(o,n,13)\nq.$3(o,i,13)\np.$3(r.$2(20,245),\"az\",21)\no=r.$2(21,245)\np.$3(o,\"az\",21)\np.$3(o,\"09\",21)\nq.$3(o,\"+-.\",21)\nreturn f},\nfV(a,b,c,d,e){var s,r,q,p,o=$.hq()\nfor(s=b;s<c;++s){r=o[d]\nq=a.charCodeAt(s)^96\np=r[q>95?31:q]\nd=p&31\ne[p>>>5]=s}return d},\ncM:function cM(a,b){this.a=a\nthis.b=b},\ndD:function dD(a){this.a=a},\nd8:function d8(){},\nk:function k(){},\nbx:function bx(a){this.a=a},\nR:function R(){},\nG:function G(a,b,c,d){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d},\nb2:function b2(a,b,c,d,e,f){var _=this\n_.e=a\n_.f=b\n_.a=c\n_.b=d\n_.c=e\n_.d=f},\nbF:function bF(a,b,c,d,e){var _=this\n_.f=a\n_.a=b\n_.b=c\n_.c=d\n_.d=e},\nbV:function bV(a,b,c,d){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d},\nc2:function c2(a){this.a=a},\nc_:function c_(a){this.a=a},\nb5:function b5(a){this.a=a},\nbD:function bD(a){this.a=a},\nbW:function bW(){},\nb4:function b4(){},\nd9:function d9(a){this.a=a},\ncw:function cw(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\nn:function n(){},\nu:function u(){},\nl:function l(){},\ncj:function cj(){},\ny:function y(a){this.a=a},\nd_:function d_(a){this.a=a},\ncX:function cX(a){this.a=a},\ncY:function cY(a){this.a=a},\ncZ:function cZ(a,b){this.a=a\nthis.b=b},\nbn:function bn(a,b,c,d,e,f,g){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d\n_.e=e\n_.f=f\n_.r=g\n_.z=_.y=_.w=$},\ndC:function dC(a,b){this.a=a\nthis.b=b},\ndB:function dB(a){this.a=a},\ncW:function cW(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\ndP:function dP(a){this.a=a},\ndQ:function dQ(){},\ndR:function dR(){},\nch:function ch(a,b,c,d,e,f,g,h){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d\n_.e=e\n_.f=f\n_.r=g\n_.w=h\n_.x=null},\nc9:function c9(a,b,c,d,e,f,g){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d\n_.e=e\n_.f=f\n_.r=g\n_.z=_.y=_.w=$},\niY(a){var s,r=a.$dart_jsFunction\nif(r!=null)return r\ns=function(b,c){return function(){return b(c,Array.prototype.slice.apply(arguments))}}(A.iW,a)\ns[$.eK()]=a\na.$dart_jsFunction=s\nreturn s},\niW(a,b){return A.i1(a,b,null)},\nab(a){if(typeof a==\"function\")return a\nelse return A.iY(a)},\neb(a,b){var s=new A.v($.r,b.i(\"v<0>\")),r=new A.b7(s,b.i(\"b7<0>\"))\na.then(A.aF(new A.ec(r),1),A.aF(new A.ed(r),1))\nreturn s},\nec:function ec(a){this.a=a},\ned:function ed(a){this.a=a},\ncN:function cN(a){this.a=a},\nm:function m(a,b){this.a=a\nthis.b=b},\nhL(a){var s,r,q,p,o,n,m,l,k=\"enclosedBy\"\nif(a.k(0,k)!=null){s=t.a.a(a.k(0,k))\nr=new A.cu(A.fG(s.k(0,\"name\")),B.q[A.fE(s.k(0,\"kind\"))],A.fG(s.k(0,\"href\")))}else r=null\nq=a.k(0,\"name\")\np=a.k(0,\"qualifiedName\")\no=A.fF(a.k(0,\"packageRank\"))\nif(o==null)o=0\nn=a.k(0,\"href\")\nm=B.q[A.fE(a.k(0,\"kind\"))]\nl=A.fF(a.k(0,\"overriddenDepth\"))\nif(l==null)l=0\nreturn new A.w(q,p,o,m,n,l,a.k(0,\"desc\"),r)},\nA:function A(a,b){this.a=a\nthis.b=b},\ncz:function cz(a){this.a=a},\ncC:function cC(a,b){this.a=a\nthis.b=b},\ncA:function cA(){},\ncB:function cB(){},\nw:function w(a,b,c,d,e,f,g,h){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d\n_.e=e\n_.f=f\n_.r=g\n_.w=h},\ncu:function cu(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\njN(){var s=self,r=s.document.getElementById(\"search-box\"),q=s.document.getElementById(\"search-body\"),p=s.document.getElementById(\"search-sidebar\")\nA.eb(s.window.fetch($.bw()+\"index.json\"),t.m).ar(new A.e5(new A.e6(r,q,p),r,q,p),t.P)},\neo(a){var s=A.h([],t.O),r=A.h([],t.M)\nreturn new A.ds(a,A.c4(self.window.location.href),s,r)},\niZ(a,b){var s,r,q,p,o,n,m,l,k=self,j=k.document.createElement(\"div\"),i=b.e\nif(i==null)i=\"\"\nj.setAttribute(\"data-href\",i)\nj.classList.add(\"tt-suggestion\")\ns=k.document.createElement(\"span\")\ns.classList.add(\"tt-suggestion-title\")\ns.innerHTML=A.ex(b.a+\" \"+b.d.h(0).toLowerCase(),a)\nj.appendChild(s)\nr=b.w\ni=r!=null\nif(i){q=k.document.createElement(\"span\")\nq.classList.add(\"tt-suggestion-container\")\nq.innerHTML=\"(in \"+A.ex(r.a,a)+\")\"\nj.appendChild(q)}p=b.r\nif(p!=null&&p.length!==0){o=k.document.createElement(\"blockquote\")\no.classList.add(\"one-line-description\")\nq=k.document.createElement(\"textarea\")\nq.innerHTML=p\no.setAttribute(\"title\",q.value)\no.innerHTML=A.ex(p,a)\nj.appendChild(o)}q=t.g\nj.addEventListener(\"mousedown\",q.a(A.ab(new A.dN())))\nj.addEventListener(\"click\",q.a(A.ab(new A.dO(b))))\nif(i){i=r.a\nq=r.b.h(0)\nn=r.c\nm=k.document.createElement(\"div\")\nm.classList.add(\"tt-container\")\nl=k.document.createElement(\"p\")\nl.textContent=\"Results from \"\nl.classList.add(\"tt-container-text\")\nk=k.document.createElement(\"a\")\nk.setAttribute(\"href\",n)\nk.innerHTML=i+\" \"+q\nl.appendChild(k)\nm.appendChild(l)\nA.jm(m,j)}return j},\njm(a,b){var s,r=a.innerHTML\nif(r.length===0)return\ns=$.bq.k(0,r)\nif(s!=null)s.appendChild(b)\nelse{a.appendChild(b)\n$.bq.q(0,r,a)}},\nex(a,b){return A.k3(a,A.f6(b,!1),new A.dS(),null)},\ndT:function dT(){},\ne6:function e6(a,b,c){this.a=a\nthis.b=b\nthis.c=c},\ne5:function e5(a,b,c,d){var _=this\n_.a=a\n_.b=b\n_.c=c\n_.d=d},\nds:function ds(a,b,c,d){var _=this\n_.a=a\n_.b=b\n_.e=_.d=_.c=$\n_.f=null\n_.r=\"\"\n_.w=c\n_.x=d\n_.y=-1},\ndt:function dt(a){this.a=a},\ndu:function du(a,b){this.a=a\nthis.b=b},\ndv:function dv(a,b){this.a=a\nthis.b=b},\ndw:function dw(a,b){this.a=a\nthis.b=b},\ndx:function dx(a,b){this.a=a\nthis.b=b},\ndN:function dN(){},\ndO:function dO(a){this.a=a},\ndS:function dS(){},\nj6(){var s=self,r=s.document.getElementById(\"sidenav-left-toggle\"),q=s.document.querySelector(\".sidebar-offcanvas-left\"),p=s.document.getElementById(\"overlay-under-drawer\"),o=t.g.a(A.ab(new A.dU(q,p)))\nif(p!=null)p.addEventListener(\"click\",o)\nif(r!=null)r.addEventListener(\"click\",o)},\nj5(){var s,r,q,p,o=self,n=o.document.body\nif(n==null)return\ns=n.getAttribute(\"data-using-base-href\")\nif(s==null)return\nif(s!==\"true\"){r=n.getAttribute(\"data-base-href\")\nif(r==null)return\nq=r}else q=\"\"\np=o.document.getElementById(\"dartdoc-main-content\")\nif(p==null)return\nA.fR(q,p.getAttribute(\"data-above-sidebar\"),o.document.getElementById(\"dartdoc-sidebar-left-content\"))\nA.fR(q,p.getAttribute(\"data-below-sidebar\"),o.document.getElementById(\"dartdoc-sidebar-right\"))},\nfR(a,b,c){if(b==null||b.length===0||c==null)return\nA.eb(self.window.fetch(a+A.i(b)),t.m).ar(new A.dV(c,a),t.P)},\nfY(a,b){var s,r,q,p\nif(b.nodeName.toLowerCase()===\"a\"){s=b.getAttribute(\"href\")\nif(s!=null)if(!A.c4(s).gaX())b.href=a+s}r=b.childNodes\nfor(q=0;q<r.length;++q){p=r.item(q)\nif(p!=null)A.fY(a,p)}},\ndU:function dU(a,b){this.a=a\nthis.b=b},\ndV:function dV(a,b){this.a=a\nthis.b=b},\njO(){var s,r,q,p=self,o=p.document.body\nif(o==null)return\ns=p.document.getElementById(\"theme\")\nif(s==null)s=t.m.a(s)\nr=new A.e7(s,o)\ns.addEventListener(\"change\",t.g.a(A.ab(new A.e4(r))))\nq=p.window.localStorage.getItem(\"colorTheme\")\nif(q!=null){s.checked=q===\"true\"\nr.$0()}},\ne7:function e7(a,b){this.a=a\nthis.b=b},\ne4:function e4(a){this.a=a},\njZ(a){if(typeof dartPrint==\"function\"){dartPrint(a)\nreturn}if(typeof console==\"object\"&&typeof console.log!=\"undefined\"){console.log(a)\nreturn}if(typeof print==\"function\"){print(a)\nreturn}throw\"Unable to print message: \"+String(a)},\nk4(a){A.h8(new A.aV(\"Field '\"+a+\"' has been assigned during initialization.\"),new Error())},\nbv(){A.h8(new A.aV(\"Field '' has been assigned during initialization.\"),new Error())},\njW(){A.j5()\nA.j6()\nA.jN()\nvar s=self.hljs\nif(s!=null)s.highlightAll()\nA.jO()}},B={}\nvar w=[A,J,B]\nvar $={}\nA.eh.prototype={}\nJ.bG.prototype={\nF(a,b){return a===b},\ngn(a){return A.bY(a)},\nh(a){return\"Instance of '\"+A.cQ(a)+\"'\"},\nb_(a,b){throw A.a(A.f1(a,b))},\ngt(a){return A.an(A.ey(this))}}\nJ.bH.prototype={\nh(a){return String(a)},\ngn(a){return a?519018:218159},\ngt(a){return A.an(t.y)},\n$ij:1}\nJ.aQ.prototype={\nF(a,b){return null==b},\nh(a){return\"null\"},\ngn(a){return 0},\n$ij:1,\n$iu:1}\nJ.aT.prototype={$ip:1}\nJ.a2.prototype={\ngn(a){return 0},\nh(a){return String(a)}}\nJ.bX.prototype={}\nJ.ax.prototype={}\nJ.a1.prototype={\nh(a){var s=a[$.eK()]\nif(s==null)return this.be(a)\nreturn\"JavaScript function for \"+J.aq(s)}}\nJ.aS.prototype={\ngn(a){return 0},\nh(a){return String(a)}}\nJ.aU.prototype={\ngn(a){return 0},\nh(a){return String(a)}}\nJ.o.prototype={\nX(a,b){return new A.M(a,A.am(a).i(\"@<1>\").A(b).i(\"M<1,2>\"))},\nad(a,b){if(!!a.fixed$length)A.aH(A.T(\"add\"))\na.push(b)},\naI(a,b){var s\nif(!!a.fixed$length)A.aH(A.T(\"addAll\"))\nif(Array.isArray(b)){this.bg(a,b)\nreturn}for(s=J.L(b);s.m();)a.push(s.gp())},\nbg(a,b){var s,r=b.length\nif(r===0)return\nif(a===b)throw A.a(A.as(a))\nfor(s=0;s<r;++s)a.push(b[s])},\nY(a){if(!!a.fixed$length)A.aH(A.T(\"clear\"))\na.length=0},\naY(a,b){var s,r=A.f0(a.length,\"\",!1,t.N)\nfor(s=0;s<a.length;++s)r[s]=A.i(a[s])\nreturn r.join(b)},\nbG(a,b,c){var s,r,q=a.length\nfor(s=b,r=0;r<q;++r){s=c.$2(s,a[r])\nif(a.length!==q)throw A.a(A.as(a))}return s},\nbH(a,b,c){return this.bG(a,b,c,t.z)},\nE(a,b){return a[b]},\nbd(a,b,c){var s=a.length\nif(b>s)throw A.a(A.H(b,0,s,\"start\",null))\nif(c<b||c>s)throw A.a(A.H(c,b,s,\"end\",null))\nif(b===c)return A.h([],A.am(a))\nreturn A.h(a.slice(b,c),A.am(a))},\ngbF(a){if(a.length>0)return a[0]\nthrow A.a(A.eV())},\nga_(a){var s=a.length\nif(s>0)return a[s-1]\nthrow A.a(A.eV())},\nbc(a,b){var s,r,q,p,o\nif(!!a.immutable$list)A.aH(A.T(\"sort\"))\ns=a.length\nif(s<2)return\nif(b==null)b=J.ja()\nif(s===2){r=a[0]\nq=a[1]\nif(b.$2(r,q)>0){a[0]=q\na[1]=r}return}if(A.am(a).c.b(null)){for(p=0,o=0;o<a.length;++o)if(a[o]===void 0){a[o]=null;++p}}else p=0\na.sort(A.aF(b,2))\nif(p>0)this.bt(a,p)},\nbt(a,b){var s,r=a.length\nfor(;s=r-1,r>0;r=s)if(a[s]===null){a[s]=void 0;--b\nif(b===0)break}},\nh(a){return A.eW(a,\"[\",\"]\")},\ngB(a){return new J.ar(a,a.length,A.am(a).i(\"ar<1>\"))},\ngn(a){return A.bY(a)},\ngl(a){return a.length},\nk(a,b){if(!(b>=0&&b<a.length))throw A.a(A.eF(a,b))\nreturn a[b]},\nq(a,b,c){if(!!a.immutable$list)A.aH(A.T(\"indexed set\"))\nif(!(b>=0&&b<a.length))throw A.a(A.eF(a,b))\na[b]=c},\n$ic:1,\n$if:1}\nJ.cF.prototype={}\nJ.ar.prototype={\ngp(){var s=this.d\nreturn s==null?this.$ti.c.a(s):s},\nm(){var s,r=this,q=r.a,p=q.length\nif(r.b!==p)throw A.a(A.co(q))\ns=r.c\nif(s>=p){r.d=null\nreturn!1}r.d=q[s]\nr.c=s+1\nreturn!0}}\nJ.aR.prototype={\naL(a,b){var s\nif(a<b)return-1\nelse if(a>b)return 1\nelse if(a===b){if(a===0){s=this.gam(b)\nif(this.gam(a)===s)return 0\nif(this.gam(a))return-1\nreturn 1}return 0}else if(isNaN(a)){if(isNaN(b))return 0\nreturn 1}else return-1},\ngam(a){return a===0?1/a<0:a<0},\nh(a){if(a===0&&1/a<0)return\"-0.0\"\nelse return\"\"+a},\ngn(a){var s,r,q,p,o=a|0\nif(a===o)return o&536870911\ns=Math.abs(a)\nr=Math.log(s)/0.6931471805599453|0\nq=Math.pow(2,r)\np=s<1?s/q:q/s\nreturn((p*9007199254740992|0)+(p*3542243181176521|0))*599197+r*1259&536870911},\na1(a,b){var s=a%b\nif(s===0)return 0\nif(s>0)return s\nreturn s+b},\nbw(a,b){return(a|0)===a?a/b|0:this.bx(a,b)},\nbx(a,b){var s=a/b\nif(s>=-2147483648&&s<=2147483647)return s|0\nif(s>0){if(s!==1/0)return Math.floor(s)}else if(s>-1/0)return Math.ceil(s)\nthrow A.a(A.T(\"Result of truncating division is \"+A.i(s)+\": \"+A.i(a)+\" ~/ \"+b))},\nV(a,b){var s\nif(a>0)s=this.aF(a,b)\nelse{s=b>31?31:b\ns=a>>s>>>0}return s},\nbv(a,b){if(0>b)throw A.a(A.jz(b))\nreturn this.aF(a,b)},\naF(a,b){return b>31?0:a>>>b},\ngt(a){return A.an(t.H)},\n$it:1}\nJ.aP.prototype={\ngt(a){return A.an(t.S)},\n$ij:1,\n$ib:1}\nJ.bI.prototype={\ngt(a){return A.an(t.i)},\n$ij:1}\nJ.ai.prototype={\nb6(a,b){return a+b},\nJ(a,b,c,d){var s=A.b3(b,c,a.length)\nreturn a.substring(0,b)+d+a.substring(s)},\nv(a,b,c){var s\nif(c<0||c>a.length)throw A.a(A.H(c,0,a.length,null,null))\ns=c+b.length\nif(s>a.length)return!1\nreturn b===a.substring(c,s)},\nu(a,b){return this.v(a,b,0)},\nj(a,b,c){return a.substring(b,A.b3(b,c,a.length))},\nK(a,b){return this.j(a,b,null)},\nb9(a,b){var s,r\nif(0>=b)return\"\"\nif(b===1||a.length===0)return a\nif(b!==b>>>0)throw A.a(B.F)\nfor(s=a,r=\"\";!0;){if((b&1)===1)r=s+r\nb=b>>>1\nif(b===0)break\ns+=s}return r},\nZ(a,b,c){var s\nif(c<0||c>a.length)throw A.a(A.H(c,0,a.length,null,null))\ns=a.indexOf(b,c)\nreturn s},\naU(a,b){return this.Z(a,b,0)},\nag(a,b){return A.k2(a,b,0)},\naL(a,b){var s\nif(a===b)s=0\nelse s=a<b?-1:1\nreturn s},\nh(a){return a},\ngn(a){var s,r,q\nfor(s=a.length,r=0,q=0;q<s;++q){r=r+a.charCodeAt(q)&536870911\nr=r+((r&524287)<<10)&536870911\nr^=r>>6}r=r+((r&67108863)<<3)&536870911\nr^=r>>11\nreturn r+((r&16383)<<15)&536870911},\ngt(a){return A.an(t.N)},\ngl(a){return a.length},\n$ij:1,\n$id:1}\nA.a8.prototype={\ngB(a){var s=A.E(this)\nreturn new A.bA(J.L(this.gN()),s.i(\"@<1>\").A(s.y[1]).i(\"bA<1,2>\"))},\ngl(a){return J.aI(this.gN())},\nE(a,b){return A.E(this).y[1].a(J.ef(this.gN(),b))},\nh(a){return J.aq(this.gN())}}\nA.bA.prototype={\nm(){return this.a.m()},\ngp(){return this.$ti.y[1].a(this.a.gp())}}\nA.af.prototype={\ngN(){return this.a}}\nA.b9.prototype={$ic:1}\nA.b8.prototype={\nk(a,b){return this.$ti.y[1].a(J.hr(this.a,b))},\nq(a,b,c){J.hs(this.a,b,this.$ti.c.a(c))},\n$ic:1,\n$if:1}\nA.M.prototype={\nX(a,b){return new A.M(this.a,this.$ti.i(\"@<1>\").A(b).i(\"M<1,2>\"))},\ngN(){return this.a}}\nA.aV.prototype={\nh(a){return\"LateInitializationError: \"+this.a}}\nA.bB.prototype={\ngl(a){return this.a.length},\nk(a,b){return this.a.charCodeAt(b)}}\nA.cR.prototype={}\nA.c.prototype={}\nA.J.prototype={\ngB(a){var s=this\nreturn new A.au(s,s.gl(s),A.E(s).i(\"au<J.E>\"))}}\nA.au.prototype={\ngp(){var s=this.d\nreturn s==null?this.$ti.c.a(s):s},\nm(){var s,r=this,q=r.a,p=J.ao(q),o=p.gl(q)\nif(r.b!==o)throw A.a(A.as(q))\ns=r.c\nif(s>=o){r.d=null\nreturn!1}r.d=p.E(q,s);++r.c\nreturn!0}}\nA.aj.prototype={\ngB(a){var s=A.E(this)\nreturn new A.av(J.L(this.a),this.b,s.i(\"@<1>\").A(s.y[1]).i(\"av<1,2>\"))},\ngl(a){return J.aI(this.a)},\nE(a,b){return this.b.$1(J.ef(this.a,b))}}\nA.aM.prototype={$ic:1}\nA.av.prototype={\nm(){var s=this,r=s.b\nif(r.m()){s.a=s.c.$1(r.gp())\nreturn!0}s.a=null\nreturn!1},\ngp(){var s=this.a\nreturn s==null?this.$ti.y[1].a(s):s}}\nA.ak.prototype={\ngl(a){return J.aI(this.a)},\nE(a,b){return this.b.$1(J.ef(this.a,b))}}\nA.aO.prototype={}\nA.c1.prototype={\nq(a,b,c){throw A.a(A.T(\"Cannot modify an unmodifiable list\"))}}\nA.ay.prototype={}\nA.a5.prototype={\ngn(a){var s=this._hashCode\nif(s!=null)return s\ns=664597*B.a.gn(this.a)&536870911\nthis._hashCode=s\nreturn s},\nh(a){return'Symbol(\"'+this.a+'\")'},\nF(a,b){if(b==null)return!1\nreturn b instanceof A.a5&&this.a===b.a},\n$ib6:1}\nA.bp.prototype={}\nA.cg.prototype={$r:\"+item,matchPosition(1,2)\",$s:1}\nA.aL.prototype={}\nA.aK.prototype={\nh(a){return A.ek(this)},\nq(a,b,c){A.hG()},\n$ix:1}\nA.ah.prototype={\ngl(a){return this.b.length},\ngbq(){var s=this.$keys\nif(s==null){s=Object.keys(this.a)\nthis.$keys=s}return s},\nH(a){if(\"__proto__\"===a)return!1\nreturn this.a.hasOwnProperty(a)},\nk(a,b){if(!this.H(b))return null\nreturn this.b[this.a[b]]},\nC(a,b){var s,r,q=this.gbq(),p=this.b\nfor(s=q.length,r=0;r<s;++r)b.$2(q[r],p[r])}}\nA.cD.prototype={\ngbN(){var s=this.a\nif(s instanceof A.a5)return s\nreturn this.a=new A.a5(s)},\ngbQ(){var s,r,q,p,o,n=this\nif(n.c===1)return B.t\ns=n.d\nr=J.ao(s)\nq=r.gl(s)-J.aI(n.e)-n.f\nif(q===0)return B.t\np=[]\nfor(o=0;o<q;++o)p.push(r.k(s,o))\nreturn J.eY(p)},\ngbO(){var s,r,q,p,o,n,m,l,k=this\nif(k.c!==0)return B.u\ns=k.e\nr=J.ao(s)\nq=r.gl(s)\np=k.d\no=J.ao(p)\nn=o.gl(p)-q-k.f\nif(q===0)return B.u\nm=new A.N(t.B)\nfor(l=0;l<q;++l)m.q(0,new A.a5(r.k(s,l)),o.k(p,n+l))\nreturn new A.aL(m,t.Z)}}\nA.cP.prototype={\n$2(a,b){var s=this.a\ns.b=s.b+\"$\"+a\nthis.b.push(a)\nthis.c.push(b);++s.a},\n$S:2}\nA.cU.prototype={\nD(a){var s,r,q=this,p=new RegExp(q.a).exec(a)\nif(p==null)return null\ns=Object.create(null)\nr=q.b\nif(r!==-1)s.arguments=p[r+1]\nr=q.c\nif(r!==-1)s.argumentsExpr=p[r+1]\nr=q.d\nif(r!==-1)s.expr=p[r+1]\nr=q.e\nif(r!==-1)s.method=p[r+1]\nr=q.f\nif(r!==-1)s.receiver=p[r+1]\nreturn s}}\nA.b1.prototype={\nh(a){return\"Null check operator used on a null value\"}}\nA.bJ.prototype={\nh(a){var s,r=this,q=\"NoSuchMethodError: method not found: '\",p=r.b\nif(p==null)return\"NoSuchMethodError: \"+r.a\ns=r.c\nif(s==null)return q+p+\"' (\"+r.a+\")\"\nreturn q+p+\"' on '\"+s+\"' (\"+r.a+\")\"}}\nA.c0.prototype={\nh(a){var s=this.a\nreturn s.length===0?\"Error\":\"Error: \"+s}}\nA.cO.prototype={\nh(a){return\"Throw of null ('\"+(this.a===null?\"null\":\"undefined\")+\"' from JavaScript)\"}}\nA.aN.prototype={}\nA.bg.prototype={\nh(a){var s,r=this.b\nif(r!=null)return r\nr=this.a\ns=r!==null&&typeof r===\"object\"?r.stack:null\nreturn this.b=s==null?\"\":s},\n$ia4:1}\nA.ag.prototype={\nh(a){var s=this.constructor,r=s==null?null:s.name\nreturn\"Closure '\"+A.h9(r==null?\"unknown\":r)+\"'\"},\ngbZ(){return this},\n$C:\"$1\",\n$R:1,\n$D:null}\nA.cs.prototype={$C:\"$0\",$R:0}\nA.ct.prototype={$C:\"$2\",$R:2}\nA.cT.prototype={}\nA.cS.prototype={\nh(a){var s=this.$static_name\nif(s==null)return\"Closure of unknown static method\"\nreturn\"Closure '\"+A.h9(s)+\"'\"}}\nA.aJ.prototype={\nF(a,b){if(b==null)return!1\nif(this===b)return!0\nif(!(b instanceof A.aJ))return!1\nreturn this.$_target===b.$_target&&this.a===b.a},\ngn(a){return(A.h5(this.a)^A.bY(this.$_target))>>>0},\nh(a){return\"Closure '\"+this.$_name+\"' of \"+(\"Instance of '\"+A.cQ(this.a)+\"'\")}}\nA.c8.prototype={\nh(a){return\"Reading static variable '\"+this.a+\"' during its initialization\"}}\nA.bZ.prototype={\nh(a){return\"RuntimeError: \"+this.a}}\nA.dp.prototype={}\nA.N.prototype={\ngl(a){return this.a},\ngO(){return new A.O(this,A.E(this).i(\"O<1>\"))},\ngb5(){var s=A.E(this)\nreturn A.hW(new A.O(this,s.i(\"O<1>\")),new A.cG(this),s.c,s.y[1])},\nH(a){var s=this.b\nif(s==null)return!1\nreturn s[a]!=null},\nk(a,b){var s,r,q,p,o=null\nif(typeof b==\"string\"){s=this.b\nif(s==null)return o\nr=s[b]\nq=r==null?o:r.b\nreturn q}else if(typeof b==\"number\"&&(b&0x3fffffff)===b){p=this.c\nif(p==null)return o\nr=p[b]\nq=r==null?o:r.b\nreturn q}else return this.bL(b)},\nbL(a){var s,r,q=this.d\nif(q==null)return null\ns=q[this.aV(a)]\nr=this.aW(s,a)\nif(r<0)return null\nreturn s[r].b},\nq(a,b,c){var s,r,q,p,o,n,m=this\nif(typeof b==\"string\"){s=m.b\nm.av(s==null?m.b=m.a8():s,b,c)}else if(typeof b==\"number\"&&(b&0x3fffffff)===b){r=m.c\nm.av(r==null?m.c=m.a8():r,b,c)}else{q=m.d\nif(q==null)q=m.d=m.a8()\np=m.aV(b)\no=q[p]\nif(o==null)q[p]=[m.a9(b,c)]\nelse{n=m.aW(o,b)\nif(n>=0)o[n].b=c\nelse o.push(m.a9(b,c))}}},\nY(a){var s=this\nif(s.a>0){s.b=s.c=s.d=s.e=s.f=null\ns.a=0\ns.aC()}},\nC(a,b){var s=this,r=s.e,q=s.r\nfor(;r!=null;){b.$2(r.a,r.b)\nif(q!==s.r)throw A.a(A.as(s))\nr=r.c}},\nav(a,b,c){var s=a[b]\nif(s==null)a[b]=this.a9(b,c)\nelse s.b=c},\naC(){this.r=this.r+1&1073741823},\na9(a,b){var s=this,r=new A.cJ(a,b)\nif(s.e==null)s.e=s.f=r\nelse s.f=s.f.c=r;++s.a\ns.aC()\nreturn r},\naV(a){return J.Z(a)&1073741823},\naW(a,b){var s,r\nif(a==null)return-1\ns=a.length\nfor(r=0;r<s;++r)if(J.F(a[r].a,b))return r\nreturn-1},\nh(a){return A.ek(this)},\na8(){var s=Object.create(null)\ns[\"<non-identifier-key>\"]=s\ndelete s[\"<non-identifier-key>\"]\nreturn s}}\nA.cG.prototype={\n$1(a){var s=this.a,r=s.k(0,a)\nreturn r==null?A.E(s).y[1].a(r):r},\n$S(){return A.E(this.a).i(\"2(1)\")}}\nA.cJ.prototype={}\nA.O.prototype={\ngl(a){return this.a.a},\ngB(a){var s=this.a,r=new A.bK(s,s.r)\nr.c=s.e\nreturn r}}\nA.bK.prototype={\ngp(){return this.d},\nm(){var s,r=this,q=r.a\nif(r.b!==q.r)throw A.a(A.as(q))\ns=r.c\nif(s==null){r.d=null\nreturn!1}else{r.d=s.a\nr.c=s.c\nreturn!0}}}\nA.e1.prototype={\n$1(a){return this.a(a)},\n$S:10}\nA.e2.prototype={\n$2(a,b){return this.a(a,b)},\n$S:11}\nA.e3.prototype={\n$1(a){return this.a(a)},\n$S:12}\nA.bf.prototype={\nh(a){return this.aH(!1)},\naH(a){var s,r,q,p,o,n=this.bo(),m=this.aB(),l=(a?\"\"+\"Record \":\"\")+\"(\"\nfor(s=n.length,r=\"\",q=0;q<s;++q,r=\", \"){l+=r\np=n[q]\nif(typeof p==\"string\")l=l+p+\": \"\no=m[q]\nl=a?l+A.f4(o):l+A.i(o)}l+=\")\"\nreturn l.charCodeAt(0)==0?l:l},\nbo(){var s,r=this.$s\nfor(;$.dn.length<=r;)$.dn.push(null)\ns=$.dn[r]\nif(s==null){s=this.bj()\n$.dn[r]=s}return s},\nbj(){var s,r,q,p=this.$r,o=p.indexOf(\"(\"),n=p.substring(1,o),m=p.substring(o),l=m===\"()\"?0:m.replace(/[^,]/g,\"\").length+1,k=t.K,j=J.eX(l,k)\nfor(s=0;s<l;++s)j[s]=s\nif(n!==\"\"){r=n.split(\",\")\ns=r.length\nfor(q=l;s>0;){--q;--s\nj[q]=r[s]}}return J.eY(A.hV(j,!1,k))}}\nA.cf.prototype={\naB(){return[this.a,this.b]},\nF(a,b){if(b==null)return!1\nreturn b instanceof A.cf&&this.$s===b.$s&&J.F(this.a,b.a)&&J.F(this.b,b.b)},\ngn(a){return A.hZ(this.$s,this.a,this.b,B.i)}}\nA.cE.prototype={\nh(a){return\"RegExp/\"+this.a+\"/\"+this.b.flags},\ngbr(){var s=this,r=s.c\nif(r!=null)return r\nr=s.b\nreturn s.c=A.eZ(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,!0)},\nbn(a,b){var s,r=this.gbr()\nr.lastIndex=b\ns=r.exec(a)\nif(s==null)return null\nreturn new A.ce(s)}}\nA.ce.prototype={\ngbD(){var s=this.b\nreturn s.index+s[0].length},\nk(a,b){return this.b[b]},\n$icL:1,\n$iel:1}\nA.d3.prototype={\ngp(){var s=this.d\nreturn s==null?t.F.a(s):s},\nm(){var s,r,q,p,o,n=this,m=n.b\nif(m==null)return!1\ns=n.c\nr=m.length\nif(s<=r){q=n.a\np=q.bn(m,s)\nif(p!=null){n.d=p\no=p.gbD()\nif(p.b.index===o){if(q.b.unicode){s=n.c\nq=s+1\nif(q<r){s=m.charCodeAt(s)\nif(s>=55296&&s<=56319){s=m.charCodeAt(q)\ns=s>=56320&&s<=57343}else s=!1}else s=!1}else s=!1\no=(s?o+1:o)+1}n.c=o\nreturn!0}}n.b=n.d=null\nreturn!1}}\nA.bM.prototype={\ngt(a){return B.ad},\n$ij:1}\nA.aZ.prototype={}\nA.bN.prototype={\ngt(a){return B.ae},\n$ij:1}\nA.aw.prototype={\ngl(a){return a.length},\n$iD:1}\nA.aX.prototype={\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\nq(a,b,c){A.V(b,a,a.length)\na[b]=c},\n$ic:1,\n$if:1}\nA.aY.prototype={\nq(a,b,c){A.V(b,a,a.length)\na[b]=c},\n$ic:1,\n$if:1}\nA.bO.prototype={\ngt(a){return B.af},\n$ij:1}\nA.bP.prototype={\ngt(a){return B.ag},\n$ij:1}\nA.bQ.prototype={\ngt(a){return B.ah},\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\n$ij:1}\nA.bR.prototype={\ngt(a){return B.ai},\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\n$ij:1}\nA.bS.prototype={\ngt(a){return B.aj},\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\n$ij:1}\nA.bT.prototype={\ngt(a){return B.al},\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\n$ij:1}\nA.bU.prototype={\ngt(a){return B.am},\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\n$ij:1}\nA.b_.prototype={\ngt(a){return B.an},\ngl(a){return a.length},\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\n$ij:1}\nA.b0.prototype={\ngt(a){return B.ao},\ngl(a){return a.length},\nk(a,b){A.V(b,a,a.length)\nreturn a[b]},\n$ij:1,\n$ial:1}\nA.bb.prototype={}\nA.bc.prototype={}\nA.bd.prototype={}\nA.be.prototype={}\nA.I.prototype={\ni(a){return A.bl(v.typeUniverse,this,a)},\nA(a){return A.ft(v.typeUniverse,this,a)}}\nA.cb.prototype={}\nA.dA.prototype={\nh(a){return A.C(this.a,null)}}\nA.ca.prototype={\nh(a){return this.a}}\nA.bh.prototype={$iR:1}\nA.d5.prototype={\n$1(a){var s=this.a,r=s.a\ns.a=null\nr.$0()},\n$S:5}\nA.d4.prototype={\n$1(a){var s,r\nthis.a.a=a\ns=this.b\nr=this.c\ns.firstChild?s.removeChild(r):s.appendChild(r)},\n$S:13}\nA.d6.prototype={\n$0(){this.a.$0()},\n$S:6}\nA.d7.prototype={\n$0(){this.a.$0()},\n$S:6}\nA.dy.prototype={\nbf(a,b){if(self.setTimeout!=null)self.setTimeout(A.aF(new A.dz(this,b),0),a)\nelse throw A.a(A.T(\"`setTimeout()` not found.\"))}}\nA.dz.prototype={\n$0(){this.b.$0()},\n$S:0}\nA.c5.prototype={\nae(a){var s,r=this\nif(a==null)a=r.$ti.c.a(a)\nif(!r.b)r.a.aw(a)\nelse{s=r.a\nif(r.$ti.i(\"a0<1>\").b(a))s.az(a)\nelse s.a4(a)}},\naf(a,b){var s=this.a\nif(this.b)s.L(a,b)\nelse s.S(a,b)}}\nA.dK.prototype={\n$1(a){return this.a.$2(0,a)},\n$S:3}\nA.dL.prototype={\n$2(a,b){this.a.$2(1,new A.aN(a,b))},\n$S:14}\nA.dY.prototype={\n$2(a,b){this.a(a,b)},\n$S:15}\nA.bz.prototype={\nh(a){return A.i(this.a)},\n$ik:1,\ngR(){return this.b}}\nA.c7.prototype={\naf(a,b){var s\nA.cn(a,\"error\",t.K)\ns=this.a\nif((s.a&30)!==0)throw A.a(A.fa(\"Future already completed\"))\nif(b==null)b=A.eN(a)\ns.S(a,b)},\naM(a){return this.af(a,null)}}\nA.b7.prototype={\nae(a){var s=this.a\nif((s.a&30)!==0)throw A.a(A.fa(\"Future already completed\"))\ns.aw(a)}}\nA.az.prototype={\nbM(a){if((this.c&15)!==6)return!0\nreturn this.b.b.aq(this.d,a.a)},\nbI(a){var s,r=this.e,q=null,p=a.a,o=this.b.b\nif(t.C.b(r))q=o.bU(r,p,a.b)\nelse q=o.aq(r,p)\ntry{p=q\nreturn p}catch(s){if(t.c.b(A.ae(s))){if((this.c&1)!==0)throw A.a(A.a_(\"The error handler of Future.then must return a value of the returned future's type\",\"onError\"))\nthrow A.a(A.a_(\"The error handler of Future.catchError must return a value of the future's type\",\"onError\"))}else throw s}}}\nA.v.prototype={\naE(a){this.a=this.a&1|4\nthis.c=a},\nau(a,b,c){var s,r,q=$.r\nif(q===B.d){if(b!=null&&!t.C.b(b)&&!t.v.b(b))throw A.a(A.eM(b,\"onError\",u.c))}else if(b!=null)b=A.jq(b,q)\ns=new A.v(q,c.i(\"v<0>\"))\nr=b==null?1:3\nthis.a3(new A.az(s,r,a,b,this.$ti.i(\"@<1>\").A(c).i(\"az<1,2>\")))\nreturn s},\nar(a,b){return this.au(a,null,b)},\naG(a,b,c){var s=new A.v($.r,c.i(\"v<0>\"))\nthis.a3(new A.az(s,19,a,b,this.$ti.i(\"@<1>\").A(c).i(\"az<1,2>\")))\nreturn s},\nbu(a){this.a=this.a&1|16\nthis.c=a},\nT(a){this.a=a.a&30|this.a&1\nthis.c=a.c},\na3(a){var s=this,r=s.a\nif(r<=3){a.a=s.c\ns.c=a}else{if((r&4)!==0){r=s.c\nif((r.a&24)===0){r.a3(a)\nreturn}s.T(r)}A.aC(null,null,s.b,new A.da(s,a))}},\naa(a){var s,r,q,p,o,n=this,m={}\nm.a=a\nif(a==null)return\ns=n.a\nif(s<=3){r=n.c\nn.c=a\nif(r!=null){q=a.a\nfor(p=a;q!=null;p=q,q=o)o=q.a\np.a=r}}else{if((s&4)!==0){s=n.c\nif((s.a&24)===0){s.aa(a)\nreturn}n.T(s)}m.a=n.U(a)\nA.aC(null,null,n.b,new A.dh(m,n))}},\nab(){var s=this.c\nthis.c=null\nreturn this.U(s)},\nU(a){var s,r,q\nfor(s=a,r=null;s!=null;r=s,s=q){q=s.a\ns.a=r}return r},\nbi(a){var s,r,q,p=this\np.a^=2\ntry{a.au(new A.de(p),new A.df(p),t.P)}catch(q){s=A.ae(q)\nr=A.ac(q)\nA.k0(new A.dg(p,s,r))}},\na4(a){var s=this,r=s.ab()\ns.a=8\ns.c=a\nA.ba(s,r)},\nL(a,b){var s=this.ab()\nthis.bu(A.cp(a,b))\nA.ba(this,s)},\naw(a){if(this.$ti.i(\"a0<1>\").b(a)){this.az(a)\nreturn}this.bh(a)},\nbh(a){this.a^=2\nA.aC(null,null,this.b,new A.dc(this,a))},\naz(a){if(this.$ti.b(a)){A.ig(a,this)\nreturn}this.bi(a)},\nS(a,b){this.a^=2\nA.aC(null,null,this.b,new A.db(this,a,b))},\n$ia0:1}\nA.da.prototype={\n$0(){A.ba(this.a,this.b)},\n$S:0}\nA.dh.prototype={\n$0(){A.ba(this.b,this.a.a)},\n$S:0}\nA.de.prototype={\n$1(a){var s,r,q,p=this.a\np.a^=2\ntry{p.a4(p.$ti.c.a(a))}catch(q){s=A.ae(q)\nr=A.ac(q)\np.L(s,r)}},\n$S:5}\nA.df.prototype={\n$2(a,b){this.a.L(a,b)},\n$S:16}\nA.dg.prototype={\n$0(){this.a.L(this.b,this.c)},\n$S:0}\nA.dd.prototype={\n$0(){A.fj(this.a.a,this.b)},\n$S:0}\nA.dc.prototype={\n$0(){this.a.a4(this.b)},\n$S:0}\nA.db.prototype={\n$0(){this.a.L(this.b,this.c)},\n$S:0}\nA.dk.prototype={\n$0(){var s,r,q,p,o,n,m=this,l=null\ntry{q=m.a.a\nl=q.b.b.bS(q.d)}catch(p){s=A.ae(p)\nr=A.ac(p)\nq=m.c&&m.b.a.c.a===s\no=m.a\nif(q)o.c=m.b.a.c\nelse o.c=A.cp(s,r)\no.b=!0\nreturn}if(l instanceof A.v&&(l.a&24)!==0){if((l.a&16)!==0){q=m.a\nq.c=l.c\nq.b=!0}return}if(l instanceof A.v){n=m.b.a\nq=m.a\nq.c=l.ar(new A.dl(n),t.z)\nq.b=!1}},\n$S:0}\nA.dl.prototype={\n$1(a){return this.a},\n$S:17}\nA.dj.prototype={\n$0(){var s,r,q,p,o\ntry{q=this.a\np=q.a\nq.c=p.b.b.aq(p.d,this.b)}catch(o){s=A.ae(o)\nr=A.ac(o)\nq=this.a\nq.c=A.cp(s,r)\nq.b=!0}},\n$S:0}\nA.di.prototype={\n$0(){var s,r,q,p,o,n,m=this\ntry{s=m.a.a.c\np=m.b\nif(p.a.bM(s)&&p.a.e!=null){p.c=p.a.bI(s)\np.b=!1}}catch(o){r=A.ae(o)\nq=A.ac(o)\np=m.a.a.c\nn=m.b\nif(p.a===r)n.c=p\nelse n.c=A.cp(r,q)\nn.b=!0}},\n$S:0}\nA.c6.prototype={}\nA.ci.prototype={}\nA.dJ.prototype={}\nA.dW.prototype={\n$0(){A.hI(this.a,this.b)},\n$S:0}\nA.dq.prototype={\nbW(a){var s,r,q\ntry{if(B.d===$.r){a.$0()\nreturn}A.fT(null,null,this,a)}catch(q){s=A.ae(q)\nr=A.ac(q)\nA.eB(s,r)}},\naJ(a){return new A.dr(this,a)},\nbT(a){if($.r===B.d)return a.$0()\nreturn A.fT(null,null,this,a)},\nbS(a){return this.bT(a,t.z)},\nbX(a,b){if($.r===B.d)return a.$1(b)\nreturn A.js(null,null,this,a,b)},\naq(a,b){var s=t.z\nreturn this.bX(a,b,s,s)},\nbV(a,b,c){if($.r===B.d)return a.$2(b,c)\nreturn A.jr(null,null,this,a,b,c)},\nbU(a,b,c){var s=t.z\nreturn this.bV(a,b,c,s,s,s)},\nbR(a){return a},\nb1(a){var s=t.z\nreturn this.bR(a,s,s,s)}}\nA.dr.prototype={\n$0(){return this.a.bW(this.b)},\n$S:0}\nA.e.prototype={\ngB(a){return new A.au(a,this.gl(a),A.aG(a).i(\"au<e.E>\"))},\nE(a,b){return this.k(a,b)},\nX(a,b){return new A.M(a,A.aG(a).i(\"@<e.E>\").A(b).i(\"M<1,2>\"))},\nbE(a,b,c,d){var s\nA.b3(b,c,this.gl(a))\nfor(s=b;s<c;++s)this.q(a,s,d)},\nh(a){return A.eW(a,\"[\",\"]\")},\n$ic:1,\n$if:1}\nA.P.prototype={\nC(a,b){var s,r,q,p\nfor(s=this.gO(),s=s.gB(s),r=A.E(this).i(\"P.V\");s.m();){q=s.gp()\np=this.k(0,q)\nb.$2(q,p==null?r.a(p):p)}},\ngl(a){var s=this.gO()\nreturn s.gl(s)},\nh(a){return A.ek(this)},\n$ix:1}\nA.cK.prototype={\n$2(a,b){var s,r=this.a\nif(!r.a)this.b.a+=\", \"\nr.a=!1\nr=this.b\ns=A.i(a)\ns=r.a+=s\nr.a=s+\": \"\ns=A.i(b)\nr.a+=s},\n$S:18}\nA.cl.prototype={\nq(a,b,c){throw A.a(A.T(\"Cannot modify unmodifiable map\"))}}\nA.aW.prototype={\nk(a,b){return this.a.k(0,b)},\nq(a,b,c){this.a.q(0,b,c)},\nC(a,b){this.a.C(0,b)},\ngl(a){var s=this.a\nreturn s.gl(s)},\nh(a){return this.a.h(0)},\n$ix:1}\nA.a7.prototype={}\nA.bm.prototype={}\nA.cc.prototype={\nk(a,b){var s,r=this.b\nif(r==null)return this.c.k(0,b)\nelse if(typeof b!=\"string\")return null\nelse{s=r[b]\nreturn typeof s==\"undefined\"?this.bs(b):s}},\ngl(a){return this.b==null?this.c.a:this.M().length},\ngO(){if(this.b==null){var s=this.c\nreturn new A.O(s,A.E(s).i(\"O<1>\"))}return new A.cd(this)},\nq(a,b,c){var s,r,q=this\nif(q.b==null)q.c.q(0,b,c)\nelse if(q.H(b)){s=q.b\ns[b]=c\nr=q.a\nif(r==null?s!=null:r!==s)r[b]=null}else q.by().q(0,b,c)},\nH(a){if(this.b==null)return this.c.H(a)\nreturn Object.prototype.hasOwnProperty.call(this.a,a)},\nC(a,b){var s,r,q,p,o=this\nif(o.b==null)return o.c.C(0,b)\ns=o.M()\nfor(r=0;r<s.length;++r){q=s[r]\np=o.b[q]\nif(typeof p==\"undefined\"){p=A.dM(o.a[q])\no.b[q]=p}b.$2(q,p)\nif(s!==o.c)throw A.a(A.as(o))}},\nM(){var s=this.c\nif(s==null)s=this.c=A.h(Object.keys(this.a),t.s)\nreturn s},\nby(){var s,r,q,p,o,n=this\nif(n.b==null)return n.c\ns=A.ej(t.N,t.z)\nr=n.M()\nfor(q=0;p=r.length,q<p;++q){o=r[q]\ns.q(0,o,n.k(0,o))}if(p===0)r.push(\"\")\nelse B.b.Y(r)\nn.a=n.b=null\nreturn n.c=s},\nbs(a){var s\nif(!Object.prototype.hasOwnProperty.call(this.a,a))return null\ns=A.dM(this.a[a])\nreturn this.b[a]=s}}\nA.cd.prototype={\ngl(a){return this.a.gl(0)},\nE(a,b){var s=this.a\nreturn s.b==null?s.gO().E(0,b):s.M()[b]},\ngB(a){var s=this.a\nif(s.b==null){s=s.gO()\ns=s.gB(s)}else{s=s.M()\ns=new J.ar(s,s.length,A.am(s).i(\"ar<1>\"))}return s}}\nA.dG.prototype={\n$0(){var s,r\ntry{s=new TextDecoder(\"utf-8\",{fatal:true})\nreturn s}catch(r){}return null},\n$S:7}\nA.dF.prototype={\n$0(){var s,r\ntry{s=new TextDecoder(\"utf-8\",{fatal:false})\nreturn s}catch(r){}return null},\n$S:7}\nA.cq.prototype={\nbP(a0,a1,a2){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a=\"Invalid base64 encoding length \"\na2=A.b3(a1,a2,a0.length)\ns=$.hk()\nfor(r=a1,q=r,p=null,o=-1,n=-1,m=0;r<a2;r=l){l=r+1\nk=a0.charCodeAt(r)\nif(k===37){j=l+2\nif(j<=a2){i=A.e0(a0.charCodeAt(l))\nh=A.e0(a0.charCodeAt(l+1))\ng=i*16+h-(h&256)\nif(g===37)g=-1\nl=j}else g=-1}else g=k\nif(0<=g&&g<=127){f=s[g]\nif(f>=0){g=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charCodeAt(f)\nif(g===k)continue\nk=g}else{if(f===-1){if(o<0){e=p==null?null:p.a.length\nif(e==null)e=0\no=e+(r-q)\nn=r}++m\nif(k===61)continue}k=g}if(f!==-2){if(p==null){p=new A.y(\"\")\ne=p}else e=p\ne.a+=B.a.j(a0,q,r)\nd=A.Q(k)\ne.a+=d\nq=l\ncontinue}}throw A.a(A.z(\"Invalid base64 data\",a0,r))}if(p!=null){e=B.a.j(a0,q,a2)\ne=p.a+=e\nd=e.length\nif(o>=0)A.eO(a0,n,a2,o,m,d)\nelse{c=B.c.a1(d-1,4)+1\nif(c===1)throw A.a(A.z(a,a0,a2))\nfor(;c<4;){e+=\"=\"\np.a=e;++c}}e=p.a\nreturn B.a.J(a0,a1,a2,e.charCodeAt(0)==0?e:e)}b=a2-a1\nif(o>=0)A.eO(a0,n,a2,o,m,b)\nelse{c=B.c.a1(b,4)\nif(c===1)throw A.a(A.z(a,a0,a2))\nif(c>1)a0=B.a.J(a0,a2,a2,c===2?\"==\":\"=\")}return a0}}\nA.cr.prototype={}\nA.bC.prototype={}\nA.bE.prototype={}\nA.cv.prototype={}\nA.cy.prototype={\nh(a){return\"unknown\"}}\nA.cx.prototype={\nI(a){var s=this.bl(a,0,a.length)\nreturn s==null?a:s},\nbl(a,b,c){var s,r,q,p\nfor(s=b,r=null;s<c;++s){switch(a[s]){case\"&\":q=\"&amp;\"\nbreak\ncase'\"':q=\"&quot;\"\nbreak\ncase\"'\":q=\"&#39;\"\nbreak\ncase\"<\":q=\"&lt;\"\nbreak\ncase\">\":q=\"&gt;\"\nbreak\ncase\"/\":q=\"&#47;\"\nbreak\ndefault:q=null}if(q!=null){if(r==null)r=new A.y(\"\")\nif(s>b)r.a+=B.a.j(a,b,s)\nr.a+=q\nb=s+1}}if(r==null)return null\nif(c>b){p=B.a.j(a,b,c)\nr.a+=p}p=r.a\nreturn p.charCodeAt(0)==0?p:p}}\nA.cH.prototype={\nbA(a,b){var s=A.jo(a,this.gbC().a)\nreturn s},\ngbC(){return B.L}}\nA.cI.prototype={}\nA.d0.prototype={}\nA.d2.prototype={\nI(a){var s,r,q,p=A.b3(0,null,a.length)\nif(p===0)return new Uint8Array(0)\ns=p*3\nr=new Uint8Array(s)\nq=new A.dH(r)\nif(q.bp(a,0,p)!==p)q.ac()\nreturn new Uint8Array(r.subarray(0,A.iX(0,q.b,s)))}}\nA.dH.prototype={\nac(){var s=this,r=s.c,q=s.b,p=s.b=q+1\nr[q]=239\nq=s.b=p+1\nr[p]=191\ns.b=q+1\nr[q]=189},\nbz(a,b){var s,r,q,p,o=this\nif((b&64512)===56320){s=65536+((a&1023)<<10)|b&1023\nr=o.c\nq=o.b\np=o.b=q+1\nr[q]=s>>>18|240\nq=o.b=p+1\nr[p]=s>>>12&63|128\np=o.b=q+1\nr[q]=s>>>6&63|128\no.b=p+1\nr[p]=s&63|128\nreturn!0}else{o.ac()\nreturn!1}},\nbp(a,b,c){var s,r,q,p,o,n,m,l=this\nif(b!==c&&(a.charCodeAt(c-1)&64512)===55296)--c\nfor(s=l.c,r=s.length,q=b;q<c;++q){p=a.charCodeAt(q)\nif(p<=127){o=l.b\nif(o>=r)break\nl.b=o+1\ns[o]=p}else{o=p&64512\nif(o===55296){if(l.b+4>r)break\nn=q+1\nif(l.bz(p,a.charCodeAt(n)))q=n}else if(o===56320){if(l.b+3>r)break\nl.ac()}else if(p<=2047){o=l.b\nm=o+1\nif(m>=r)break\nl.b=m\ns[o]=p>>>6|192\nl.b=m+1\ns[m]=p&63|128}else{o=l.b\nif(o+2>=r)break\nm=l.b=o+1\ns[o]=p>>>12|224\no=l.b=m+1\ns[m]=p>>>6&63|128\nl.b=o+1\ns[o]=p&63|128}}}return q}}\nA.d1.prototype={\nI(a){return new A.dE(this.a).bm(a,0,null,!0)}}\nA.dE.prototype={\nbm(a,b,c,d){var s,r,q,p,o,n,m=this,l=A.b3(b,c,J.aI(a))\nif(b===l)return\"\"\nif(a instanceof Uint8Array){s=a\nr=s\nq=0}else{r=A.iQ(a,b,l)\nl-=b\nq=b\nb=0}if(l-b>=15){p=m.a\no=A.iP(p,r,b,l)\nif(o!=null){if(!p)return o\nif(o.indexOf(\"\\ufffd\")<0)return o}}o=m.a5(r,b,l,!0)\np=m.b\nif((p&1)!==0){n=A.iR(p)\nm.b=0\nthrow A.a(A.z(n,a,q+m.c))}return o},\na5(a,b,c,d){var s,r,q=this\nif(c-b>1000){s=B.c.bw(b+c,2)\nr=q.a5(a,b,s,!1)\nif((q.b&1)!==0)return r\nreturn r+q.a5(a,s,c,d)}return q.bB(a,b,c,d)},\nbB(a,b,c,d){var s,r,q,p,o,n,m,l=this,k=65533,j=l.b,i=l.c,h=new A.y(\"\"),g=b+1,f=a[b]\n$label0$0:for(s=l.a;!0;){for(;!0;g=p){r=\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE\".charCodeAt(f)&31\ni=j<=32?f&61694>>>r:(f&63|i<<6)>>>0\nj=\" \\x000:XECCCCCN:lDb \\x000:XECCCCCNvlDb \\x000:XECCCCCN:lDb AAAAA\\x00\\x00\\x00\\x00\\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\\x800AAAAA\\x00\\x00\\x00\\x00 AAAAA\".charCodeAt(j+r)\nif(j===0){q=A.Q(i)\nh.a+=q\nif(g===c)break $label0$0\nbreak}else if((j&1)!==0){if(s)switch(j){case 69:case 67:q=A.Q(k)\nh.a+=q\nbreak\ncase 65:q=A.Q(k)\nh.a+=q;--g\nbreak\ndefault:q=A.Q(k)\nq=h.a+=q\nh.a=q+A.Q(k)\nbreak}else{l.b=j\nl.c=g-1\nreturn\"\"}j=0}if(g===c)break $label0$0\np=g+1\nf=a[g]}p=g+1\nf=a[g]\nif(f<128){while(!0){if(!(p<c)){o=c\nbreak}n=p+1\nf=a[p]\nif(f>=128){o=n-1\np=n\nbreak}p=n}if(o-g<20)for(m=g;m<o;++m){q=A.Q(a[m])\nh.a+=q}else{q=A.fc(a,g,o)\nh.a+=q}if(o===c)break $label0$0\ng=p}else g=p}if(d&&j>32)if(s){s=A.Q(k)\nh.a+=s}else{l.b=77\nl.c=c\nreturn\"\"}l.b=j\nl.c=i\ns=h.a\nreturn s.charCodeAt(0)==0?s:s}}\nA.cM.prototype={\n$2(a,b){var s=this.b,r=this.a,q=s.a+=r.a\nq+=a.a\ns.a=q\ns.a=q+\": \"\nq=A.at(b)\ns.a+=q\nr.a=\", \"},\n$S:19}\nA.dD.prototype={\n$2(a,b){var s,r\nif(typeof b==\"string\")this.a.set(a,b)\nelse if(b==null)this.a.set(a,\"\")\nelse for(s=J.L(b),r=this.a;s.m();){b=s.gp()\nif(typeof b==\"string\")r.append(a,b)\nelse if(b==null)r.append(a,\"\")\nelse A.iT(b)}},\n$S:2}\nA.d8.prototype={\nh(a){return this.aA()}}\nA.k.prototype={\ngR(){return A.i2(this)}}\nA.bx.prototype={\nh(a){var s=this.a\nif(s!=null)return\"Assertion failed: \"+A.at(s)\nreturn\"Assertion failed\"}}\nA.R.prototype={}\nA.G.prototype={\nga7(){return\"Invalid argument\"+(!this.a?\"(s)\":\"\")},\nga6(){return\"\"},\nh(a){var s=this,r=s.c,q=r==null?\"\":\" (\"+r+\")\",p=s.d,o=p==null?\"\":\": \"+p,n=s.ga7()+q+o\nif(!s.a)return n\nreturn n+s.ga6()+\": \"+A.at(s.gal())},\ngal(){return this.b}}\nA.b2.prototype={\ngal(){return this.b},\nga7(){return\"RangeError\"},\nga6(){var s,r=this.e,q=this.f\nif(r==null)s=q!=null?\": Not less than or equal to \"+A.i(q):\"\"\nelse if(q==null)s=\": Not greater than or equal to \"+A.i(r)\nelse if(q>r)s=\": Not in inclusive range \"+A.i(r)+\"..\"+A.i(q)\nelse s=q<r?\": Valid value range is empty\":\": Only valid value is \"+A.i(r)\nreturn s}}\nA.bF.prototype={\ngal(){return this.b},\nga7(){return\"RangeError\"},\nga6(){if(this.b<0)return\": index must not be negative\"\nvar s=this.f\nif(s===0)return\": no indices are valid\"\nreturn\": index should be less than \"+s},\ngl(a){return this.f}}\nA.bV.prototype={\nh(a){var s,r,q,p,o,n,m,l,k=this,j={},i=new A.y(\"\")\nj.a=\"\"\ns=k.c\nfor(r=s.length,q=0,p=\"\",o=\"\";q<r;++q,o=\", \"){n=s[q]\ni.a=p+o\np=A.at(n)\np=i.a+=p\nj.a=\", \"}k.d.C(0,new A.cM(j,i))\nm=A.at(k.a)\nl=i.h(0)\nreturn\"NoSuchMethodError: method not found: '\"+k.b.a+\"'\\nReceiver: \"+m+\"\\nArguments: [\"+l+\"]\"}}\nA.c2.prototype={\nh(a){return\"Unsupported operation: \"+this.a}}\nA.c_.prototype={\nh(a){return\"UnimplementedError: \"+this.a}}\nA.b5.prototype={\nh(a){return\"Bad state: \"+this.a}}\nA.bD.prototype={\nh(a){var s=this.a\nif(s==null)return\"Concurrent modification during iteration.\"\nreturn\"Concurrent modification during iteration: \"+A.at(s)+\".\"}}\nA.bW.prototype={\nh(a){return\"Out of Memory\"},\ngR(){return null},\n$ik:1}\nA.b4.prototype={\nh(a){return\"Stack Overflow\"},\ngR(){return null},\n$ik:1}\nA.d9.prototype={\nh(a){return\"Exception: \"+this.a}}\nA.cw.prototype={\nh(a){var s,r,q,p,o,n,m,l,k,j,i,h=this.a,g=\"\"!==h?\"FormatException: \"+h:\"FormatException\",f=this.c,e=this.b\nif(typeof e==\"string\"){if(f!=null)s=f<0||f>e.length\nelse s=!1\nif(s)f=null\nif(f==null){if(e.length>78)e=B.a.j(e,0,75)+\"...\"\nreturn g+\"\\n\"+e}for(r=1,q=0,p=!1,o=0;o<f;++o){n=e.charCodeAt(o)\nif(n===10){if(q!==o||!p)++r\nq=o+1\np=!1}else if(n===13){++r\nq=o+1\np=!0}}g=r>1?g+(\" (at line \"+r+\", character \"+(f-q+1)+\")\\n\"):g+(\" (at character \"+(f+1)+\")\\n\")\nm=e.length\nfor(o=f;o<m;++o){n=e.charCodeAt(o)\nif(n===10||n===13){m=o\nbreak}}if(m-q>78)if(f-q<75){l=q+75\nk=q\nj=\"\"\ni=\"...\"}else{if(m-f<75){k=m-75\nl=m\ni=\"\"}else{k=f-36\nl=f+36\ni=\"...\"}j=\"...\"}else{l=m\nk=q\nj=\"\"\ni=\"\"}return g+j+B.a.j(e,k,l)+i+\"\\n\"+B.a.b9(\" \",f-k+j.length)+\"^\\n\"}else return f!=null?g+(\" (at offset \"+A.i(f)+\")\"):g}}\nA.n.prototype={\nX(a,b){return A.hA(this,A.E(this).i(\"n.E\"),b)},\ngl(a){var s,r=this.gB(this)\nfor(s=0;r.m();)++s\nreturn s},\nE(a,b){var s,r\nA.f5(b,\"index\")\ns=this.gB(this)\nfor(r=b;s.m();){if(r===0)return s.gp();--r}throw A.a(A.eU(b,b-r,this,\"index\"))},\nh(a){return A.hP(this,\"(\",\")\")}}\nA.u.prototype={\ngn(a){return A.l.prototype.gn.call(this,0)},\nh(a){return\"null\"}}\nA.l.prototype={$il:1,\nF(a,b){return this===b},\ngn(a){return A.bY(this)},\nh(a){return\"Instance of '\"+A.cQ(this)+\"'\"},\nb_(a,b){throw A.a(A.f1(this,b))},\ngt(a){return A.jL(this)},\ntoString(){return this.h(this)}}\nA.cj.prototype={\nh(a){return\"\"},\n$ia4:1}\nA.y.prototype={\ngl(a){return this.a.length},\nh(a){var s=this.a\nreturn s.charCodeAt(0)==0?s:s}}\nA.d_.prototype={\n$2(a,b){var s,r,q,p=B.a.aU(b,\"=\")\nif(p===-1){if(b!==\"\")a.q(0,A.ew(b,0,b.length,this.a,!0),\"\")}else if(p!==0){s=B.a.j(b,0,p)\nr=B.a.K(b,p+1)\nq=this.a\na.q(0,A.ew(s,0,s.length,q,!0),A.ew(r,0,r.length,q,!0))}return a},\n$S:20}\nA.cX.prototype={\n$2(a,b){throw A.a(A.z(\"Illegal IPv4 address, \"+a,this.a,b))},\n$S:21}\nA.cY.prototype={\n$2(a,b){throw A.a(A.z(\"Illegal IPv6 address, \"+a,this.a,b))},\n$S:22}\nA.cZ.prototype={\n$2(a,b){var s\nif(b-a>4)this.a.$2(\"an IPv6 part can only contain a maximum of 4 hex digits\",a)\ns=A.e8(B.a.j(this.b,a,b),16)\nif(s<0||s>65535)this.a.$2(\"each part must be in the range of `0x0..0xFFFF`\",a)\nreturn s},\n$S:23}\nA.bn.prototype={\ngW(){var s,r,q,p,o=this,n=o.w\nif(n===$){s=o.a\nr=s.length!==0?\"\"+s+\":\":\"\"\nq=o.c\np=q==null\nif(!p||s===\"file\"){s=r+\"//\"\nr=o.b\nif(r.length!==0)s=s+r+\"@\"\nif(!p)s+=q\nr=o.d\nif(r!=null)s=s+\":\"+A.i(r)}else s=r\ns+=o.e\nr=o.f\nif(r!=null)s=s+\"?\"+r\nr=o.r\nif(r!=null)s=s+\"#\"+r\nn!==$&&A.bv()\nn=o.w=s.charCodeAt(0)==0?s:s}return n},\ngn(a){var s,r=this,q=r.y\nif(q===$){s=B.a.gn(r.gW())\nr.y!==$&&A.bv()\nr.y=s\nq=s}return q},\ngao(){var s,r=this,q=r.z\nif(q===$){s=r.f\ns=A.fh(s==null?\"\":s)\nr.z!==$&&A.bv()\nq=r.z=new A.a7(s,t.h)}return q},\ngb4(){return this.b},\ngaj(){var s=this.c\nif(s==null)return\"\"\nif(B.a.u(s,\"[\"))return B.a.j(s,1,s.length-1)\nreturn s},\nga0(){var s=this.d\nreturn s==null?A.fu(this.a):s},\ngan(){var s=this.f\nreturn s==null?\"\":s},\ngaO(){var s=this.r\nreturn s==null?\"\":s},\nap(a){var s,r,q,p,o=this,n=o.a,m=n===\"file\",l=o.b,k=o.d,j=o.c\nif(!(j!=null))j=l.length!==0||k!=null||m?\"\":null\ns=o.e\nif(!m)r=j!=null&&s.length!==0\nelse r=!0\nif(r&&!B.a.u(s,\"/\"))s=\"/\"+s\nq=s\np=A.eu(null,0,0,a)\nreturn A.es(n,l,j,k,q,p,o.r)},\ngaX(){if(this.a!==\"\"){var s=this.r\ns=(s==null?\"\":s)===\"\"}else s=!1\nreturn s},\ngaQ(){return this.c!=null},\ngaT(){return this.f!=null},\ngaR(){return this.r!=null},\nh(a){return this.gW()},\nF(a,b){var s,r,q=this\nif(b==null)return!1\nif(q===b)return!0\nif(t.R.b(b))if(q.a===b.ga2())if(q.c!=null===b.gaQ())if(q.b===b.gb4())if(q.gaj()===b.gaj())if(q.ga0()===b.ga0())if(q.e===b.gb0()){s=q.f\nr=s==null\nif(!r===b.gaT()){if(r)s=\"\"\nif(s===b.gan()){s=q.r\nr=s==null\nif(!r===b.gaR()){if(r)s=\"\"\ns=s===b.gaO()}else s=!1}else s=!1}else s=!1}else s=!1\nelse s=!1\nelse s=!1\nelse s=!1\nelse s=!1\nelse s=!1\nelse s=!1\nreturn s},\n$ic3:1,\nga2(){return this.a},\ngb0(){return this.e}}\nA.dC.prototype={\n$2(a,b){var s=this.b,r=this.a\ns.a+=r.a\nr.a=\"&\"\nr=A.fA(B.h,a,B.e,!0)\nr=s.a+=r\nif(b!=null&&b.length!==0){s.a=r+\"=\"\nr=A.fA(B.h,b,B.e,!0)\ns.a+=r}},\n$S:24}\nA.dB.prototype={\n$2(a,b){var s,r\nif(b==null||typeof b==\"string\")this.a.$2(a,b)\nelse for(s=J.L(b),r=this.a;s.m();)r.$2(a,s.gp())},\n$S:2}\nA.cW.prototype={\ngb3(){var s,r,q,p,o=this,n=null,m=o.c\nif(m==null){m=o.a\ns=o.b[0]+1\nr=B.a.Z(m,\"?\",s)\nq=m.length\nif(r>=0){p=A.bo(m,r+1,q,B.f,!1,!1)\nq=r}else p=n\nm=o.c=new A.c9(\"data\",\"\",n,n,A.bo(m,s,q,B.p,!1,!1),p,n)}return m},\nh(a){var s=this.a\nreturn this.b[0]===-1?\"data:\"+s:s}}\nA.dP.prototype={\n$2(a,b){var s=this.a[a]\nB.ab.bE(s,0,96,b)\nreturn s},\n$S:25}\nA.dQ.prototype={\n$3(a,b,c){var s,r\nfor(s=b.length,r=0;r<s;++r)a[b.charCodeAt(r)^96]=c},\n$S:8}\nA.dR.prototype={\n$3(a,b,c){var s,r\nfor(s=b.charCodeAt(0),r=b.charCodeAt(1);s<=r;++s)a[(s^96)>>>0]=c},\n$S:8}\nA.ch.prototype={\ngaQ(){return this.c>0},\ngaS(){return this.c>0&&this.d+1<this.e},\ngaT(){return this.f<this.r},\ngaR(){return this.r<this.a.length},\ngaX(){return this.b>0&&this.r>=this.a.length},\nga2(){var s=this.w\nreturn s==null?this.w=this.bk():s},\nbk(){var s,r=this,q=r.b\nif(q<=0)return\"\"\ns=q===4\nif(s&&B.a.u(r.a,\"http\"))return\"http\"\nif(q===5&&B.a.u(r.a,\"https\"))return\"https\"\nif(s&&B.a.u(r.a,\"file\"))return\"file\"\nif(q===7&&B.a.u(r.a,\"package\"))return\"package\"\nreturn B.a.j(r.a,0,q)},\ngb4(){var s=this.c,r=this.b+3\nreturn s>r?B.a.j(this.a,r,s-1):\"\"},\ngaj(){var s=this.c\nreturn s>0?B.a.j(this.a,s,this.d):\"\"},\nga0(){var s,r=this\nif(r.gaS())return A.e8(B.a.j(r.a,r.d+1,r.e),null)\ns=r.b\nif(s===4&&B.a.u(r.a,\"http\"))return 80\nif(s===5&&B.a.u(r.a,\"https\"))return 443\nreturn 0},\ngb0(){return B.a.j(this.a,this.e,this.f)},\ngan(){var s=this.f,r=this.r\nreturn s<r?B.a.j(this.a,s+1,r):\"\"},\ngaO(){var s=this.r,r=this.a\nreturn s<r.length?B.a.K(r,s+1):\"\"},\ngao(){if(this.f>=this.r)return B.aa\nreturn new A.a7(A.fh(this.gan()),t.h)},\nap(a){var s,r,q,p,o,n=this,m=null,l=n.ga2(),k=l===\"file\",j=n.c,i=j>0?B.a.j(n.a,n.b+3,j):\"\",h=n.gaS()?n.ga0():m\nj=n.c\nif(j>0)s=B.a.j(n.a,j,n.d)\nelse s=i.length!==0||h!=null||k?\"\":m\nj=n.a\nr=B.a.j(j,n.e,n.f)\nif(!k)q=s!=null&&r.length!==0\nelse q=!0\nif(q&&!B.a.u(r,\"/\"))r=\"/\"+r\np=A.eu(m,0,0,a)\nq=n.r\no=q<j.length?B.a.K(j,q+1):m\nreturn A.es(l,i,s,h,r,p,o)},\ngn(a){var s=this.x\nreturn s==null?this.x=B.a.gn(this.a):s},\nF(a,b){if(b==null)return!1\nif(this===b)return!0\nreturn t.R.b(b)&&this.a===b.h(0)},\nh(a){return this.a},\n$ic3:1}\nA.c9.prototype={}\nA.ec.prototype={\n$1(a){return this.a.ae(a)},\n$S:3}\nA.ed.prototype={\n$1(a){if(a==null)return this.a.aM(new A.cN(a===undefined))\nreturn this.a.aM(a)},\n$S:3}\nA.cN.prototype={\nh(a){return\"Promise was rejected with a value of `\"+(this.a?\"undefined\":\"null\")+\"`.\"}}\nA.m.prototype={\naA(){return\"Kind.\"+this.b},\nh(a){var s\nswitch(this.a){case 0:s=\"accessor\"\nbreak\ncase 1:s=\"constant\"\nbreak\ncase 2:s=\"constructor\"\nbreak\ncase 3:s=\"class\"\nbreak\ncase 4:s=\"dynamic\"\nbreak\ncase 5:s=\"enum\"\nbreak\ncase 6:s=\"extension\"\nbreak\ncase 7:s=\"extension type\"\nbreak\ncase 8:s=\"function\"\nbreak\ncase 9:s=\"library\"\nbreak\ncase 10:s=\"method\"\nbreak\ncase 11:s=\"mixin\"\nbreak\ncase 12:s=\"Never\"\nbreak\ncase 13:s=\"package\"\nbreak\ncase 14:s=\"parameter\"\nbreak\ncase 15:s=\"prefix\"\nbreak\ncase 16:s=\"property\"\nbreak\ncase 17:s=\"SDK\"\nbreak\ncase 18:s=\"topic\"\nbreak\ncase 19:s=\"top-level constant\"\nbreak\ncase 20:s=\"top-level property\"\nbreak\ncase 21:s=\"typedef\"\nbreak\ncase 22:s=\"type parameter\"\nbreak\ndefault:s=null}return s}}\nA.A.prototype={\naA(){return\"_MatchPosition.\"+this.b}}\nA.cz.prototype={\naN(a){var s,r,q,p,o,n,m,l,k,j,i\nif(a.length===0)return A.h([],t.M)\ns=a.toLowerCase()\nr=A.h([],t.r)\nfor(q=this.a,p=q.length,o=s.length>1,n=\"dart:\"+s,m=0;m<q.length;q.length===p||(0,A.co)(q),++m){l=q[m]\nk=new A.cC(r,l)\nj=l.a.toLowerCase()\ni=l.b.toLowerCase()\nif(j===s||i===s||j===n)k.$1(B.aq)\nelse if(o)if(B.a.u(j,s)||B.a.u(i,s))k.$1(B.ar)\nelse if(B.a.ag(j,s)||B.a.ag(i,s))k.$1(B.as)}B.b.bc(r,new A.cA())\nq=t.V\nreturn A.bL(new A.ak(r,new A.cB(),q),!0,q.i(\"J.E\"))}}\nA.cC.prototype={\n$1(a){this.a.push(new A.cg(this.b,a))},\n$S:26}\nA.cA.prototype={\n$2(a,b){var s,r,q=a.b.a-b.b.a\nif(q!==0)return q\ns=a.a\nr=b.a\nq=s.c-r.c\nif(q!==0)return q\nq=s.gaD()-r.gaD()\nif(q!==0)return q\nq=s.f-r.f\nif(q!==0)return q\nreturn s.a.length-r.a.length},\n$S:27}\nA.cB.prototype={\n$1(a){return a.a},\n$S:28}\nA.w.prototype={\ngaD(){switch(this.d.a){case 3:var s=0\nbreak\ncase 5:s=0\nbreak\ncase 6:s=0\nbreak\ncase 7:s=0\nbreak\ncase 11:s=0\nbreak\ncase 19:s=0\nbreak\ncase 20:s=0\nbreak\ncase 21:s=0\nbreak\ncase 0:s=1\nbreak\ncase 1:s=1\nbreak\ncase 2:s=1\nbreak\ncase 8:s=1\nbreak\ncase 10:s=1\nbreak\ncase 16:s=1\nbreak\ncase 9:s=2\nbreak\ncase 13:s=2\nbreak\ncase 18:s=2\nbreak\ncase 4:s=3\nbreak\ncase 12:s=3\nbreak\ncase 14:s=3\nbreak\ncase 15:s=3\nbreak\ncase 17:s=3\nbreak\ncase 22:s=3\nbreak\ndefault:s=null}return s}}\nA.cu.prototype={}\nA.dT.prototype={\n$0(){var s,r=self.document.body\nif(r==null)return\"\"\nif(J.F(r.getAttribute(\"data-using-base-href\"),\"false\")){s=r.getAttribute(\"data-base-href\")\nreturn s==null?\"\":s}else return\"\"},\n$S:29}\nA.e6.prototype={\n$0(){A.jZ(\"Could not activate search functionality.\")\nvar s=this.a\nif(s!=null)s.placeholder=\"Failed to initialize search\"\ns=this.b\nif(s!=null)s.placeholder=\"Failed to initialize search\"\ns=this.c\nif(s!=null)s.placeholder=\"Failed to initialize search\"},\n$S:0}\nA.e5.prototype={\n$1(a){return this.b8(a)},\nb8(a){var s=0,r=A.fS(t.P),q,p=this,o,n,m,l,k,j,i,h,g\nvar $async$$1=A.fZ(function(b,c){if(b===1)return A.fI(c,r)\nwhile(true)switch(s){case 0:if(!J.F(a.status,200)){p.a.$0()\ns=1\nbreak}i=J\nh=t.j\ng=B.E\ns=3\nreturn A.fH(A.eb(a.text(),t.N),$async$$1)\ncase 3:o=i.ht(h.a(g.bA(c,null)),t.a)\nn=o.$ti.i(\"ak<e.E,w>\")\nm=new A.cz(A.bL(new A.ak(o,A.k1(),n),!0,n.i(\"J.E\")))\nn=self\nl=A.c4(J.aq(n.window.location)).gao().k(0,\"search\")\nif(l!=null){k=m.aN(l)\nif(k.length!==0){j=B.b.gbF(k).e\nif(j!=null){n.window.location.assign($.bw()+j)\ns=1\nbreak}}}n=p.b\nif(n!=null)A.eo(m).ak(n)\nn=p.c\nif(n!=null)A.eo(m).ak(n)\nn=p.d\nif(n!=null)A.eo(m).ak(n)\ncase 1:return A.fJ(q,r)}})\nreturn A.fK($async$$1,r)},\n$S:9}\nA.ds.prototype={\ngG(){var s,r=this,q=r.c\nif(q===$){s=self.document.createElement(\"div\")\ns.setAttribute(\"role\",\"listbox\")\ns.setAttribute(\"aria-expanded\",\"false\")\ns.style.display=\"none\"\ns.classList.add(\"tt-menu\")\ns.appendChild(r.gaZ())\ns.appendChild(r.gP())\nr.c!==$&&A.bv()\nr.c=s\nq=s}return q},\ngaZ(){var s,r=this.d\nif(r===$){s=self.document.createElement(\"div\")\ns.classList.add(\"enter-search-message\")\nthis.d!==$&&A.bv()\nthis.d=s\nr=s}return r},\ngP(){var s,r=this.e\nif(r===$){s=self.document.createElement(\"div\")\ns.classList.add(\"tt-search-results\")\nthis.e!==$&&A.bv()\nthis.e=s\nr=s}return r},\nak(a){var s,r,q,p=this\na.disabled=!1\na.setAttribute(\"placeholder\",\"Search API Docs\")\ns=self\ns.document.addEventListener(\"keydown\",t.g.a(A.ab(new A.dt(a))))\nr=s.document.createElement(\"div\")\nr.classList.add(\"tt-wrapper\")\na.replaceWith(r)\na.setAttribute(\"autocomplete\",\"off\")\na.setAttribute(\"spellcheck\",\"false\")\na.classList.add(\"tt-input\")\nr.appendChild(a)\nr.appendChild(p.gG())\np.ba(a)\nif(J.hv(s.window.location.href,\"search.html\")){q=p.b.gao().k(0,\"q\")\nif(q==null)return\nq=B.k.I(q)\n$.eD=$.dX\np.bK(q,!0)\np.bb(q)\np.ai()\n$.eD=10}},\nbb(a){var s,r,q,p,o,n=self,m=n.document.getElementById(\"dartdoc-main-content\")\nif(m==null)return\nm.textContent=\"\"\ns=n.document.createElement(\"section\")\ns.classList.add(\"search-summary\")\nm.appendChild(s)\ns=n.document.createElement(\"h2\")\ns.innerHTML=\"Search Results\"\nm.appendChild(s)\ns=n.document.createElement(\"div\")\ns.classList.add(\"search-summary\")\ns.innerHTML=\"\"+$.dX+' results for \"'+a+'\"'\nm.appendChild(s)\nif($.bq.a!==0)for(n=$.bq.gb5(),s=A.E(n),s=s.i(\"@<1>\").A(s.y[1]),n=new A.av(J.L(n.a),n.b,s.i(\"av<1,2>\")),s=s.y[1];n.m();){r=n.a\nif(r==null)r=s.a(r)\nm.appendChild(r)}else{q=n.document.createElement(\"div\")\nq.classList.add(\"search-summary\")\nq.innerHTML='There was not a match for \"'+a+'\". Want to try searching from additional Dart-related sites? '\np=A.c4(\"https://dart.dev/search?cx=011220921317074318178%3A_yy-tmb5t_i&ie=UTF-8&hl=en&q=\").ap(A.f_([\"q\",a],t.N,t.z))\no=n.document.createElement(\"a\")\no.setAttribute(\"href\",p.gW())\no.textContent=\"Search on dart.dev.\"\nq.appendChild(o)\nm.appendChild(q)}},\nai(){var s=this.gG()\ns.style.display=\"none\"\ns.setAttribute(\"aria-expanded\",\"false\")\nreturn s},\nb2(a,b,c){var s,r,q,p,o=this\no.x=A.h([],t.M)\ns=o.w\nB.b.Y(s)\n$.bq.Y(0)\no.gP().textContent=\"\"\nr=b.length\nif(r===0){o.ai()\nreturn}for(q=0;q<b.length;b.length===r||(0,A.co)(b),++q)s.push(A.iZ(a,b[q]))\nfor(r=J.L(c?$.bq.gb5():s);r.m();){p=r.gp()\no.gP().appendChild(p)}o.x=b\no.y=-1\nif(o.gP().hasChildNodes()){r=o.gG()\nr.style.display=\"block\"\nr.setAttribute(\"aria-expanded\",\"true\")}r=$.dX\nr=r>10?'Press \"Enter\" key to see all '+r+\" results\":\"\"\no.gaZ().textContent=r},\nbY(a,b){return this.b2(a,b,!1)},\nah(a,b,c){var s,r,q,p=this\nif(p.r===a&&!b)return\nif(a.length===0){p.bY(\"\",A.h([],t.M))\nreturn}s=p.a.aN(a)\nr=s.length\n$.dX=r\nq=$.eD\nif(r>q)s=B.b.bd(s,0,q)\np.r=a\np.b2(a,s,c)},\nbK(a,b){return this.ah(a,!1,b)},\naP(a){return this.ah(a,!1,!1)},\nbJ(a,b){return this.ah(a,b,!1)},\naK(a){var s,r=this\nr.y=-1\ns=r.f\nif(s!=null){a.value=s\nr.f=null}r.ai()},\nba(a){var s=this,r=t.g\na.addEventListener(\"focus\",r.a(A.ab(new A.du(s,a))))\na.addEventListener(\"blur\",r.a(A.ab(new A.dv(s,a))))\na.addEventListener(\"input\",r.a(A.ab(new A.dw(s,a))))\na.addEventListener(\"keydown\",r.a(A.ab(new A.dx(s,a))))}}\nA.dt.prototype={\n$1(a){if(J.F(a.key,\"/\")&&!t.m.b(self.document.activeElement)){a.preventDefault()\nthis.a.focus()}},\n$S:1}\nA.du.prototype={\n$1(a){this.a.bJ(this.b.value,!0)},\n$S:1}\nA.dv.prototype={\n$1(a){this.a.aK(this.b)},\n$S:1}\nA.dw.prototype={\n$1(a){this.a.aP(this.b.value)},\n$S:1}\nA.dx.prototype={\n$1(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=this\nif(!J.F(a.type,\"keydown\"))return\nif(J.F(a.code,\"Enter\")){a.preventDefault()\ns=e.a\nr=s.y\nif(r!==-1){q=s.w[r].getAttribute(\"data-href\")\nif(q!=null)self.window.location.assign($.bw()+q)\nreturn}else{p=B.k.I(s.r)\no=A.c4($.bw()+\"search.html\").ap(A.f_([\"q\",p],t.N,t.z))\nself.window.location.assign(o.gW())\nreturn}}s=e.a\nr=s.w\nn=r.length-1\nm=s.y\nif(J.F(a.code,\"ArrowUp\")){l=s.y\nif(l===-1)s.y=n\nelse s.y=l-1}else if(J.F(a.code,\"ArrowDown\")){l=s.y\nif(l===n)s.y=-1\nelse s.y=l+1}else if(J.F(a.code,\"Escape\"))s.aK(e.b)\nelse{if(s.f!=null){s.f=null\ns.aP(e.b.value)}return}l=m!==-1\nif(l)r[m].classList.remove(\"tt-cursor\")\nk=s.y\nif(k!==-1){j=r[k]\nj.classList.add(\"tt-cursor\")\nr=s.y\nif(r===0)s.gG().scrollTop=0\nelse if(r===n)s.gG().scrollTop=s.gG().scrollHeight\nelse{i=j.offsetTop\nh=s.gG().offsetHeight\nif(i<h||h<i+j.offsetHeight)j.scrollIntoView()}if(s.f==null)s.f=e.b.value\ne.b.value=s.x[s.y].a}else{g=s.f\nif(g!=null){r=l\nf=g}else{f=null\nr=!1}if(r){e.b.value=f\ns.f=null}}a.preventDefault()},\n$S:1}\nA.dN.prototype={\n$1(a){a.preventDefault()},\n$S:1}\nA.dO.prototype={\n$1(a){var s=this.a.e\nif(s!=null){self.window.location.assign($.bw()+s)\na.preventDefault()}},\n$S:1}\nA.dS.prototype={\n$1(a){return\"<strong class='tt-highlight'>\"+A.i(a.k(0,0))+\"</strong>\"},\n$S:30}\nA.dU.prototype={\n$1(a){var s=this.a\nif(s!=null)s.classList.toggle(\"active\")\ns=this.b\nif(s!=null)s.classList.toggle(\"active\")},\n$S:1}\nA.dV.prototype={\n$1(a){return this.b7(a)},\nb7(a){var s=0,r=A.fS(t.P),q,p=this,o,n,m\nvar $async$$1=A.fZ(function(b,c){if(b===1)return A.fI(c,r)\nwhile(true)switch(s){case 0:if(!J.F(a.status,200)){o=self.document.createElement(\"a\")\no.href=\"https://dart.dev/tools/dart-doc#troubleshoot\"\no.text=\"Failed to load sidebar. Visit dart.dev for help troubleshooting.\"\np.a.appendChild(o)\ns=1\nbreak}s=3\nreturn A.fH(A.eb(a.text(),t.N),$async$$1)\ncase 3:n=c\nm=self.document.createElement(\"div\")\nm.innerHTML=n\nA.fY(p.b,m)\np.a.appendChild(m)\ncase 1:return A.fJ(q,r)}})\nreturn A.fK($async$$1,r)},\n$S:9}\nA.e7.prototype={\n$0(){var s=this.a,r=this.b\nif(s.checked){r.setAttribute(\"class\",\"dark-theme\")\ns.setAttribute(\"value\",\"dark-theme\")\nself.window.localStorage.setItem(\"colorTheme\",\"true\")}else{r.setAttribute(\"class\",\"light-theme\")\ns.setAttribute(\"value\",\"light-theme\")\nself.window.localStorage.setItem(\"colorTheme\",\"false\")}},\n$S:0}\nA.e4.prototype={\n$1(a){this.a.$0()},\n$S:1};(function aliases(){var s=J.a2.prototype\ns.be=s.h})();(function installTearOffs(){var s=hunkHelpers._static_2,r=hunkHelpers._static_1,q=hunkHelpers._static_0\ns(J,\"ja\",\"hT\",31)\nr(A,\"jA\",\"ic\",4)\nr(A,\"jB\",\"id\",4)\nr(A,\"jC\",\"ie\",4)\nq(A,\"h0\",\"ju\",0)\nr(A,\"k1\",\"hL\",32)})();(function inheritance(){var s=hunkHelpers.mixin,r=hunkHelpers.inherit,q=hunkHelpers.inheritMany\nr(A.l,null)\nq(A.l,[A.eh,J.bG,J.ar,A.n,A.bA,A.k,A.e,A.cR,A.au,A.av,A.aO,A.c1,A.a5,A.bf,A.aW,A.aK,A.cD,A.ag,A.cU,A.cO,A.aN,A.bg,A.dp,A.P,A.cJ,A.bK,A.cE,A.ce,A.d3,A.I,A.cb,A.dA,A.dy,A.c5,A.bz,A.c7,A.az,A.v,A.c6,A.ci,A.dJ,A.cl,A.bC,A.bE,A.cy,A.dH,A.dE,A.d8,A.bW,A.b4,A.d9,A.cw,A.u,A.cj,A.y,A.bn,A.cW,A.ch,A.cN,A.cz,A.w,A.cu,A.ds])\nq(J.bG,[J.bH,J.aQ,J.aT,J.aS,J.aU,J.aR,J.ai])\nq(J.aT,[J.a2,J.o,A.bM,A.aZ])\nq(J.a2,[J.bX,J.ax,J.a1])\nr(J.cF,J.o)\nq(J.aR,[J.aP,J.bI])\nq(A.n,[A.a8,A.c,A.aj])\nq(A.a8,[A.af,A.bp])\nr(A.b9,A.af)\nr(A.b8,A.bp)\nr(A.M,A.b8)\nq(A.k,[A.aV,A.R,A.bJ,A.c0,A.c8,A.bZ,A.ca,A.bx,A.G,A.bV,A.c2,A.c_,A.b5,A.bD])\nr(A.ay,A.e)\nr(A.bB,A.ay)\nq(A.c,[A.J,A.O])\nr(A.aM,A.aj)\nq(A.J,[A.ak,A.cd])\nr(A.cf,A.bf)\nr(A.cg,A.cf)\nr(A.bm,A.aW)\nr(A.a7,A.bm)\nr(A.aL,A.a7)\nr(A.ah,A.aK)\nq(A.ag,[A.ct,A.cs,A.cT,A.cG,A.e1,A.e3,A.d5,A.d4,A.dK,A.de,A.dl,A.dQ,A.dR,A.ec,A.ed,A.cC,A.cB,A.e5,A.dt,A.du,A.dv,A.dw,A.dx,A.dN,A.dO,A.dS,A.dU,A.dV,A.e4])\nq(A.ct,[A.cP,A.e2,A.dL,A.dY,A.df,A.cK,A.cM,A.dD,A.d_,A.cX,A.cY,A.cZ,A.dC,A.dB,A.dP,A.cA])\nr(A.b1,A.R)\nq(A.cT,[A.cS,A.aJ])\nq(A.P,[A.N,A.cc])\nq(A.aZ,[A.bN,A.aw])\nq(A.aw,[A.bb,A.bd])\nr(A.bc,A.bb)\nr(A.aX,A.bc)\nr(A.be,A.bd)\nr(A.aY,A.be)\nq(A.aX,[A.bO,A.bP])\nq(A.aY,[A.bQ,A.bR,A.bS,A.bT,A.bU,A.b_,A.b0])\nr(A.bh,A.ca)\nq(A.cs,[A.d6,A.d7,A.dz,A.da,A.dh,A.dg,A.dd,A.dc,A.db,A.dk,A.dj,A.di,A.dW,A.dr,A.dG,A.dF,A.dT,A.e6,A.e7])\nr(A.b7,A.c7)\nr(A.dq,A.dJ)\nq(A.bC,[A.cq,A.cv,A.cH])\nq(A.bE,[A.cr,A.cx,A.cI,A.d2,A.d1])\nr(A.d0,A.cv)\nq(A.G,[A.b2,A.bF])\nr(A.c9,A.bn)\nq(A.d8,[A.m,A.A])\ns(A.ay,A.c1)\ns(A.bp,A.e)\ns(A.bb,A.e)\ns(A.bc,A.aO)\ns(A.bd,A.e)\ns(A.be,A.aO)\ns(A.bm,A.cl)})()\nvar v={typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{b:\"int\",t:\"double\",jY:\"num\",d:\"String\",jD:\"bool\",u:\"Null\",f:\"List\",l:\"Object\",x:\"Map\"},mangledNames:{},types:[\"~()\",\"u(p)\",\"~(d,@)\",\"~(@)\",\"~(~())\",\"u(@)\",\"u()\",\"@()\",\"~(al,d,b)\",\"a0<u>(p)\",\"@(@)\",\"@(@,d)\",\"@(d)\",\"u(~())\",\"u(@,a4)\",\"~(b,@)\",\"u(l,a4)\",\"v<@>(@)\",\"~(l?,l?)\",\"~(b6,@)\",\"x<d,d>(x<d,d>,d)\",\"~(d,b)\",\"~(d,b?)\",\"b(b,b)\",\"~(d,d?)\",\"al(@,@)\",\"~(A)\",\"b(+item,matchPosition(w,A),+item,matchPosition(w,A))\",\"w(+item,matchPosition(w,A))\",\"d()\",\"d(cL)\",\"b(@,@)\",\"w(x<d,@>)\"],interceptorsByTag:null,leafTags:null,arrayRti:Symbol(\"$ti\"),rttc:{\"2;item,matchPosition\":(a,b)=>c=>c instanceof A.cg&&a.b(c.a)&&b.b(c.b)}}\nA.ix(v.typeUniverse,JSON.parse('{\"bX\":\"a2\",\"ax\":\"a2\",\"a1\":\"a2\",\"bH\":{\"j\":[]},\"aQ\":{\"u\":[],\"j\":[]},\"aT\":{\"p\":[]},\"a2\":{\"p\":[]},\"o\":{\"f\":[\"1\"],\"c\":[\"1\"],\"p\":[]},\"cF\":{\"o\":[\"1\"],\"f\":[\"1\"],\"c\":[\"1\"],\"p\":[]},\"aR\":{\"t\":[]},\"aP\":{\"t\":[],\"b\":[],\"j\":[]},\"bI\":{\"t\":[],\"j\":[]},\"ai\":{\"d\":[],\"j\":[]},\"a8\":{\"n\":[\"2\"]},\"af\":{\"a8\":[\"1\",\"2\"],\"n\":[\"2\"],\"n.E\":\"2\"},\"b9\":{\"af\":[\"1\",\"2\"],\"a8\":[\"1\",\"2\"],\"c\":[\"2\"],\"n\":[\"2\"],\"n.E\":\"2\"},\"b8\":{\"e\":[\"2\"],\"f\":[\"2\"],\"a8\":[\"1\",\"2\"],\"c\":[\"2\"],\"n\":[\"2\"]},\"M\":{\"b8\":[\"1\",\"2\"],\"e\":[\"2\"],\"f\":[\"2\"],\"a8\":[\"1\",\"2\"],\"c\":[\"2\"],\"n\":[\"2\"],\"e.E\":\"2\",\"n.E\":\"2\"},\"aV\":{\"k\":[]},\"bB\":{\"e\":[\"b\"],\"f\":[\"b\"],\"c\":[\"b\"],\"e.E\":\"b\"},\"c\":{\"n\":[\"1\"]},\"J\":{\"c\":[\"1\"],\"n\":[\"1\"]},\"aj\":{\"n\":[\"2\"],\"n.E\":\"2\"},\"aM\":{\"aj\":[\"1\",\"2\"],\"c\":[\"2\"],\"n\":[\"2\"],\"n.E\":\"2\"},\"ak\":{\"J\":[\"2\"],\"c\":[\"2\"],\"n\":[\"2\"],\"J.E\":\"2\",\"n.E\":\"2\"},\"ay\":{\"e\":[\"1\"],\"f\":[\"1\"],\"c\":[\"1\"]},\"a5\":{\"b6\":[]},\"aL\":{\"a7\":[\"1\",\"2\"],\"x\":[\"1\",\"2\"]},\"aK\":{\"x\":[\"1\",\"2\"]},\"ah\":{\"x\":[\"1\",\"2\"]},\"b1\":{\"R\":[],\"k\":[]},\"bJ\":{\"k\":[]},\"c0\":{\"k\":[]},\"bg\":{\"a4\":[]},\"c8\":{\"k\":[]},\"bZ\":{\"k\":[]},\"N\":{\"P\":[\"1\",\"2\"],\"x\":[\"1\",\"2\"],\"P.V\":\"2\"},\"O\":{\"c\":[\"1\"],\"n\":[\"1\"],\"n.E\":\"1\"},\"ce\":{\"el\":[],\"cL\":[]},\"bM\":{\"p\":[],\"j\":[]},\"aZ\":{\"p\":[]},\"bN\":{\"p\":[],\"j\":[]},\"aw\":{\"D\":[\"1\"],\"p\":[]},\"aX\":{\"e\":[\"t\"],\"f\":[\"t\"],\"D\":[\"t\"],\"c\":[\"t\"],\"p\":[]},\"aY\":{\"e\":[\"b\"],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[]},\"bO\":{\"e\":[\"t\"],\"f\":[\"t\"],\"D\":[\"t\"],\"c\":[\"t\"],\"p\":[],\"j\":[],\"e.E\":\"t\"},\"bP\":{\"e\":[\"t\"],\"f\":[\"t\"],\"D\":[\"t\"],\"c\":[\"t\"],\"p\":[],\"j\":[],\"e.E\":\"t\"},\"bQ\":{\"e\":[\"b\"],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[],\"j\":[],\"e.E\":\"b\"},\"bR\":{\"e\":[\"b\"],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[],\"j\":[],\"e.E\":\"b\"},\"bS\":{\"e\":[\"b\"],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[],\"j\":[],\"e.E\":\"b\"},\"bT\":{\"e\":[\"b\"],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[],\"j\":[],\"e.E\":\"b\"},\"bU\":{\"e\":[\"b\"],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[],\"j\":[],\"e.E\":\"b\"},\"b_\":{\"e\":[\"b\"],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[],\"j\":[],\"e.E\":\"b\"},\"b0\":{\"e\":[\"b\"],\"al\":[],\"f\":[\"b\"],\"D\":[\"b\"],\"c\":[\"b\"],\"p\":[],\"j\":[],\"e.E\":\"b\"},\"ca\":{\"k\":[]},\"bh\":{\"R\":[],\"k\":[]},\"v\":{\"a0\":[\"1\"]},\"bz\":{\"k\":[]},\"b7\":{\"c7\":[\"1\"]},\"e\":{\"f\":[\"1\"],\"c\":[\"1\"]},\"P\":{\"x\":[\"1\",\"2\"]},\"aW\":{\"x\":[\"1\",\"2\"]},\"a7\":{\"x\":[\"1\",\"2\"]},\"cc\":{\"P\":[\"d\",\"@\"],\"x\":[\"d\",\"@\"],\"P.V\":\"@\"},\"cd\":{\"J\":[\"d\"],\"c\":[\"d\"],\"n\":[\"d\"],\"J.E\":\"d\",\"n.E\":\"d\"},\"f\":{\"c\":[\"1\"]},\"el\":{\"cL\":[]},\"bx\":{\"k\":[]},\"R\":{\"k\":[]},\"G\":{\"k\":[]},\"b2\":{\"k\":[]},\"bF\":{\"k\":[]},\"bV\":{\"k\":[]},\"c2\":{\"k\":[]},\"c_\":{\"k\":[]},\"b5\":{\"k\":[]},\"bD\":{\"k\":[]},\"bW\":{\"k\":[]},\"b4\":{\"k\":[]},\"cj\":{\"a4\":[]},\"bn\":{\"c3\":[]},\"ch\":{\"c3\":[]},\"c9\":{\"c3\":[]},\"hO\":{\"f\":[\"b\"],\"c\":[\"b\"]},\"al\":{\"f\":[\"b\"],\"c\":[\"b\"]},\"i9\":{\"f\":[\"b\"],\"c\":[\"b\"]},\"hM\":{\"f\":[\"b\"],\"c\":[\"b\"]},\"i7\":{\"f\":[\"b\"],\"c\":[\"b\"]},\"hN\":{\"f\":[\"b\"],\"c\":[\"b\"]},\"i8\":{\"f\":[\"b\"],\"c\":[\"b\"]},\"hJ\":{\"f\":[\"t\"],\"c\":[\"t\"]},\"hK\":{\"f\":[\"t\"],\"c\":[\"t\"]}}'))\nA.iw(v.typeUniverse,JSON.parse('{\"aO\":1,\"c1\":1,\"ay\":1,\"bp\":2,\"aK\":2,\"bK\":1,\"aw\":1,\"ci\":1,\"cl\":2,\"aW\":2,\"bm\":2,\"bC\":2,\"bE\":2}'))\nvar u={c:\"Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type\"}\nvar t=(function rtii(){var s=A.bt\nreturn{Z:s(\"aL<b6,@>\"),U:s(\"c<@>\"),Q:s(\"k\"),Y:s(\"k9\"),M:s(\"o<w>\"),O:s(\"o<p>\"),r:s(\"o<+item,matchPosition(w,A)>\"),s:s(\"o<d>\"),b:s(\"o<@>\"),t:s(\"o<b>\"),T:s(\"aQ\"),m:s(\"p\"),g:s(\"a1\"),p:s(\"D<@>\"),B:s(\"N<b6,@>\"),j:s(\"f<@>\"),a:s(\"x<d,@>\"),V:s(\"ak<+item,matchPosition(w,A),w>\"),P:s(\"u\"),K:s(\"l\"),L:s(\"ka\"),d:s(\"+()\"),F:s(\"el\"),l:s(\"a4\"),N:s(\"d\"),k:s(\"j\"),c:s(\"R\"),D:s(\"al\"),o:s(\"ax\"),h:s(\"a7<d,d>\"),R:s(\"c3\"),e:s(\"v<@>\"),y:s(\"jD\"),i:s(\"t\"),z:s(\"@\"),v:s(\"@(l)\"),C:s(\"@(l,a4)\"),S:s(\"b\"),A:s(\"0&*\"),_:s(\"l*\"),W:s(\"a0<u>?\"),X:s(\"l?\"),H:s(\"jY\")}})();(function constants(){var s=hunkHelpers.makeConstList\nB.I=J.bG.prototype\nB.b=J.o.prototype\nB.c=J.aP.prototype\nB.a=J.ai.prototype\nB.J=J.a1.prototype\nB.K=J.aT.prototype\nB.ab=A.b0.prototype\nB.w=J.bX.prototype\nB.j=J.ax.prototype\nB.at=new A.cr()\nB.x=new A.cq()\nB.au=new A.cy()\nB.k=new A.cx()\nB.l=function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n}\nB.y=function() {\n  var toStringFunction = Object.prototype.toString;\n  function getTag(o) {\n    var s = toStringFunction.call(o);\n    return s.substring(8, s.length - 1);\n  }\n  function getUnknownTag(object, tag) {\n    if (/^HTML[A-Z].*Element$/.test(tag)) {\n      var name = toStringFunction.call(object);\n      if (name == \"[object Object]\") return null;\n      return \"HTMLElement\";\n    }\n  }\n  function getUnknownTagGenericBrowser(object, tag) {\n    if (object instanceof HTMLElement) return \"HTMLElement\";\n    return getUnknownTag(object, tag);\n  }\n  function prototypeForTag(tag) {\n    if (typeof window == \"undefined\") return null;\n    if (typeof window[tag] == \"undefined\") return null;\n    var constructor = window[tag];\n    if (typeof constructor != \"function\") return null;\n    return constructor.prototype;\n  }\n  function discriminator(tag) { return null; }\n  var isBrowser = typeof HTMLElement == \"function\";\n  return {\n    getTag: getTag,\n    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,\n    prototypeForTag: prototypeForTag,\n    discriminator: discriminator };\n}\nB.D=function(getTagFallback) {\n  return function(hooks) {\n    if (typeof navigator != \"object\") return hooks;\n    var userAgent = navigator.userAgent;\n    if (typeof userAgent != \"string\") return hooks;\n    if (userAgent.indexOf(\"DumpRenderTree\") >= 0) return hooks;\n    if (userAgent.indexOf(\"Chrome\") >= 0) {\n      function confirm(p) {\n        return typeof window == \"object\" && window[p] && window[p].name == p;\n      }\n      if (confirm(\"Window\") && confirm(\"HTMLElement\")) return hooks;\n    }\n    hooks.getTag = getTagFallback;\n  };\n}\nB.z=function(hooks) {\n  if (typeof dartExperimentalFixupGetTag != \"function\") return hooks;\n  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);\n}\nB.C=function(hooks) {\n  if (typeof navigator != \"object\") return hooks;\n  var userAgent = navigator.userAgent;\n  if (typeof userAgent != \"string\") return hooks;\n  if (userAgent.indexOf(\"Firefox\") == -1) return hooks;\n  var getTag = hooks.getTag;\n  var quickMap = {\n    \"BeforeUnloadEvent\": \"Event\",\n    \"DataTransfer\": \"Clipboard\",\n    \"GeoGeolocation\": \"Geolocation\",\n    \"Location\": \"!Location\",\n    \"WorkerMessageEvent\": \"MessageEvent\",\n    \"XMLDocument\": \"!Document\"};\n  function getTagFirefox(o) {\n    var tag = getTag(o);\n    return quickMap[tag] || tag;\n  }\n  hooks.getTag = getTagFirefox;\n}\nB.B=function(hooks) {\n  if (typeof navigator != \"object\") return hooks;\n  var userAgent = navigator.userAgent;\n  if (typeof userAgent != \"string\") return hooks;\n  if (userAgent.indexOf(\"Trident/\") == -1) return hooks;\n  var getTag = hooks.getTag;\n  var quickMap = {\n    \"BeforeUnloadEvent\": \"Event\",\n    \"DataTransfer\": \"Clipboard\",\n    \"HTMLDDElement\": \"HTMLElement\",\n    \"HTMLDTElement\": \"HTMLElement\",\n    \"HTMLPhraseElement\": \"HTMLElement\",\n    \"Position\": \"Geoposition\"\n  };\n  function getTagIE(o) {\n    var tag = getTag(o);\n    var newTag = quickMap[tag];\n    if (newTag) return newTag;\n    if (tag == \"Object\") {\n      if (window.DataView && (o instanceof window.DataView)) return \"DataView\";\n    }\n    return tag;\n  }\n  function prototypeForTagIE(tag) {\n    var constructor = window[tag];\n    if (constructor == null) return null;\n    return constructor.prototype;\n  }\n  hooks.getTag = getTagIE;\n  hooks.prototypeForTag = prototypeForTagIE;\n}\nB.A=function(hooks) {\n  var getTag = hooks.getTag;\n  var prototypeForTag = hooks.prototypeForTag;\n  function getTagFixed(o) {\n    var tag = getTag(o);\n    if (tag == \"Document\") {\n      if (!!o.xmlVersion) return \"!Document\";\n      return \"!HTMLDocument\";\n    }\n    return tag;\n  }\n  function prototypeForTagFixed(tag) {\n    if (tag == \"Document\") return null;\n    return prototypeForTag(tag);\n  }\n  hooks.getTag = getTagFixed;\n  hooks.prototypeForTag = prototypeForTagFixed;\n}\nB.m=function(hooks) { return hooks; }\n\nB.E=new A.cH()\nB.F=new A.bW()\nB.i=new A.cR()\nB.e=new A.d0()\nB.G=new A.d2()\nB.n=new A.dp()\nB.d=new A.dq()\nB.H=new A.cj()\nB.L=new A.cI(null)\nB.a8=A.h(s([0,0,32722,12287,65534,34815,65534,18431]),t.t)\nB.f=A.h(s([0,0,65490,45055,65535,34815,65534,18431]),t.t)\nB.a9=A.h(s([0,0,32754,11263,65534,34815,65534,18431]),t.t)\nB.o=A.h(s([0,0,26624,1023,65534,2047,65534,2047]),t.t)\nB.p=A.h(s([0,0,65490,12287,65535,34815,65534,18431]),t.t)\nB.M=new A.m(0,\"accessor\")\nB.N=new A.m(1,\"constant\")\nB.Y=new A.m(2,\"constructor\")\nB.a1=new A.m(3,\"class_\")\nB.a2=new A.m(4,\"dynamic\")\nB.a3=new A.m(5,\"enum_\")\nB.a4=new A.m(6,\"extension\")\nB.a5=new A.m(7,\"extensionType\")\nB.a6=new A.m(8,\"function\")\nB.a7=new A.m(9,\"library\")\nB.O=new A.m(10,\"method\")\nB.P=new A.m(11,\"mixin\")\nB.Q=new A.m(12,\"never\")\nB.R=new A.m(13,\"package\")\nB.S=new A.m(14,\"parameter\")\nB.T=new A.m(15,\"prefix\")\nB.U=new A.m(16,\"property\")\nB.V=new A.m(17,\"sdk\")\nB.W=new A.m(18,\"topic\")\nB.X=new A.m(19,\"topLevelConstant\")\nB.Z=new A.m(20,\"topLevelProperty\")\nB.a_=new A.m(21,\"typedef\")\nB.a0=new A.m(22,\"typeParameter\")\nB.q=A.h(s([B.M,B.N,B.Y,B.a1,B.a2,B.a3,B.a4,B.a5,B.a6,B.a7,B.O,B.P,B.Q,B.R,B.S,B.T,B.U,B.V,B.W,B.X,B.Z,B.a_,B.a0]),A.bt(\"o<m>\"))\nB.r=A.h(s([0,0,32776,33792,1,10240,0,0]),t.t)\nB.t=A.h(s([]),t.b)\nB.h=A.h(s([0,0,24576,1023,65534,34815,65534,18431]),t.t)\nB.v={}\nB.aa=new A.ah(B.v,[],A.bt(\"ah<d,d>\"))\nB.u=new A.ah(B.v,[],A.bt(\"ah<b6,@>\"))\nB.ac=new A.a5(\"call\")\nB.ad=A.K(\"k6\")\nB.ae=A.K(\"k7\")\nB.af=A.K(\"hJ\")\nB.ag=A.K(\"hK\")\nB.ah=A.K(\"hM\")\nB.ai=A.K(\"hN\")\nB.aj=A.K(\"hO\")\nB.ak=A.K(\"l\")\nB.al=A.K(\"i7\")\nB.am=A.K(\"i8\")\nB.an=A.K(\"i9\")\nB.ao=A.K(\"al\")\nB.ap=new A.d1(!1)\nB.aq=new A.A(0,\"isExactly\")\nB.ar=new A.A(1,\"startsWith\")\nB.as=new A.A(2,\"contains\")})();(function staticFields(){$.dm=null\n$.ap=A.h([],A.bt(\"o<l>\"))\n$.f2=null\n$.eR=null\n$.eQ=null\n$.h2=null\n$.h_=null\n$.h7=null\n$.dZ=null\n$.e9=null\n$.eH=null\n$.dn=A.h([],A.bt(\"o<f<l>?>\"))\n$.aB=null\n$.br=null\n$.bs=null\n$.eA=!1\n$.r=B.d\n$.eD=10\n$.dX=0\n$.bq=A.ej(t.N,t.m)})();(function lazyInitializers(){var s=hunkHelpers.lazyFinal\ns($,\"k8\",\"eK\",()=>A.jK(\"_$dart_dartClosure\"))\ns($,\"kc\",\"ha\",()=>A.S(A.cV({\ntoString:function(){return\"$receiver$\"}})))\ns($,\"kd\",\"hb\",()=>A.S(A.cV({$method$:null,\ntoString:function(){return\"$receiver$\"}})))\ns($,\"ke\",\"hc\",()=>A.S(A.cV(null)))\ns($,\"kf\",\"hd\",()=>A.S(function(){var $argumentsExpr$=\"$arguments$\"\ntry{null.$method$($argumentsExpr$)}catch(r){return r.message}}()))\ns($,\"ki\",\"hg\",()=>A.S(A.cV(void 0)))\ns($,\"kj\",\"hh\",()=>A.S(function(){var $argumentsExpr$=\"$arguments$\"\ntry{(void 0).$method$($argumentsExpr$)}catch(r){return r.message}}()))\ns($,\"kh\",\"hf\",()=>A.S(A.fd(null)))\ns($,\"kg\",\"he\",()=>A.S(function(){try{null.$method$}catch(r){return r.message}}()))\ns($,\"kl\",\"hj\",()=>A.S(A.fd(void 0)))\ns($,\"kk\",\"hi\",()=>A.S(function(){try{(void 0).$method$}catch(r){return r.message}}()))\ns($,\"km\",\"eL\",()=>A.ib())\ns($,\"ks\",\"hp\",()=>A.hY(4096))\ns($,\"kq\",\"hn\",()=>new A.dG().$0())\ns($,\"kr\",\"ho\",()=>new A.dF().$0())\ns($,\"kn\",\"hk\",()=>A.hX(A.j0(A.h([-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-2,-2,-2,-2,-2,62,-2,62,-2,63,52,53,54,55,56,57,58,59,60,61,-2,-2,-2,-1,-2,-2,-2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-2,-2,-2,-2,63,-2,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-2,-2,-2,-2,-2],t.t))))\ns($,\"ko\",\"hl\",()=>A.f6(\"^[\\\\-\\\\.0-9A-Z_a-z~]*$\",!0))\ns($,\"kp\",\"hm\",()=>typeof URLSearchParams==\"function\")\ns($,\"kE\",\"ee\",()=>A.h5(B.ak))\ns($,\"kG\",\"hq\",()=>A.j_())\ns($,\"kF\",\"bw\",()=>new A.dT().$0())})();(function nativeSupport(){!function(){var s=function(a){var m={}\nm[a]=1\nreturn Object.keys(hunkHelpers.convertToFastObject(m))[0]}\nv.getIsolateTag=function(a){return s(\"___dart_\"+a+v.isolateTag)}\nvar r=\"___dart_isolate_tags_\"\nvar q=Object[r]||(Object[r]=Object.create(null))\nvar p=\"_ZxYxX\"\nfor(var o=0;;o++){var n=s(p+\"_\"+o+\"_\")\nif(!(n in q)){q[n]=1\nv.isolateTag=n\nbreak}}v.dispatchPropertyName=v.getIsolateTag(\"dispatch_record\")}()\nhunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer:A.bM,ArrayBufferView:A.aZ,DataView:A.bN,Float32Array:A.bO,Float64Array:A.bP,Int16Array:A.bQ,Int32Array:A.bR,Int8Array:A.bS,Uint16Array:A.bT,Uint32Array:A.bU,Uint8ClampedArray:A.b_,CanvasPixelArray:A.b_,Uint8Array:A.b0})\nhunkHelpers.setOrUpdateLeafTags({ArrayBuffer:true,ArrayBufferView:false,DataView:true,Float32Array:true,Float64Array:true,Int16Array:true,Int32Array:true,Int8Array:true,Uint16Array:true,Uint32Array:true,Uint8ClampedArray:true,CanvasPixelArray:true,Uint8Array:false})\nA.aw.$nativeSuperclassTag=\"ArrayBufferView\"\nA.bb.$nativeSuperclassTag=\"ArrayBufferView\"\nA.bc.$nativeSuperclassTag=\"ArrayBufferView\"\nA.aX.$nativeSuperclassTag=\"ArrayBufferView\"\nA.bd.$nativeSuperclassTag=\"ArrayBufferView\"\nA.be.$nativeSuperclassTag=\"ArrayBufferView\"\nA.aY.$nativeSuperclassTag=\"ArrayBufferView\"})()\nFunction.prototype.$0=function(){return this()}\nFunction.prototype.$1=function(a){return this(a)}\nFunction.prototype.$2=function(a,b){return this(a,b)}\nFunction.prototype.$1$1=function(a){return this(a)}\nFunction.prototype.$3=function(a,b,c){return this(a,b,c)}\nFunction.prototype.$4=function(a,b,c,d){return this(a,b,c,d)}\nFunction.prototype.$1$0=function(){return this()}\nconvertAllToFastObject(w)\nconvertToFastObject($);(function(a){if(typeof document===\"undefined\"){a(null)\nreturn}if(typeof document.currentScript!=\"undefined\"){a(document.currentScript)\nreturn}var s=document.scripts\nfunction onLoad(b){for(var q=0;q<s.length;++q){s[q].removeEventListener(\"load\",onLoad,false)}a(b.target)}for(var r=0;r<s.length;++r){s[r].addEventListener(\"load\",onLoad,false)}})(function(a){v.currentScript=a\nvar s=A.jW\nif(typeof dartMainRunner===\"function\"){dartMainRunner(s,[])}else{s([])}})})()\n//# sourceMappingURL=docs.dart.js.map\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/github.css",
    "content": "/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #333;\n  background: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #998;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-subst {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-number,\n.hljs-literal,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag .hljs-attr {\n  color: #008080;\n}\n\n.hljs-string,\n.hljs-doctag {\n  color: #d14;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-selector-id {\n  color: #900;\n  font-weight: bold;\n}\n\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-type,\n.hljs-class .hljs-title {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-attribute {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-regexp,\n.hljs-link {\n  color: #009926;\n}\n\n.hljs-symbol,\n.hljs-bullet {\n  color: #990073;\n}\n\n.hljs-built_in,\n.hljs-builtin-name {\n  color: #0086b3;\n}\n\n.hljs-meta {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/highlight.pack.js",
    "content": "/*!\n  Highlight.js v11.8.0 (git: d27be507cb)\n  (c) 2006-2023 Ivan Sagalaev and other contributors\n  License: BSD-3-Clause\n */\nvar hljs=function(){\"use strict\";function e(n){\nreturn n instanceof Map?n.clear=n.delete=n.set=()=>{\nthrow Error(\"map is read-only\")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{\nthrow Error(\"set is read-only\")\n}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{\nconst a=n[t],i=typeof a;\"object\"!==i&&\"function\"!==i||Object.isFrozen(a)||e(a)\n})),n}class n{constructor(e){\nvoid 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}\nignoreMatch(){this.isMatchIgnored=!0}}function t(e){\nreturn e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#x27;\")\n}function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n]\n;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope\n;class s{constructor(e,n){\nthis.buffer=\"\",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){\nthis.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{\nif(e.startsWith(\"language:\"))return e.replace(\"language:\",\"language-\")\n;if(e.includes(\".\")){const t=e.split(\".\")\n;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${\"_\".repeat(n+1)}`))].join(\" \")\n}return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)}\ncloseNode(e){i(e)&&(this.buffer+=\"</span>\")}value(){return this.buffer}span(e){\nthis.buffer+=`<span class=\"${e}\">`}}const r=(e={})=>{const n={children:[]}\n;return Object.assign(n,e),n};class o{constructor(){\nthis.rootNode=r(),this.stack=[this.rootNode]}get top(){\nreturn this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){\nthis.top.children.push(e)}openNode(e){const n=r({scope:e})\n;this.add(n),this.stack.push(n)}closeNode(){\nif(this.stack.length>1)return this.stack.pop()}closeAllNodes(){\nfor(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}\nwalk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){\nreturn\"string\"==typeof n?e.addText(n):n.children&&(e.openNode(n),\nn.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){\n\"string\"!=typeof e&&e.children&&(e.children.every((e=>\"string\"==typeof e))?e.children=[e.children.join(\"\")]:e.children.forEach((e=>{\no._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e}\naddText(e){\"\"!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){\nthis.closeNode()}__addSublanguage(e,n){const t=e.root\n;n&&(t.scope=\"language:\"+n),this.add(t)}toHTML(){\nreturn new s(this,this.options).value()}finalize(){\nreturn this.closeAllNodes(),!0}}function c(e){\nreturn e?\"string\"==typeof e?e:e.source:null}function d(e){return b(\"(?=\",e,\")\")}\nfunction g(e){return b(\"(?:\",e,\")*\")}function u(e){return b(\"(?:\",e,\")?\")}\nfunction b(...e){return e.map((e=>c(e))).join(\"\")}function m(...e){const n=(e=>{\nconst n=e[e.length-1]\n;return\"object\"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{}\n})(e);return\"(\"+(n.capture?\"\":\"?:\")+e.map((e=>c(e))).join(\"|\")+\")\"}\nfunction p(e){return RegExp(e.toString()+\"|\").exec(\"\").length-1}\nconst h=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./\n;function f(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t\n;let a=c(e),i=\"\";for(;a.length>0;){const e=h.exec(a);if(!e){i+=a;break}\ni+=a.substring(0,e.index),\na=a.substring(e.index+e[0].length),\"\\\\\"===e[0][0]&&e[1]?i+=\"\\\\\"+(Number(e[1])+n):(i+=e[0],\n\"(\"===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)}\nconst _=\"[a-zA-Z]\\\\w*\",E=\"[a-zA-Z_]\\\\w*\",N=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",y=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",w=\"\\\\b(0b[01]+)\",v={\nbegin:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},k={scope:\"string\",begin:\"'\",end:\"'\",\nillegal:\"\\\\n\",contains:[v]},x={scope:\"string\",begin:'\"',end:'\"',illegal:\"\\\\n\",\ncontains:[v]},O=(e,n,t={})=>{const i=a({scope:\"comment\",begin:e,end:n,\ncontains:[]},t);i.contains.push({scope:\"doctag\",\nbegin:\"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)\",\nend:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0})\n;const s=m(\"I\",\"a\",\"is\",\"so\",\"us\",\"to\",\"at\",\"if\",\"in\",\"it\",\"on\",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/)\n;return i.contains.push({begin:b(/[ ]+/,\"(\",s,/[.]?[:]?([.][ ]|[ ])/,\"){3}\")}),i\n},S=O(\"//\",\"$\"),A=O(\"/\\\\*\",\"\\\\*/\"),M=O(\"#\",\"$\");var C=Object.freeze({\n__proto__:null,MATCH_NOTHING_RE:/\\b\\B/,IDENT_RE:_,UNDERSCORE_IDENT_RE:E,\nNUMBER_RE:N,C_NUMBER_RE:y,BINARY_NUMBER_RE:w,\nRE_STARTERS_RE:\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",\nSHEBANG:(e={})=>{const n=/^#![ ]*\\//\n;return e.binary&&(e.begin=b(n,/.*\\b/,e.binary,/\\b.*/)),a({scope:\"meta\",begin:n,\nend:/$/,relevance:0,\"on:begin\":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},\nBACKSLASH_ESCAPE:v,APOS_STRING_MODE:k,QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:{\nbegin:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/\n},COMMENT:O,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:M,\nNUMBER_MODE:{scope:\"number\",begin:N,relevance:0},C_NUMBER_MODE:{scope:\"number\",\nbegin:y,relevance:0},BINARY_NUMBER_MODE:{scope:\"number\",begin:w,relevance:0},\nREGEXP_MODE:{begin:/(?=\\/[^/\\n]*\\/)/,contains:[{scope:\"regexp\",begin:/\\//,\nend:/\\/[gimuy]*/,illegal:/\\n/,contains:[v,{begin:/\\[/,end:/\\]/,relevance:0,\ncontains:[v]}]}]},TITLE_MODE:{scope:\"title\",begin:_,relevance:0},\nUNDERSCORE_TITLE_MODE:{scope:\"title\",begin:E,relevance:0},METHOD_GUARD:{\nbegin:\"\\\\.\\\\s*\"+E,relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{\n\"on:begin\":(e,n)=>{n.data._beginMatch=e[1]},\"on:end\":(e,n)=>{\nn.data._beginMatch!==e[1]&&n.ignoreMatch()}})});function T(e,n){\n\".\"===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){\nvoid 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){\nn&&e.beginKeywords&&(e.begin=\"\\\\b(\"+e.beginKeywords.split(\" \").join(\"|\")+\")(?!\\\\.)(?=\\\\b|\\\\s)\",\ne.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,\nvoid 0===e.relevance&&(e.relevance=0))}function I(e,n){\nArray.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function B(e,n){\nif(e.match){\nif(e.begin||e.end)throw Error(\"begin & end are not supported with match\")\n;e.begin=e.match,delete e.match}}function L(e,n){\nvoid 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return\n;if(e.starts)throw Error(\"beforeMatch cannot be used with starts\")\n;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n]\n})),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={\nrelevance:0,contains:[Object.assign(t,{endsParent:!0})]\n},e.relevance=0,delete t.beforeMatch\n},F=[\"of\",\"and\",\"for\",\"in\",\"not\",\"or\",\"if\",\"then\",\"parent\",\"list\",\"value\"],z=\"keyword\"\n;function U(e,n,t=z){const a=Object.create(null)\n;return\"string\"==typeof e?i(t,e.split(\" \")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{\nObject.assign(a,U(e[t],n,t))})),a;function i(e,t){\nn&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split(\"|\")\n;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){\nreturn n?Number(n):(e=>F.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{\nconsole.error(e)},H=(e,...n)=>{console.log(\"WARN: \"+e,...n)},Z=(e,n)=>{\nP[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0)\n},G=Error();function q(e,n,{key:t}){let a=0;const i=e[t],s={},r={}\n;for(let e=1;e<=n.length;e++)r[e+a]=i[e],s[e+a]=!0,a+=p(n[e-1])\n;e[t]=r,e[t]._emit=s,e[t]._multi=!0}function W(e){(e=>{\ne.scope&&\"object\"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope,\ndelete e.scope)})(e),\"string\"==typeof e.beginScope&&(e.beginScope={\n_wrap:e.beginScope}),\"string\"==typeof e.endScope&&(e.endScope={_wrap:e.endScope\n}),(e=>{if(Array.isArray(e.begin)){\nif(e.skip||e.excludeBegin||e.returnBegin)throw K(\"skip, excludeBegin, returnBegin not compatible with beginScope: {}\"),\nG\n;if(\"object\"!=typeof e.beginScope||null===e.beginScope)throw K(\"beginScope must be object\"),\nG;q(e,e.begin,{key:\"beginScope\"}),e.begin=f(e.begin,{joinWith:\"\"})}})(e),(e=>{\nif(Array.isArray(e.end)){\nif(e.skip||e.excludeEnd||e.returnEnd)throw K(\"skip, excludeEnd, returnEnd not compatible with endScope: {}\"),\nG\n;if(\"object\"!=typeof e.endScope||null===e.endScope)throw K(\"endScope must be object\"),\nG;q(e,e.end,{key:\"endScope\"}),e.end=f(e.end,{joinWith:\"\"})}})(e)}function X(e){\nfunction n(n,t){\nreturn RegExp(c(n),\"m\"+(e.case_insensitive?\"i\":\"\")+(e.unicodeRegex?\"u\":\"\")+(t?\"g\":\"\"))\n}class t{constructor(){\nthis.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}\naddRule(e,n){\nn.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),\nthis.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null)\n;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(f(e,{joinWith:\"|\"\n}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex\n;const n=this.matcherRe.exec(e);if(!n)return null\n;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t]\n;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){\nthis.rules=[],this.multiRegexes=[],\nthis.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){\nif(this.multiRegexes[e])return this.multiRegexes[e];const n=new t\n;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))),\nn.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){\nreturn 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){\nthis.rules.push([e,n]),\"begin\"===n.type&&this.count++}exec(e){\nconst n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex\n;let t=n.exec(e)\n;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{\nconst n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)}\nreturn t&&(this.regexIndex+=t.position+1,\nthis.regexIndex===this.count&&this.considerAll()),t}}\nif(e.compilerExtensions||(e.compilerExtensions=[]),\ne.contains&&e.contains.includes(\"self\"))throw Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\")\n;return e.classNameAliases=a(e.classNameAliases||{}),function t(s,r){const o=s\n;if(s.isCompiled)return o\n;[R,B,W,$].forEach((e=>e(s,r))),e.compilerExtensions.forEach((e=>e(s,r))),\ns.__beforeBegin=null,[D,I,L].forEach((e=>e(s,r))),s.isCompiled=!0;let l=null\n;return\"object\"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords),\nl=s.keywords.$pattern,\ndelete s.keywords.$pattern),l=l||/\\w+/,s.keywords&&(s.keywords=U(s.keywords,e.case_insensitive)),\no.keywordPatternRe=n(l,!0),\nr&&(s.begin||(s.begin=/\\B|\\b/),o.beginRe=n(o.begin),s.end||s.endsWithParent||(s.end=/\\B|\\b/),\ns.end&&(o.endRe=n(o.end)),\no.terminatorEnd=c(o.end)||\"\",s.endsWithParent&&r.terminatorEnd&&(o.terminatorEnd+=(s.end?\"|\":\"\")+r.terminatorEnd)),\ns.illegal&&(o.illegalRe=n(s.illegal)),\ns.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{\nvariants:null},n)))),e.cachedVariants?e.cachedVariants:Q(e)?a(e,{\nstarts:e.starts?a(e.starts):null\n}):Object.isFrozen(e)?a(e):e))(\"self\"===e?s:e)))),s.contains.forEach((e=>{t(e,o)\n})),s.starts&&t(s.starts,r),o.matcher=(e=>{const n=new i\n;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:\"begin\"\n}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:\"end\"\n}),e.illegal&&n.addRule(e.illegal,{type:\"illegal\"}),n})(o),o}(e)}function Q(e){\nreturn!!e&&(e.endsWithParent||Q(e.starts))}class V extends Error{\nconstructor(e,n){super(e),this.name=\"HTMLInjectionError\",this.html=n}}\nconst J=t,Y=a,ee=Symbol(\"nomatch\"),ne=t=>{\nconst a=Object.create(null),i=Object.create(null),s=[];let r=!0\n;const o=\"Could not find the language '{}', did you forget to load/include a language module?\",c={\ndisableAutodetect:!0,name:\"Plain text\",contains:[]};let p={\nignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,\nlanguageDetectRe:/\\blang(?:uage)?-([\\w-]+)\\b/i,classPrefix:\"hljs-\",\ncssSelector:\"pre code\",languages:null,__emitter:l};function h(e){\nreturn p.noHighlightRe.test(e)}function f(e,n,t){let a=\"\",i=\"\"\n;\"object\"==typeof n?(a=e,\nt=n.ignoreIllegals,i=n.language):(Z(\"10.7.0\",\"highlight(lang, code, ...args) has been deprecated.\"),\nZ(\"10.7.0\",\"Please use highlight(code, options) instead.\\nhttps://github.com/highlightjs/highlight.js/issues/2277\"),\ni=e,a=n),void 0===t&&(t=!0);const s={code:a,language:i};O(\"before:highlight\",s)\n;const r=s.result?s.result:_(s.language,s.code,t)\n;return r.code=s.code,O(\"after:highlight\",r),r}function _(e,t,i,s){\nconst l=Object.create(null);function c(){if(!O.keywords)return void A.addText(M)\n;let e=0;O.keywordPatternRe.lastIndex=0;let n=O.keywordPatternRe.exec(M),t=\"\"\n;for(;n;){t+=M.substring(e,n.index)\n;const i=w.case_insensitive?n[0].toLowerCase():n[0],s=(a=i,O.keywords[a]);if(s){\nconst[e,a]=s\n;if(A.addText(t),t=\"\",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith(\"_\"))t+=n[0];else{\nconst t=w.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0]\n;e=O.keywordPatternRe.lastIndex,n=O.keywordPatternRe.exec(M)}var a\n;t+=M.substring(e),A.addText(t)}function d(){null!=O.subLanguage?(()=>{\nif(\"\"===M)return;let e=null;if(\"string\"==typeof O.subLanguage){\nif(!a[O.subLanguage])return void A.addText(M)\n;e=_(O.subLanguage,M,!0,S[O.subLanguage]),S[O.subLanguage]=e._top\n}else e=E(M,O.subLanguage.length?O.subLanguage:null)\n;O.relevance>0&&(C+=e.relevance),A.__addSublanguage(e._emitter,e.language)\n})():c(),M=\"\"}function g(e,n){\n\"\"!==e&&(A.startScope(n),A.addText(e),A.endScope())}function u(e,n){let t=1\n;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue}\nconst a=w.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(M=i,c(),M=\"\"),t++}}\nfunction b(e,n){\nreturn e.scope&&\"string\"==typeof e.scope&&A.openNode(w.classNameAliases[e.scope]||e.scope),\ne.beginScope&&(e.beginScope._wrap?(g(M,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),\nM=\"\"):e.beginScope._multi&&(u(e.beginScope,n),M=\"\")),O=Object.create(e,{parent:{\nvalue:O}}),O}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n)\n;return t&&0===t.index})(e.endRe,a);if(i){if(e[\"on:end\"]){const a=new n(e)\n;e[\"on:end\"](t,a),a.isMatchIgnored&&(i=!1)}if(i){\nfor(;e.endsParent&&e.parent;)e=e.parent;return e}}\nif(e.endsWithParent)return m(e.parent,t,a)}function h(e){\nreturn 0===O.matcher.regexIndex?(M+=e[0],1):(D=!0,0)}function f(e){\nconst n=e[0],a=t.substring(e.index),i=m(O,e,a);if(!i)return ee;const s=O\n;O.endScope&&O.endScope._wrap?(d(),\ng(n,O.endScope._wrap)):O.endScope&&O.endScope._multi?(d(),\nu(O.endScope,e)):s.skip?M+=n:(s.returnEnd||s.excludeEnd||(M+=n),\nd(),s.excludeEnd&&(M=n));do{\nO.scope&&A.closeNode(),O.skip||O.subLanguage||(C+=O.relevance),O=O.parent\n}while(O!==i.parent);return i.starts&&b(i.starts,e),s.returnEnd?0:n.length}\nlet N={};function y(a,s){const o=s&&s[0];if(M+=a,null==o)return d(),0\n;if(\"begin\"===N.type&&\"end\"===s.type&&N.index===s.index&&\"\"===o){\nif(M+=t.slice(s.index,s.index+1),!r){const n=Error(`0 width match regex (${e})`)\n;throw n.languageName=e,n.badRule=N.rule,n}return 1}\nif(N=s,\"begin\"===s.type)return(e=>{\nconst t=e[0],a=e.rule,i=new n(a),s=[a.__beforeBegin,a[\"on:begin\"]]\n;for(const n of s)if(n&&(n(e,i),i.isMatchIgnored))return h(t)\n;return a.skip?M+=t:(a.excludeBegin&&(M+=t),\nd(),a.returnBegin||a.excludeBegin||(M=t)),b(a,e),a.returnBegin?0:t.length})(s)\n;if(\"illegal\"===s.type&&!i){\nconst e=Error('Illegal lexeme \"'+o+'\" for mode \"'+(O.scope||\"<unnamed>\")+'\"')\n;throw e.mode=O,e}if(\"end\"===s.type){const e=f(s);if(e!==ee)return e}\nif(\"illegal\"===s.type&&\"\"===o)return 1\n;if(R>1e5&&R>3*s.index)throw Error(\"potential infinite loop, way more iterations than matches\")\n;return M+=o,o.length}const w=v(e)\n;if(!w)throw K(o.replace(\"{}\",e)),Error('Unknown language: \"'+e+'\"')\n;const k=X(w);let x=\"\",O=s||k;const S={},A=new p.__emitter(p);(()=>{const e=[]\n;for(let n=O;n!==w;n=n.parent)n.scope&&e.unshift(n.scope)\n;e.forEach((e=>A.openNode(e)))})();let M=\"\",C=0,T=0,R=0,D=!1;try{\nif(w.__emitTokens)w.__emitTokens(t,A);else{for(O.matcher.considerAll();;){\nR++,D?D=!1:O.matcher.considerAll(),O.matcher.lastIndex=T\n;const e=O.matcher.exec(t);if(!e)break;const n=y(t.substring(T,e.index),e)\n;T=e.index+n}y(t.substring(T))}return A.finalize(),x=A.toHTML(),{language:e,\nvalue:x,relevance:C,illegal:!1,_emitter:A,_top:O}}catch(n){\nif(n.message&&n.message.includes(\"Illegal\"))return{language:e,value:J(t),\nillegal:!0,relevance:0,_illegalBy:{message:n.message,index:T,\ncontext:t.slice(T-100,T+100),mode:n.mode,resultSoFar:x},_emitter:A};if(r)return{\nlanguage:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:A,_top:O}\n;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{\nconst n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)}\n;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(x).map((n=>_(n,e,!1)))\n;i.unshift(t);const s=i.sort(((e,n)=>{\nif(e.relevance!==n.relevance)return n.relevance-e.relevance\n;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1\n;if(v(n.language).supersetOf===e.language)return-1}return 0})),[r,o]=s,l=r\n;return l.secondBest=o,l}function N(e){let n=null;const t=(e=>{\nlet n=e.className+\" \";n+=e.parentNode?e.parentNode.className:\"\"\n;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1])\n;return n||(H(o.replace(\"{}\",t[1])),\nH(\"Falling back to no-highlight mode for this block.\",e)),n?t[1]:\"no-highlight\"}\nreturn n.split(/\\s+/).find((e=>h(e)||v(e)))})(e);if(h(t))return\n;if(O(\"before:highlightElement\",{el:e,language:t\n}),e.dataset.highlighted)return void console.log(\"Element previously highlighted. To highlight again, first unset `dataset.highlighted`.\",e)\n;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn(\"One of your code blocks includes unescaped HTML. This is a potentially serious security risk.\"),\nconsole.warn(\"https://github.com/highlightjs/highlight.js/wiki/security\"),\nconsole.warn(\"The element with unescaped HTML:\"),\nconsole.warn(e)),p.throwUnescapedHTML))throw new V(\"One of your code blocks includes unescaped HTML.\",e.innerHTML)\n;n=e;const a=n.textContent,s=t?f(a,{language:t,ignoreIllegals:!0}):E(a)\n;e.innerHTML=s.value,e.dataset.highlighted=\"yes\",((e,n,t)=>{const a=n&&i[n]||t\n;e.classList.add(\"hljs\"),e.classList.add(\"language-\"+a)\n})(e,t,s.language),e.result={language:s.language,re:s.relevance,\nrelevance:s.relevance},s.secondBest&&(e.secondBest={\nlanguage:s.secondBest.language,relevance:s.secondBest.relevance\n}),O(\"after:highlightElement\",{el:e,result:s,text:a})}let y=!1;function w(){\n\"loading\"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(N):y=!0\n}function v(e){return e=(e||\"\").toLowerCase(),a[e]||a[i[e]]}\nfunction k(e,{languageName:n}){\"string\"==typeof e&&(e=[e]),e.forEach((e=>{\ni[e.toLowerCase()]=n}))}function x(e){const n=v(e)\n;return n&&!n.disableAutodetect}function O(e,n){const t=e;s.forEach((e=>{\ne[t]&&e[t](n)}))}\n\"undefined\"!=typeof window&&window.addEventListener&&window.addEventListener(\"DOMContentLoaded\",(()=>{\ny&&w()}),!1),Object.assign(t,{highlight:f,highlightAuto:E,highlightAll:w,\nhighlightElement:N,\nhighlightBlock:e=>(Z(\"10.7.0\",\"highlightBlock will be removed entirely in v12.0\"),\nZ(\"10.7.0\",\"Please use highlightElement now.\"),N(e)),configure:e=>{p=Y(p,e)},\ninitHighlighting:()=>{\nw(),Z(\"10.6.0\",\"initHighlighting() deprecated.  Use highlightAll() now.\")},\ninitHighlightingOnLoad:()=>{\nw(),Z(\"10.6.0\",\"initHighlightingOnLoad() deprecated.  Use highlightAll() now.\")\n},registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){\nif(K(\"Language definition for '{}' could not be registered.\".replace(\"{}\",e)),\n!r)throw n;K(n),i=c}\ni.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&k(i.aliases,{\nlanguageName:e})},unregisterLanguage:e=>{delete a[e]\n;for(const n of Object.keys(i))i[n]===e&&delete i[n]},\nlistLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:k,\nautoDetection:x,inherit:Y,addPlugin:e=>{(e=>{\ne[\"before:highlightBlock\"]&&!e[\"before:highlightElement\"]&&(e[\"before:highlightElement\"]=n=>{\ne[\"before:highlightBlock\"](Object.assign({block:n.el},n))\n}),e[\"after:highlightBlock\"]&&!e[\"after:highlightElement\"]&&(e[\"after:highlightElement\"]=n=>{\ne[\"after:highlightBlock\"](Object.assign({block:n.el},n))})})(e),s.push(e)},\nremovePlugin:e=>{const n=s.indexOf(e);-1!==n&&s.splice(n,1)}}),t.debugMode=()=>{\nr=!1},t.safeMode=()=>{r=!0},t.versionString=\"11.8.0\",t.regex={concat:b,\nlookahead:d,either:m,optional:u,anyNumberOfTimes:g}\n;for(const n in C)\"object\"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t\n},te=ne({});te.newInstance=()=>ne({});var ae=te\n;const ie=[\"a\",\"abbr\",\"address\",\"article\",\"aside\",\"audio\",\"b\",\"blockquote\",\"body\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"dd\",\"del\",\"details\",\"dfn\",\"div\",\"dl\",\"dt\",\"em\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"label\",\"legend\",\"li\",\"main\",\"mark\",\"menu\",\"nav\",\"object\",\"ol\",\"p\",\"q\",\"quote\",\"samp\",\"section\",\"span\",\"strong\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"ul\",\"var\",\"video\"],se=[\"any-hover\",\"any-pointer\",\"aspect-ratio\",\"color\",\"color-gamut\",\"color-index\",\"device-aspect-ratio\",\"device-height\",\"device-width\",\"display-mode\",\"forced-colors\",\"grid\",\"height\",\"hover\",\"inverted-colors\",\"monochrome\",\"orientation\",\"overflow-block\",\"overflow-inline\",\"pointer\",\"prefers-color-scheme\",\"prefers-contrast\",\"prefers-reduced-motion\",\"prefers-reduced-transparency\",\"resolution\",\"scan\",\"scripting\",\"update\",\"width\",\"min-width\",\"max-width\",\"min-height\",\"max-height\"],re=[\"active\",\"any-link\",\"blank\",\"checked\",\"current\",\"default\",\"defined\",\"dir\",\"disabled\",\"drop\",\"empty\",\"enabled\",\"first\",\"first-child\",\"first-of-type\",\"fullscreen\",\"future\",\"focus\",\"focus-visible\",\"focus-within\",\"has\",\"host\",\"host-context\",\"hover\",\"indeterminate\",\"in-range\",\"invalid\",\"is\",\"lang\",\"last-child\",\"last-of-type\",\"left\",\"link\",\"local-link\",\"not\",\"nth-child\",\"nth-col\",\"nth-last-child\",\"nth-last-col\",\"nth-last-of-type\",\"nth-of-type\",\"only-child\",\"only-of-type\",\"optional\",\"out-of-range\",\"past\",\"placeholder-shown\",\"read-only\",\"read-write\",\"required\",\"right\",\"root\",\"scope\",\"target\",\"target-within\",\"user-invalid\",\"valid\",\"visited\",\"where\"],oe=[\"after\",\"backdrop\",\"before\",\"cue\",\"cue-region\",\"first-letter\",\"first-line\",\"grammar-error\",\"marker\",\"part\",\"placeholder\",\"selection\",\"slotted\",\"spelling-error\"],le=[\"align-content\",\"align-items\",\"align-self\",\"all\",\"animation\",\"animation-delay\",\"animation-direction\",\"animation-duration\",\"animation-fill-mode\",\"animation-iteration-count\",\"animation-name\",\"animation-play-state\",\"animation-timing-function\",\"backface-visibility\",\"background\",\"background-attachment\",\"background-blend-mode\",\"background-clip\",\"background-color\",\"background-image\",\"background-origin\",\"background-position\",\"background-repeat\",\"background-size\",\"block-size\",\"border\",\"border-block\",\"border-block-color\",\"border-block-end\",\"border-block-end-color\",\"border-block-end-style\",\"border-block-end-width\",\"border-block-start\",\"border-block-start-color\",\"border-block-start-style\",\"border-block-start-width\",\"border-block-style\",\"border-block-width\",\"border-bottom\",\"border-bottom-color\",\"border-bottom-left-radius\",\"border-bottom-right-radius\",\"border-bottom-style\",\"border-bottom-width\",\"border-collapse\",\"border-color\",\"border-image\",\"border-image-outset\",\"border-image-repeat\",\"border-image-slice\",\"border-image-source\",\"border-image-width\",\"border-inline\",\"border-inline-color\",\"border-inline-end\",\"border-inline-end-color\",\"border-inline-end-style\",\"border-inline-end-width\",\"border-inline-start\",\"border-inline-start-color\",\"border-inline-start-style\",\"border-inline-start-width\",\"border-inline-style\",\"border-inline-width\",\"border-left\",\"border-left-color\",\"border-left-style\",\"border-left-width\",\"border-radius\",\"border-right\",\"border-right-color\",\"border-right-style\",\"border-right-width\",\"border-spacing\",\"border-style\",\"border-top\",\"border-top-color\",\"border-top-left-radius\",\"border-top-right-radius\",\"border-top-style\",\"border-top-width\",\"border-width\",\"bottom\",\"box-decoration-break\",\"box-shadow\",\"box-sizing\",\"break-after\",\"break-before\",\"break-inside\",\"caption-side\",\"caret-color\",\"clear\",\"clip\",\"clip-path\",\"clip-rule\",\"color\",\"column-count\",\"column-fill\",\"column-gap\",\"column-rule\",\"column-rule-color\",\"column-rule-style\",\"column-rule-width\",\"column-span\",\"column-width\",\"columns\",\"contain\",\"content\",\"content-visibility\",\"counter-increment\",\"counter-reset\",\"cue\",\"cue-after\",\"cue-before\",\"cursor\",\"direction\",\"display\",\"empty-cells\",\"filter\",\"flex\",\"flex-basis\",\"flex-direction\",\"flex-flow\",\"flex-grow\",\"flex-shrink\",\"flex-wrap\",\"float\",\"flow\",\"font\",\"font-display\",\"font-family\",\"font-feature-settings\",\"font-kerning\",\"font-language-override\",\"font-size\",\"font-size-adjust\",\"font-smoothing\",\"font-stretch\",\"font-style\",\"font-synthesis\",\"font-variant\",\"font-variant-caps\",\"font-variant-east-asian\",\"font-variant-ligatures\",\"font-variant-numeric\",\"font-variant-position\",\"font-variation-settings\",\"font-weight\",\"gap\",\"glyph-orientation-vertical\",\"grid\",\"grid-area\",\"grid-auto-columns\",\"grid-auto-flow\",\"grid-auto-rows\",\"grid-column\",\"grid-column-end\",\"grid-column-start\",\"grid-gap\",\"grid-row\",\"grid-row-end\",\"grid-row-start\",\"grid-template\",\"grid-template-areas\",\"grid-template-columns\",\"grid-template-rows\",\"hanging-punctuation\",\"height\",\"hyphens\",\"icon\",\"image-orientation\",\"image-rendering\",\"image-resolution\",\"ime-mode\",\"inline-size\",\"isolation\",\"justify-content\",\"left\",\"letter-spacing\",\"line-break\",\"line-height\",\"list-style\",\"list-style-image\",\"list-style-position\",\"list-style-type\",\"margin\",\"margin-block\",\"margin-block-end\",\"margin-block-start\",\"margin-bottom\",\"margin-inline\",\"margin-inline-end\",\"margin-inline-start\",\"margin-left\",\"margin-right\",\"margin-top\",\"marks\",\"mask\",\"mask-border\",\"mask-border-mode\",\"mask-border-outset\",\"mask-border-repeat\",\"mask-border-slice\",\"mask-border-source\",\"mask-border-width\",\"mask-clip\",\"mask-composite\",\"mask-image\",\"mask-mode\",\"mask-origin\",\"mask-position\",\"mask-repeat\",\"mask-size\",\"mask-type\",\"max-block-size\",\"max-height\",\"max-inline-size\",\"max-width\",\"min-block-size\",\"min-height\",\"min-inline-size\",\"min-width\",\"mix-blend-mode\",\"nav-down\",\"nav-index\",\"nav-left\",\"nav-right\",\"nav-up\",\"none\",\"normal\",\"object-fit\",\"object-position\",\"opacity\",\"order\",\"orphans\",\"outline\",\"outline-color\",\"outline-offset\",\"outline-style\",\"outline-width\",\"overflow\",\"overflow-wrap\",\"overflow-x\",\"overflow-y\",\"padding\",\"padding-block\",\"padding-block-end\",\"padding-block-start\",\"padding-bottom\",\"padding-inline\",\"padding-inline-end\",\"padding-inline-start\",\"padding-left\",\"padding-right\",\"padding-top\",\"page-break-after\",\"page-break-before\",\"page-break-inside\",\"pause\",\"pause-after\",\"pause-before\",\"perspective\",\"perspective-origin\",\"pointer-events\",\"position\",\"quotes\",\"resize\",\"rest\",\"rest-after\",\"rest-before\",\"right\",\"row-gap\",\"scroll-margin\",\"scroll-margin-block\",\"scroll-margin-block-end\",\"scroll-margin-block-start\",\"scroll-margin-bottom\",\"scroll-margin-inline\",\"scroll-margin-inline-end\",\"scroll-margin-inline-start\",\"scroll-margin-left\",\"scroll-margin-right\",\"scroll-margin-top\",\"scroll-padding\",\"scroll-padding-block\",\"scroll-padding-block-end\",\"scroll-padding-block-start\",\"scroll-padding-bottom\",\"scroll-padding-inline\",\"scroll-padding-inline-end\",\"scroll-padding-inline-start\",\"scroll-padding-left\",\"scroll-padding-right\",\"scroll-padding-top\",\"scroll-snap-align\",\"scroll-snap-stop\",\"scroll-snap-type\",\"scrollbar-color\",\"scrollbar-gutter\",\"scrollbar-width\",\"shape-image-threshold\",\"shape-margin\",\"shape-outside\",\"speak\",\"speak-as\",\"src\",\"tab-size\",\"table-layout\",\"text-align\",\"text-align-all\",\"text-align-last\",\"text-combine-upright\",\"text-decoration\",\"text-decoration-color\",\"text-decoration-line\",\"text-decoration-style\",\"text-emphasis\",\"text-emphasis-color\",\"text-emphasis-position\",\"text-emphasis-style\",\"text-indent\",\"text-justify\",\"text-orientation\",\"text-overflow\",\"text-rendering\",\"text-shadow\",\"text-transform\",\"text-underline-position\",\"top\",\"transform\",\"transform-box\",\"transform-origin\",\"transform-style\",\"transition\",\"transition-delay\",\"transition-duration\",\"transition-property\",\"transition-timing-function\",\"unicode-bidi\",\"vertical-align\",\"visibility\",\"voice-balance\",\"voice-duration\",\"voice-family\",\"voice-pitch\",\"voice-range\",\"voice-rate\",\"voice-stress\",\"voice-volume\",\"white-space\",\"widows\",\"width\",\"will-change\",\"word-break\",\"word-spacing\",\"word-wrap\",\"writing-mode\",\"z-index\"].reverse()\n;var ce=\"[0-9](_*[0-9])*\",de=`\\\\.(${ce})`,ge=\"[0-9a-fA-F](_*[0-9a-fA-F])*\",ue={\nclassName:\"number\",variants:[{\nbegin:`(\\\\b(${ce})((${de})|\\\\.)?|(${de}))[eE][+-]?(${ce})[fFdD]?\\\\b`},{\nbegin:`\\\\b(${ce})((${de})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)`},{\nbegin:`(${de})[fFdD]?\\\\b`},{begin:`\\\\b(${ce})[fFdD]\\\\b`},{\nbegin:`\\\\b0[xX]((${ge})\\\\.?|(${ge})?\\\\.(${ge}))[pP][+-]?(${ce})[fFdD]?\\\\b`},{\nbegin:\"\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b\"},{begin:`\\\\b0[xX](${ge})[lL]?\\\\b`},{\nbegin:\"\\\\b0(_*[0-7])*[lL]?\\\\b\"},{begin:\"\\\\b0[bB][01](_*[01])*[lL]?\\\\b\"}],\nrelevance:0};function be(e,n,t){return-1===t?\"\":e.replace(n,(a=>be(e,n,t-1)))}\nconst me=\"[A-Za-z$_][0-9A-Za-z$_]*\",pe=[\"as\",\"in\",\"of\",\"if\",\"for\",\"while\",\"finally\",\"var\",\"new\",\"function\",\"do\",\"return\",\"void\",\"else\",\"break\",\"catch\",\"instanceof\",\"with\",\"throw\",\"case\",\"default\",\"try\",\"switch\",\"continue\",\"typeof\",\"delete\",\"let\",\"yield\",\"const\",\"class\",\"debugger\",\"async\",\"await\",\"static\",\"import\",\"from\",\"export\",\"extends\"],he=[\"true\",\"false\",\"null\",\"undefined\",\"NaN\",\"Infinity\"],fe=[\"Object\",\"Function\",\"Boolean\",\"Symbol\",\"Math\",\"Date\",\"Number\",\"BigInt\",\"String\",\"RegExp\",\"Array\",\"Float32Array\",\"Float64Array\",\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Int32Array\",\"Uint16Array\",\"Uint32Array\",\"BigInt64Array\",\"BigUint64Array\",\"Set\",\"Map\",\"WeakSet\",\"WeakMap\",\"ArrayBuffer\",\"SharedArrayBuffer\",\"Atomics\",\"DataView\",\"JSON\",\"Promise\",\"Generator\",\"GeneratorFunction\",\"AsyncFunction\",\"Reflect\",\"Proxy\",\"Intl\",\"WebAssembly\"],_e=[\"Error\",\"EvalError\",\"InternalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"],Ee=[\"setInterval\",\"setTimeout\",\"clearInterval\",\"clearTimeout\",\"require\",\"exports\",\"eval\",\"isFinite\",\"isNaN\",\"parseFloat\",\"parseInt\",\"decodeURI\",\"decodeURIComponent\",\"encodeURI\",\"encodeURIComponent\",\"escape\",\"unescape\"],Ne=[\"arguments\",\"this\",\"super\",\"console\",\"window\",\"document\",\"localStorage\",\"sessionStorage\",\"module\",\"global\"],ye=[].concat(Ee,fe,_e),we=e=>b(/\\b/,e,/\\w$/.test(e)?/\\b/:/\\B/),ve=[\"Protocol\",\"Type\"].map(we),ke=[\"init\",\"self\"].map(we),xe=[\"Any\",\"Self\"],Oe=[\"actor\",\"any\",\"associatedtype\",\"async\",\"await\",/as\\?/,/as!/,\"as\",\"break\",\"case\",\"catch\",\"class\",\"continue\",\"convenience\",\"default\",\"defer\",\"deinit\",\"didSet\",\"distributed\",\"do\",\"dynamic\",\"else\",\"enum\",\"extension\",\"fallthrough\",/fileprivate\\(set\\)/,\"fileprivate\",\"final\",\"for\",\"func\",\"get\",\"guard\",\"if\",\"import\",\"indirect\",\"infix\",/init\\?/,/init!/,\"inout\",/internal\\(set\\)/,\"internal\",\"in\",\"is\",\"isolated\",\"nonisolated\",\"lazy\",\"let\",\"mutating\",\"nonmutating\",/open\\(set\\)/,\"open\",\"operator\",\"optional\",\"override\",\"postfix\",\"precedencegroup\",\"prefix\",/private\\(set\\)/,\"private\",\"protocol\",/public\\(set\\)/,\"public\",\"repeat\",\"required\",\"rethrows\",\"return\",\"set\",\"some\",\"static\",\"struct\",\"subscript\",\"super\",\"switch\",\"throws\",\"throw\",/try\\?/,/try!/,\"try\",\"typealias\",/unowned\\(safe\\)/,/unowned\\(unsafe\\)/,\"unowned\",\"var\",\"weak\",\"where\",\"while\",\"willSet\"],Se=[\"false\",\"nil\",\"true\"],Ae=[\"assignment\",\"associativity\",\"higherThan\",\"left\",\"lowerThan\",\"none\",\"right\"],Me=[\"#colorLiteral\",\"#column\",\"#dsohandle\",\"#else\",\"#elseif\",\"#endif\",\"#error\",\"#file\",\"#fileID\",\"#fileLiteral\",\"#filePath\",\"#function\",\"#if\",\"#imageLiteral\",\"#keyPath\",\"#line\",\"#selector\",\"#sourceLocation\",\"#warn_unqualified_access\",\"#warning\"],Ce=[\"abs\",\"all\",\"any\",\"assert\",\"assertionFailure\",\"debugPrint\",\"dump\",\"fatalError\",\"getVaList\",\"isKnownUniquelyReferenced\",\"max\",\"min\",\"numericCast\",\"pointwiseMax\",\"pointwiseMin\",\"precondition\",\"preconditionFailure\",\"print\",\"readLine\",\"repeatElement\",\"sequence\",\"stride\",\"swap\",\"swift_unboxFromSwiftValueWithType\",\"transcode\",\"type\",\"unsafeBitCast\",\"unsafeDowncast\",\"withExtendedLifetime\",\"withUnsafeMutablePointer\",\"withUnsafePointer\",\"withVaList\",\"withoutActuallyEscaping\",\"zip\"],Te=m(/[/=\\-+!*%<>&|^~?]/,/[\\u00A1-\\u00A7]/,/[\\u00A9\\u00AB]/,/[\\u00AC\\u00AE]/,/[\\u00B0\\u00B1]/,/[\\u00B6\\u00BB\\u00BF\\u00D7\\u00F7]/,/[\\u2016-\\u2017]/,/[\\u2020-\\u2027]/,/[\\u2030-\\u203E]/,/[\\u2041-\\u2053]/,/[\\u2055-\\u205E]/,/[\\u2190-\\u23FF]/,/[\\u2500-\\u2775]/,/[\\u2794-\\u2BFF]/,/[\\u2E00-\\u2E7F]/,/[\\u3001-\\u3003]/,/[\\u3008-\\u3020]/,/[\\u3030]/),Re=m(Te,/[\\u0300-\\u036F]/,/[\\u1DC0-\\u1DFF]/,/[\\u20D0-\\u20FF]/,/[\\uFE00-\\uFE0F]/,/[\\uFE20-\\uFE2F]/),De=b(Te,Re,\"*\"),Ie=m(/[a-zA-Z_]/,/[\\u00A8\\u00AA\\u00AD\\u00AF\\u00B2-\\u00B5\\u00B7-\\u00BA]/,/[\\u00BC-\\u00BE\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF]/,/[\\u0100-\\u02FF\\u0370-\\u167F\\u1681-\\u180D\\u180F-\\u1DBF]/,/[\\u1E00-\\u1FFF]/,/[\\u200B-\\u200D\\u202A-\\u202E\\u203F-\\u2040\\u2054\\u2060-\\u206F]/,/[\\u2070-\\u20CF\\u2100-\\u218F\\u2460-\\u24FF\\u2776-\\u2793]/,/[\\u2C00-\\u2DFF\\u2E80-\\u2FFF]/,/[\\u3004-\\u3007\\u3021-\\u302F\\u3031-\\u303F\\u3040-\\uD7FF]/,/[\\uF900-\\uFD3D\\uFD40-\\uFDCF\\uFDF0-\\uFE1F\\uFE30-\\uFE44]/,/[\\uFE47-\\uFEFE\\uFF00-\\uFFFD]/),Be=m(Ie,/\\d/,/[\\u0300-\\u036F\\u1DC0-\\u1DFF\\u20D0-\\u20FF\\uFE20-\\uFE2F]/),Le=b(Ie,Be,\"*\"),$e=b(/[A-Z]/,Be,\"*\"),Fe=[\"autoclosure\",b(/convention\\(/,m(\"swift\",\"block\",\"c\"),/\\)/),\"discardableResult\",\"dynamicCallable\",\"dynamicMemberLookup\",\"escaping\",\"frozen\",\"GKInspectable\",\"IBAction\",\"IBDesignable\",\"IBInspectable\",\"IBOutlet\",\"IBSegueAction\",\"inlinable\",\"main\",\"nonobjc\",\"NSApplicationMain\",\"NSCopying\",\"NSManaged\",b(/objc\\(/,Le,/\\)/),\"objc\",\"objcMembers\",\"propertyWrapper\",\"requires_stored_property_inits\",\"resultBuilder\",\"testable\",\"UIApplicationMain\",\"unknown\",\"usableFromInline\"],ze=[\"iOS\",\"iOSApplicationExtension\",\"macOS\",\"macOSApplicationExtension\",\"macCatalyst\",\"macCatalystApplicationExtension\",\"watchOS\",\"watchOSApplicationExtension\",\"tvOS\",\"tvOSApplicationExtension\",\"swift\"]\n;var Ue=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={\nbegin:/\\$\\{/,end:/\\}/,contains:[\"self\",{begin:/:-/,contains:[t]}]}\n;Object.assign(t,{className:\"variable\",variants:[{\nbegin:n.concat(/\\$[\\w\\d#@][\\w\\d_]*/,\"(?![\\\\w\\\\d])(?![$])\")},a]});const i={\nclassName:\"subst\",begin:/\\$\\(/,end:/\\)/,contains:[e.BACKSLASH_ESCAPE]},s={\nbegin:/<<-?\\s*(?=\\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\\w+)/,\nend:/(\\w+)/,className:\"string\"})]}},r={className:\"string\",begin:/\"/,end:/\"/,\ncontains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(r);const o={begin:/\\$?\\(\\(/,\nend:/\\)\\)/,contains:[{begin:/\\d+#[0-9a-f]+/,className:\"number\"},e.NUMBER_MODE,t]\n},l=e.SHEBANG({binary:\"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)\",relevance:10\n}),c={className:\"function\",begin:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,returnBegin:!0,\ncontains:[e.inherit(e.TITLE_MODE,{begin:/\\w[\\w\\d_]*/})],relevance:0};return{\nname:\"Bash\",aliases:[\"sh\"],keywords:{$pattern:/\\b[a-z][a-z0-9._-]+\\b/,\nkeyword:[\"if\",\"then\",\"else\",\"elif\",\"fi\",\"for\",\"while\",\"until\",\"in\",\"do\",\"done\",\"case\",\"esac\",\"function\",\"select\"],\nliteral:[\"true\",\"false\"],\nbuilt_in:[\"break\",\"cd\",\"continue\",\"eval\",\"exec\",\"exit\",\"export\",\"getopts\",\"hash\",\"pwd\",\"readonly\",\"return\",\"shift\",\"test\",\"times\",\"trap\",\"umask\",\"unset\",\"alias\",\"bind\",\"builtin\",\"caller\",\"command\",\"declare\",\"echo\",\"enable\",\"help\",\"let\",\"local\",\"logout\",\"mapfile\",\"printf\",\"read\",\"readarray\",\"source\",\"type\",\"typeset\",\"ulimit\",\"unalias\",\"set\",\"shopt\",\"autoload\",\"bg\",\"bindkey\",\"bye\",\"cap\",\"chdir\",\"clone\",\"comparguments\",\"compcall\",\"compctl\",\"compdescribe\",\"compfiles\",\"compgroups\",\"compquote\",\"comptags\",\"comptry\",\"compvalues\",\"dirs\",\"disable\",\"disown\",\"echotc\",\"echoti\",\"emulate\",\"fc\",\"fg\",\"float\",\"functions\",\"getcap\",\"getln\",\"history\",\"integer\",\"jobs\",\"kill\",\"limit\",\"log\",\"noglob\",\"popd\",\"print\",\"pushd\",\"pushln\",\"rehash\",\"sched\",\"setcap\",\"setopt\",\"stat\",\"suspend\",\"ttyctl\",\"unfunction\",\"unhash\",\"unlimit\",\"unsetopt\",\"vared\",\"wait\",\"whence\",\"where\",\"which\",\"zcompile\",\"zformat\",\"zftp\",\"zle\",\"zmodload\",\"zparseopts\",\"zprof\",\"zpty\",\"zregexparse\",\"zsocket\",\"zstyle\",\"ztcp\",\"chcon\",\"chgrp\",\"chown\",\"chmod\",\"cp\",\"dd\",\"df\",\"dir\",\"dircolors\",\"ln\",\"ls\",\"mkdir\",\"mkfifo\",\"mknod\",\"mktemp\",\"mv\",\"realpath\",\"rm\",\"rmdir\",\"shred\",\"sync\",\"touch\",\"truncate\",\"vdir\",\"b2sum\",\"base32\",\"base64\",\"cat\",\"cksum\",\"comm\",\"csplit\",\"cut\",\"expand\",\"fmt\",\"fold\",\"head\",\"join\",\"md5sum\",\"nl\",\"numfmt\",\"od\",\"paste\",\"ptx\",\"pr\",\"sha1sum\",\"sha224sum\",\"sha256sum\",\"sha384sum\",\"sha512sum\",\"shuf\",\"sort\",\"split\",\"sum\",\"tac\",\"tail\",\"tr\",\"tsort\",\"unexpand\",\"uniq\",\"wc\",\"arch\",\"basename\",\"chroot\",\"date\",\"dirname\",\"du\",\"echo\",\"env\",\"expr\",\"factor\",\"groups\",\"hostid\",\"id\",\"link\",\"logname\",\"nice\",\"nohup\",\"nproc\",\"pathchk\",\"pinky\",\"printenv\",\"printf\",\"pwd\",\"readlink\",\"runcon\",\"seq\",\"sleep\",\"stat\",\"stdbuf\",\"stty\",\"tee\",\"test\",\"timeout\",\"tty\",\"uname\",\"unlink\",\"uptime\",\"users\",\"who\",\"whoami\",\"yes\"]\n},contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,s,{match:/(\\/[a-z._-]+)+/},r,{\nclassName:\"\",begin:/\\\\\"/},{className:\"string\",begin:/'/,end:/'/},t]}},\ngrmr_c:e=>{const n=e.regex,t=e.COMMENT(\"//\",\"$\",{contains:[{begin:/\\\\\\n/}]\n}),a=\"decltype\\\\(auto\\\\)\",i=\"[a-zA-Z_]\\\\w*::\",s=\"(\"+a+\"|\"+n.optional(i)+\"[a-zA-Z_]\\\\w*\"+n.optional(\"<[^<>]+>\")+\")\",r={\nclassName:\"type\",variants:[{begin:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},{\nmatch:/\\batomic_[a-z]{3,6}\\b/}]},o={className:\"string\",variants:[{\nbegin:'(u8?|U|L)?\"',end:'\"',illegal:\"\\\\n\",contains:[e.BACKSLASH_ESCAPE]},{\nbegin:\"(u8?|U|L)?'(\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)|.)\",\nend:\"'\",illegal:\".\"},e.END_SAME_AS_BEGIN({\nbegin:/(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\(/,end:/\\)([^()\\\\ ]{0,16})\"/})]},l={\nclassName:\"number\",variants:[{begin:\"\\\\b(0b[01']+)\"},{\nbegin:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)\"\n},{\nbegin:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"\n}],relevance:0},c={className:\"meta\",begin:/#\\s*[a-z]+\\b/,end:/$/,keywords:{\nkeyword:\"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include\"\n},contains:[{begin:/\\\\\\n/,relevance:0},e.inherit(o,{className:\"string\"}),{\nclassName:\"string\",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={\nclassName:\"title\",begin:n.optional(i)+e.IDENT_RE,relevance:0\n},g=n.optional(i)+e.IDENT_RE+\"\\\\s*\\\\(\",u={\nkeyword:[\"asm\",\"auto\",\"break\",\"case\",\"continue\",\"default\",\"do\",\"else\",\"enum\",\"extern\",\"for\",\"fortran\",\"goto\",\"if\",\"inline\",\"register\",\"restrict\",\"return\",\"sizeof\",\"struct\",\"switch\",\"typedef\",\"union\",\"volatile\",\"while\",\"_Alignas\",\"_Alignof\",\"_Atomic\",\"_Generic\",\"_Noreturn\",\"_Static_assert\",\"_Thread_local\",\"alignas\",\"alignof\",\"noreturn\",\"static_assert\",\"thread_local\",\"_Pragma\"],\ntype:[\"float\",\"double\",\"signed\",\"unsigned\",\"int\",\"short\",\"long\",\"char\",\"void\",\"_Bool\",\"_Complex\",\"_Imaginary\",\"_Decimal32\",\"_Decimal64\",\"_Decimal128\",\"const\",\"static\",\"complex\",\"bool\",\"imaginary\"],\nliteral:\"true false NULL\",\nbuilt_in:\"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr\"\n},b=[c,r,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{\nbegin:/\\(/,end:/\\)/},{beginKeywords:\"new throw return else\",end:/;/}],\nkeywords:u,contains:b.concat([{begin:/\\(/,end:/\\)/,keywords:u,\ncontains:b.concat([\"self\"]),relevance:0}]),relevance:0},p={\nbegin:\"(\"+s+\"[\\\\*&\\\\s]+)+\"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,\nkeywords:u,illegal:/[^\\w\\s\\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{\nbegin:g,returnBegin:!0,contains:[e.inherit(d,{className:\"title.function\"})],\nrelevance:0},{relevance:0,match:/,/},{className:\"params\",begin:/\\(/,end:/\\)/,\nkeywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,r,{begin:/\\(/,\nend:/\\)/,keywords:u,relevance:0,contains:[\"self\",t,e.C_BLOCK_COMMENT_MODE,o,l,r]\n}]},r,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:\"C\",aliases:[\"h\"],keywords:u,\ndisableAutodetect:!0,illegal:\"</\",contains:[].concat(m,p,b,[c,{\nbegin:e.IDENT_RE+\"::\",keywords:u},{className:\"class\",\nbeginKeywords:\"enum class struct union\",end:/[{;:<>=]/,contains:[{\nbeginKeywords:\"final class struct\"},e.TITLE_MODE]}]),exports:{preprocessor:c,\nstrings:o,keywords:u}}},grmr_css:e=>{const n=e.regex,t=(e=>({IMPORTANT:{\nscope:\"meta\",begin:\"!important\"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{\nscope:\"number\",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/},\nFUNCTION_DISPATCH:{className:\"built_in\",begin:/[\\w-]+(?=\\()/},\nATTRIBUTE_SELECTOR_MODE:{scope:\"selector-attr\",begin:/\\[/,end:/\\]/,illegal:\"$\",\ncontains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{\nscope:\"number\",\nbegin:e.NUMBER_RE+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",\nrelevance:0},CSS_VARIABLE:{className:\"attr\",begin:/--[A-Za-z][A-Za-z0-9_-]*/}\n}))(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:\"CSS\",\ncase_insensitive:!0,illegal:/[=|'\\$]/,keywords:{keyframePosition:\"from to\"},\nclassNameAliases:{keyframePosition:\"selector-tag\"},contains:[t.BLOCK_COMMENT,{\nbegin:/-(webkit|moz|ms|o)-(?=[a-z])/},t.CSS_NUMBER_MODE,{\nclassName:\"selector-id\",begin:/#[A-Za-z0-9_-]+/,relevance:0},{\nclassName:\"selector-class\",begin:\"\\\\.[a-zA-Z-][a-zA-Z0-9_-]*\",relevance:0\n},t.ATTRIBUTE_SELECTOR_MODE,{className:\"selector-pseudo\",variants:[{\nbegin:\":(\"+re.join(\"|\")+\")\"},{begin:\":(:)?(\"+oe.join(\"|\")+\")\"}]\n},t.CSS_VARIABLE,{className:\"attribute\",begin:\"\\\\b(\"+le.join(\"|\")+\")\\\\b\"},{\nbegin:/:/,end:/[;}{]/,\ncontains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{\nbegin:/(url|data-uri)\\(/,end:/\\)/,relevance:0,keywords:{built_in:\"url data-uri\"\n},contains:[...a,{className:\"string\",begin:/[^)]/,endsWithParent:!0,\nexcludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:\"[{;]\",\nrelevance:0,illegal:/:/,contains:[{className:\"keyword\",begin:/@-?\\w[\\w]*(-\\w+)*/\n},{begin:/\\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{\n$pattern:/[a-z-]+/,keyword:\"and or not only\",attribute:se.join(\" \")},contains:[{\nbegin:/[a-z-]+(?=:)/,className:\"attribute\"},...a,t.CSS_NUMBER_MODE]}]},{\nclassName:\"selector-tag\",begin:\"\\\\b(\"+ie.join(\"|\")+\")\\\\b\"}]}},grmr_xml:e=>{\nconst n=e.regex,t=n.concat(/[\\p{L}_]/u,n.optional(/[\\p{L}0-9_.-]*:/u),/[\\p{L}0-9_.-]*/u),a={\nclassName:\"symbol\",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\\s/,\ncontains:[{className:\"keyword\",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\\n/}]\n},s=e.inherit(i,{begin:/\\(/,end:/\\)/}),r=e.inherit(e.APOS_STRING_MODE,{\nclassName:\"string\"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:\"string\"}),l={\nendsWithParent:!0,illegal:/</,relevance:0,contains:[{className:\"attr\",\nbegin:/[\\p{L}0-9._:-]+/u,relevance:0},{begin:/=\\s*/,relevance:0,contains:[{\nclassName:\"string\",endsParent:!0,variants:[{begin:/\"/,end:/\"/,contains:[a]},{\nbegin:/'/,end:/'/,contains:[a]},{begin:/[^\\s\"'=<>`]+/}]}]}]};return{\nname:\"HTML, XML\",\naliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],\ncase_insensitive:!0,unicodeRegex:!0,contains:[{className:\"meta\",begin:/<![a-z]/,\nend:/>/,relevance:10,contains:[i,o,r,s,{begin:/\\[/,end:/\\]/,contains:[{\nclassName:\"meta\",begin:/<![a-z]/,end:/>/,contains:[i,s,o,r]}]}]\n},e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\\[CDATA\\[/,end:/\\]\\]>/,\nrelevance:10},a,{className:\"meta\",end:/\\?>/,variants:[{begin:/<\\?xml/,\nrelevance:10,contains:[o]},{begin:/<\\?[a-z][a-z0-9]+/}]},{className:\"tag\",\nbegin:/<style(?=\\s|>)/,end:/>/,keywords:{name:\"style\"},contains:[l],starts:{\nend:/<\\/style>/,returnEnd:!0,subLanguage:[\"css\",\"xml\"]}},{className:\"tag\",\nbegin:/<script(?=\\s|>)/,end:/>/,keywords:{name:\"script\"},contains:[l],starts:{\nend:/<\\/script>/,returnEnd:!0,subLanguage:[\"javascript\",\"handlebars\",\"xml\"]}},{\nclassName:\"tag\",begin:/<>|<\\/>/},{className:\"tag\",\nbegin:n.concat(/</,n.lookahead(n.concat(t,n.either(/\\/>/,/>/,/\\s/)))),\nend:/\\/?>/,contains:[{className:\"name\",begin:t,relevance:0,starts:l}]},{\nclassName:\"tag\",begin:n.concat(/<\\//,n.lookahead(n.concat(t,/>/))),contains:[{\nclassName:\"name\",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}\n},grmr_markdown:e=>{const n={begin:/<\\/?[A-Za-z_]/,end:\">\",subLanguage:\"xml\",\nrelevance:0},t={variants:[{begin:/\\[.+?\\]\\[.*?\\]/,relevance:0},{\nbegin:/\\[.+?\\]\\(((data|javascript|mailto):|(?:http|ftp)s?:\\/\\/).*?\\)/,\nrelevance:2},{\nbegin:e.regex.concat(/\\[.+?\\]\\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\\/\\/.*?\\)/),\nrelevance:2},{begin:/\\[.+?\\]\\([./?&#].*?\\)/,relevance:1},{\nbegin:/\\[.*?\\]\\(.*?\\)/,relevance:0}],returnBegin:!0,contains:[{match:/\\[(?=\\])/\n},{className:\"string\",relevance:0,begin:\"\\\\[\",end:\"\\\\]\",excludeBegin:!0,\nreturnEnd:!0},{className:\"link\",relevance:0,begin:\"\\\\]\\\\(\",end:\"\\\\)\",\nexcludeBegin:!0,excludeEnd:!0},{className:\"symbol\",relevance:0,begin:\"\\\\]\\\\[\",\nend:\"\\\\]\",excludeBegin:!0,excludeEnd:!0}]},a={className:\"strong\",contains:[],\nvariants:[{begin:/_{2}(?!\\s)/,end:/_{2}/},{begin:/\\*{2}(?!\\s)/,end:/\\*{2}/}]\n},i={className:\"emphasis\",contains:[],variants:[{begin:/\\*(?![*\\s])/,end:/\\*/},{\nbegin:/_(?![_\\s])/,end:/_/,relevance:0}]},s=e.inherit(a,{contains:[]\n}),r=e.inherit(i,{contains:[]});a.contains.push(r),i.contains.push(s)\n;let o=[n,t];return[a,i,s,r].forEach((e=>{e.contains=e.contains.concat(o)\n})),o=o.concat(a,i),{name:\"Markdown\",aliases:[\"md\",\"mkdown\",\"mkd\"],contains:[{\nclassName:\"section\",variants:[{begin:\"^#{1,6}\",end:\"$\",contains:o},{\nbegin:\"(?=^.+?\\\\n[=-]{2,}$)\",contains:[{begin:\"^[=-]*$\"},{begin:\"^\",end:\"\\\\n\",\ncontains:o}]}]},n,{className:\"bullet\",begin:\"^[ \\t]*([*+-]|(\\\\d+\\\\.))(?=\\\\s+)\",\nend:\"\\\\s+\",excludeEnd:!0},a,i,{className:\"quote\",begin:\"^>\\\\s+\",contains:o,\nend:\"$\"},{className:\"code\",variants:[{begin:\"(`{3,})[^`](.|\\\\n)*?\\\\1`*[ ]*\"},{\nbegin:\"(~{3,})[^~](.|\\\\n)*?\\\\1~*[ ]*\"},{begin:\"```\",end:\"```+[ ]*$\"},{\nbegin:\"~~~\",end:\"~~~+[ ]*$\"},{begin:\"`.+?`\"},{begin:\"(?=^( {4}|\\\\t))\",\ncontains:[{begin:\"^( {4}|\\\\t)\",end:\"(\\\\n)$\"}],relevance:0}]},{\nbegin:\"^[-\\\\*]{3,}\",end:\"$\"},t,{begin:/^\\[[^\\n]+\\]:/,returnBegin:!0,contains:[{\nclassName:\"symbol\",begin:/\\[/,end:/\\]/,excludeBegin:!0,excludeEnd:!0},{\nclassName:\"link\",begin:/:\\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_dart:e=>{\nconst n={className:\"subst\",variants:[{begin:\"\\\\$[A-Za-z0-9_]+\"}]},t={\nclassName:\"subst\",variants:[{begin:/\\$\\{/,end:/\\}/}],\nkeywords:\"true false null this is new super\"},a={className:\"string\",variants:[{\nbegin:\"r'''\",end:\"'''\"},{begin:'r\"\"\"',end:'\"\"\"'},{begin:\"r'\",end:\"'\",\nillegal:\"\\\\n\"},{begin:'r\"',end:'\"',illegal:\"\\\\n\"},{begin:\"'''\",end:\"'''\",\ncontains:[e.BACKSLASH_ESCAPE,n,t]},{begin:'\"\"\"',end:'\"\"\"',\ncontains:[e.BACKSLASH_ESCAPE,n,t]},{begin:\"'\",end:\"'\",illegal:\"\\\\n\",\ncontains:[e.BACKSLASH_ESCAPE,n,t]},{begin:'\"',end:'\"',illegal:\"\\\\n\",\ncontains:[e.BACKSLASH_ESCAPE,n,t]}]};t.contains=[e.C_NUMBER_MODE,a]\n;const i=[\"Comparable\",\"DateTime\",\"Duration\",\"Function\",\"Iterable\",\"Iterator\",\"List\",\"Map\",\"Match\",\"Object\",\"Pattern\",\"RegExp\",\"Set\",\"Stopwatch\",\"String\",\"StringBuffer\",\"StringSink\",\"Symbol\",\"Type\",\"Uri\",\"bool\",\"double\",\"int\",\"num\",\"Element\",\"ElementList\"],s=i.map((e=>e+\"?\"))\n;return{name:\"Dart\",keywords:{\nkeyword:[\"abstract\",\"as\",\"assert\",\"async\",\"await\",\"base\",\"break\",\"case\",\"catch\",\"class\",\"const\",\"continue\",\"covariant\",\"default\",\"deferred\",\"do\",\"dynamic\",\"else\",\"enum\",\"export\",\"extends\",\"extension\",\"external\",\"factory\",\"false\",\"final\",\"finally\",\"for\",\"Function\",\"get\",\"hide\",\"if\",\"implements\",\"import\",\"in\",\"interface\",\"is\",\"late\",\"library\",\"mixin\",\"new\",\"null\",\"on\",\"operator\",\"part\",\"required\",\"rethrow\",\"return\",\"sealed\",\"set\",\"show\",\"static\",\"super\",\"switch\",\"sync\",\"this\",\"throw\",\"true\",\"try\",\"typedef\",\"var\",\"void\",\"when\",\"while\",\"with\",\"yield\"],\nbuilt_in:i.concat(s).concat([\"Never\",\"Null\",\"dynamic\",\"print\",\"document\",\"querySelector\",\"querySelectorAll\",\"window\"]),\n$pattern:/[A-Za-z][A-Za-z0-9_]*\\??/},\ncontains:[a,e.COMMENT(/\\/\\*\\*(?!\\/)/,/\\*\\//,{subLanguage:\"markdown\",relevance:0\n}),e.COMMENT(/\\/{3,} ?/,/$/,{contains:[{subLanguage:\"markdown\",begin:\".\",\nend:\"$\",relevance:0}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{\nclassName:\"class\",beginKeywords:\"class interface\",end:/\\{/,excludeEnd:!0,\ncontains:[{beginKeywords:\"extends implements\"},e.UNDERSCORE_TITLE_MODE]\n},e.C_NUMBER_MODE,{className:\"meta\",begin:\"@[A-Za-z]+\"},{begin:\"=>\"}]}},\ngrmr_diff:e=>{const n=e.regex;return{name:\"Diff\",aliases:[\"patch\"],contains:[{\nclassName:\"meta\",relevance:10,\nmatch:n.either(/^@@ +-\\d+,\\d+ +\\+\\d+,\\d+ +@@/,/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/,/^--- +\\d+,\\d+ +----$/)\n},{className:\"comment\",variants:[{\nbegin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\\*{3} /,/^\\+{3}/,/^diff --git/),\nend:/$/},{match:/^\\*{15}$/}]},{className:\"addition\",begin:/^\\+/,end:/$/},{\nclassName:\"deletion\",begin:/^-/,end:/$/},{className:\"addition\",begin:/^!/,\nend:/$/}]}},grmr_java:e=>{\nconst n=e.regex,t=\"[\\xc0-\\u02b8a-zA-Z_$][\\xc0-\\u02b8a-zA-Z_$0-9]*\",a=t+be(\"(?:<\"+t+\"~~~(?:\\\\s*,\\\\s*\"+t+\"~~~)*>)?\",/~~~/g,2),i={\nkeyword:[\"synchronized\",\"abstract\",\"private\",\"var\",\"static\",\"if\",\"const \",\"for\",\"while\",\"strictfp\",\"finally\",\"protected\",\"import\",\"native\",\"final\",\"void\",\"enum\",\"else\",\"break\",\"transient\",\"catch\",\"instanceof\",\"volatile\",\"case\",\"assert\",\"package\",\"default\",\"public\",\"try\",\"switch\",\"continue\",\"throws\",\"protected\",\"public\",\"private\",\"module\",\"requires\",\"exports\",\"do\",\"sealed\",\"yield\",\"permits\"],\nliteral:[\"false\",\"true\",\"null\"],\ntype:[\"char\",\"boolean\",\"long\",\"float\",\"int\",\"byte\",\"short\",\"double\"],\nbuilt_in:[\"super\",\"this\"]},s={className:\"meta\",begin:\"@\"+t,contains:[{\nbegin:/\\(/,end:/\\)/,contains:[\"self\"]}]},r={className:\"params\",begin:/\\(/,\nend:/\\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0}\n;return{name:\"Java\",aliases:[\"jsp\"],keywords:i,illegal:/<\\/|#/,\ncontains:[e.COMMENT(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,contains:[{begin:/\\w+@/,\nrelevance:0},{className:\"doctag\",begin:\"@[A-Za-z]+\"}]}),{\nbegin:/import java\\.[a-z]+\\./,keywords:\"import\",relevance:2\n},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/\"\"\"/,end:/\"\"\"/,\nclassName:\"string\",contains:[e.BACKSLASH_ESCAPE]\n},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{\nmatch:[/\\b(?:class|interface|enum|extends|implements|new)/,/\\s+/,t],className:{\n1:\"keyword\",3:\"title.class\"}},{match:/non-sealed/,scope:\"keyword\"},{\nbegin:[n.concat(/(?!else)/,t),/\\s+/,t,/\\s+/,/=(?!=)/],className:{1:\"type\",\n3:\"variable\",5:\"operator\"}},{begin:[/record/,/\\s+/,t],className:{1:\"keyword\",\n3:\"title.class\"},contains:[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{\nbeginKeywords:\"new throw return else\",relevance:0},{\nbegin:[\"(?:\"+a+\"\\\\s+)\",e.UNDERSCORE_IDENT_RE,/\\s*(?=\\()/],className:{\n2:\"title.function\"},keywords:i,contains:[{className:\"params\",begin:/\\(/,\nend:/\\)/,keywords:i,relevance:0,\ncontains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,ue,e.C_BLOCK_COMMENT_MODE]\n},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},ue,s]}},grmr_javascript:e=>{\nconst n=e.regex,t=me,a={begin:/<[A-Za-z0-9\\\\._:-]+/,\nend:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,isTrulyOpeningTag:(e,n)=>{\nconst t=e[0].length+e.index,a=e.input[t]\n;if(\"<\"===a||\",\"===a)return void n.ignoreMatch();let i\n;\">\"===a&&(((e,{after:n})=>{const t=\"</\"+e[0].slice(1)\n;return-1!==e.input.indexOf(t,n)})(e,{after:t})||n.ignoreMatch())\n;const s=e.input.substring(t)\n;((i=s.match(/^\\s*=/))||(i=s.match(/^\\s+extends\\s+/))&&0===i.index)&&n.ignoreMatch()\n}},i={$pattern:me,keyword:pe,literal:he,built_in:ye,\"variable.language\":Ne\n},s=\"[0-9](_?[0-9])*\",r=`\\\\.(${s})`,o=\"0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*\",l={\nclassName:\"number\",variants:[{\nbegin:`(\\\\b(${o})((${r})|\\\\.)?|(${r}))[eE][+-]?(${s})\\\\b`},{\nbegin:`\\\\b(${o})\\\\b((${r})\\\\b|\\\\.)?|(${r})\\\\b`},{\nbegin:\"\\\\b(0|[1-9](_?[0-9])*)n\\\\b\"},{\nbegin:\"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\"},{\nbegin:\"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\"},{begin:\"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\"},{\nbegin:\"\\\\b0[0-7]+n?\\\\b\"}],relevance:0},c={className:\"subst\",begin:\"\\\\$\\\\{\",\nend:\"\\\\}\",keywords:i,contains:[]},d={begin:\"html`\",end:\"\",starts:{end:\"`\",\nreturnEnd:!1,contains:[e.BACKSLASH_ESCAPE,c],subLanguage:\"xml\"}},g={\nbegin:\"css`\",end:\"\",starts:{end:\"`\",returnEnd:!1,\ncontains:[e.BACKSLASH_ESCAPE,c],subLanguage:\"css\"}},u={begin:\"gql`\",end:\"\",\nstarts:{end:\"`\",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,c],\nsubLanguage:\"graphql\"}},b={className:\"string\",begin:\"`\",end:\"`\",\ncontains:[e.BACKSLASH_ESCAPE,c]},m={className:\"comment\",\nvariants:[e.COMMENT(/\\/\\*\\*(?!\\/)/,\"\\\\*/\",{relevance:0,contains:[{\nbegin:\"(?=@[A-Za-z]+)\",relevance:0,contains:[{className:\"doctag\",\nbegin:\"@[A-Za-z]+\"},{className:\"type\",begin:\"\\\\{\",end:\"\\\\}\",excludeEnd:!0,\nexcludeBegin:!0,relevance:0},{className:\"variable\",begin:t+\"(?=\\\\s*(-)|$)\",\nendsParent:!0,relevance:0},{begin:/(?=[^\\n])\\s/,relevance:0}]}]\n}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]\n},p=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,{match:/\\$\\d+/},l]\n;c.contains=p.concat({begin:/\\{/,end:/\\}/,keywords:i,contains:[\"self\"].concat(p)\n});const h=[].concat(m,c.contains),f=h.concat([{begin:/\\(/,end:/\\)/,keywords:i,\ncontains:[\"self\"].concat(h)}]),_={className:\"params\",begin:/\\(/,end:/\\)/,\nexcludeBegin:!0,excludeEnd:!0,keywords:i,contains:f},E={variants:[{\nmatch:[/class/,/\\s+/,t,/\\s+/,/extends/,/\\s+/,n.concat(t,\"(\",n.concat(/\\./,t),\")*\")],\nscope:{1:\"keyword\",3:\"title.class\",5:\"keyword\",7:\"title.class.inherited\"}},{\nmatch:[/class/,/\\s+/,t],scope:{1:\"keyword\",3:\"title.class\"}}]},N={relevance:0,\nmatch:n.either(/\\bJSON/,/\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,/\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,/\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/),\nclassName:\"title.class\",keywords:{_:[...fe,..._e]}},y={variants:[{\nmatch:[/function/,/\\s+/,t,/(?=\\s*\\()/]},{match:[/function/,/\\s*(?=\\()/]}],\nclassName:{1:\"keyword\",3:\"title.function\"},label:\"func.def\",contains:[_],\nillegal:/%/},w={\nmatch:n.concat(/\\b/,(v=[...Ee,\"super\",\"import\"],n.concat(\"(?!\",v.join(\"|\"),\")\")),t,n.lookahead(/\\(/)),\nclassName:\"title.function\",relevance:0};var v;const k={\nbegin:n.concat(/\\./,n.lookahead(n.concat(t,/(?![0-9A-Za-z$_(])/))),end:t,\nexcludeBegin:!0,keywords:\"prototype\",className:\"property\",relevance:0},x={\nmatch:[/get|set/,/\\s+/,t,/(?=\\()/],className:{1:\"keyword\",3:\"title.function\"},\ncontains:[{begin:/\\(\\)/},_]\n},O=\"(\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)|\"+e.UNDERSCORE_IDENT_RE+\")\\\\s*=>\",S={\nmatch:[/const|var|let/,/\\s+/,t,/\\s*/,/=\\s*/,/(async\\s*)?/,n.lookahead(O)],\nkeywords:\"async\",className:{1:\"keyword\",3:\"title.function\"},contains:[_]}\n;return{name:\"JavaScript\",aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],keywords:i,exports:{\nPARAMS_CONTAINS:f,CLASS_REFERENCE:N},illegal:/#(?![$_A-z])/,\ncontains:[e.SHEBANG({label:\"shebang\",binary:\"node\",relevance:5}),{\nlabel:\"use_strict\",className:\"meta\",relevance:10,\nbegin:/^\\s*['\"]use (strict|asm)['\"]/\n},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\\$\\d+/},l,N,{\nclassName:\"attr\",begin:t+n.lookahead(\":\"),relevance:0},S,{\nbegin:\"(\"+e.RE_STARTERS_RE+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",\nkeywords:\"return throw case\",relevance:0,contains:[m,e.REGEXP_MODE,{\nclassName:\"function\",begin:O,returnBegin:!0,end:\"\\\\s*=>\",contains:[{\nclassName:\"params\",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{\nclassName:null,begin:/\\(\\s*\\)/,skip:!0},{begin:/\\(/,end:/\\)/,excludeBegin:!0,\nexcludeEnd:!0,keywords:i,contains:f}]}]},{begin:/,/,relevance:0},{match:/\\s+/,\nrelevance:0},{variants:[{begin:\"<>\",end:\"</>\"},{\nmatch:/<[A-Za-z0-9\\\\._:-]+\\s*\\/>/},{begin:a.begin,\n\"on:begin\":a.isTrulyOpeningTag,end:a.end}],subLanguage:\"xml\",contains:[{\nbegin:a.begin,end:a.end,skip:!0,contains:[\"self\"]}]}]},y,{\nbeginKeywords:\"while if switch catch for\"},{\nbegin:\"\\\\b(?!function)\"+e.UNDERSCORE_IDENT_RE+\"\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)\\\\s*\\\\{\",\nreturnBegin:!0,label:\"func.def\",contains:[_,e.inherit(e.TITLE_MODE,{begin:t,\nclassName:\"title.function\"})]},{match:/\\.\\.\\./,relevance:0},k,{match:\"\\\\$\"+t,\nrelevance:0},{match:[/\\bconstructor(?=\\s*\\()/],className:{1:\"title.function\"},\ncontains:[_]},w,{relevance:0,match:/\\b[A-Z][A-Z_0-9]+\\b/,\nclassName:\"variable.constant\"},E,x,{match:/\\$[(.]/}]}},grmr_json:e=>{\nconst n=[\"true\",\"false\",\"null\"],t={scope:\"literal\",beginKeywords:n.join(\" \")}\n;return{name:\"JSON\",keywords:{literal:n},contains:[{className:\"attr\",\nbegin:/\"(\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,relevance:1.01},{match:/[{}[\\],:]/,\nclassName:\"punctuation\",relevance:0\n},e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],\nillegal:\"\\\\S\"}},grmr_kotlin:e=>{const n={\nkeyword:\"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual\",\nbuilt_in:\"Byte Short Char Int Long Boolean Float Double Void Unit Nothing\",\nliteral:\"true false null\"},t={className:\"symbol\",begin:e.UNDERSCORE_IDENT_RE+\"@\"\n},a={className:\"subst\",begin:/\\$\\{/,end:/\\}/,contains:[e.C_NUMBER_MODE]},i={\nclassName:\"variable\",begin:\"\\\\$\"+e.UNDERSCORE_IDENT_RE},s={className:\"string\",\nvariants:[{begin:'\"\"\"',end:'\"\"\"(?=[^\"])',contains:[i,a]},{begin:\"'\",end:\"'\",\nillegal:/\\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'\"',end:'\"',illegal:/\\n/,\ncontains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(s);const r={\nclassName:\"meta\",\nbegin:\"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*\"+e.UNDERSCORE_IDENT_RE+\")?\"\n},o={className:\"meta\",begin:\"@\"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\\(/,\nend:/\\)/,contains:[e.inherit(s,{className:\"string\"}),\"self\"]}]\n},l=ue,c=e.COMMENT(\"/\\\\*\",\"\\\\*/\",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={\nvariants:[{className:\"type\",begin:e.UNDERSCORE_IDENT_RE},{begin:/\\(/,end:/\\)/,\ncontains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g],\n{name:\"Kotlin\",aliases:[\"kt\",\"kts\"],keywords:n,\ncontains:[e.COMMENT(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,contains:[{className:\"doctag\",\nbegin:\"@[A-Za-z]+\"}]}),e.C_LINE_COMMENT_MODE,c,{className:\"keyword\",\nbegin:/\\b(break|continue|return|this)\\b/,starts:{contains:[{className:\"symbol\",\nbegin:/@\\w+/}]}},t,r,o,{className:\"function\",beginKeywords:\"fun\",end:\"[(]|$\",\nreturnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{\nbegin:e.UNDERSCORE_IDENT_RE+\"\\\\s*\\\\(\",returnBegin:!0,relevance:0,\ncontains:[e.UNDERSCORE_TITLE_MODE]},{className:\"type\",begin:/</,end:/>/,\nkeywords:\"reified\",relevance:0},{className:\"params\",begin:/\\(/,end:/\\)/,\nendsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\\/]/,\nendsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0\n},e.C_LINE_COMMENT_MODE,c,r,o,s,e.C_NUMBER_MODE]},c]},{\nbegin:[/class|interface|trait/,/\\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{\n3:\"title.class\"},keywords:\"class interface trait\",end:/[:\\{(]|$/,excludeEnd:!0,\nillegal:\"extends implements\",contains:[{\nbeginKeywords:\"public protected internal private constructor\"\n},e.UNDERSCORE_TITLE_MODE,{className:\"type\",begin:/</,end:/>/,excludeBegin:!0,\nexcludeEnd:!0,relevance:0},{className:\"type\",begin:/[,:]\\s*/,end:/[<\\(,){\\s]|$/,\nexcludeBegin:!0,returnEnd:!0},r,o]},s,{className:\"meta\",begin:\"^#!/usr/bin/env\",\nend:\"$\",illegal:\"\\n\"},l]}},grmr_objectivec:e=>{\nconst n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n,\nkeyword:[\"@interface\",\"@class\",\"@protocol\",\"@implementation\"]};return{\nname:\"Objective-C\",aliases:[\"mm\",\"objc\",\"obj-c\",\"obj-c++\",\"objective-c++\"],\nkeywords:{\"variable.language\":[\"this\",\"super\"],$pattern:n,\nkeyword:[\"while\",\"export\",\"sizeof\",\"typedef\",\"const\",\"struct\",\"for\",\"union\",\"volatile\",\"static\",\"mutable\",\"if\",\"do\",\"return\",\"goto\",\"enum\",\"else\",\"break\",\"extern\",\"asm\",\"case\",\"default\",\"register\",\"explicit\",\"typename\",\"switch\",\"continue\",\"inline\",\"readonly\",\"assign\",\"readwrite\",\"self\",\"@synchronized\",\"id\",\"typeof\",\"nonatomic\",\"IBOutlet\",\"IBAction\",\"strong\",\"weak\",\"copy\",\"in\",\"out\",\"inout\",\"bycopy\",\"byref\",\"oneway\",\"__strong\",\"__weak\",\"__block\",\"__autoreleasing\",\"@private\",\"@protected\",\"@public\",\"@try\",\"@property\",\"@end\",\"@throw\",\"@catch\",\"@finally\",\"@autoreleasepool\",\"@synthesize\",\"@dynamic\",\"@selector\",\"@optional\",\"@required\",\"@encode\",\"@package\",\"@import\",\"@defs\",\"@compatibility_alias\",\"__bridge\",\"__bridge_transfer\",\"__bridge_retained\",\"__bridge_retain\",\"__covariant\",\"__contravariant\",\"__kindof\",\"_Nonnull\",\"_Nullable\",\"_Null_unspecified\",\"__FUNCTION__\",\"__PRETTY_FUNCTION__\",\"__attribute__\",\"getter\",\"setter\",\"retain\",\"unsafe_unretained\",\"nonnull\",\"nullable\",\"null_unspecified\",\"null_resettable\",\"class\",\"instancetype\",\"NS_DESIGNATED_INITIALIZER\",\"NS_UNAVAILABLE\",\"NS_REQUIRES_SUPER\",\"NS_RETURNS_INNER_POINTER\",\"NS_INLINE\",\"NS_AVAILABLE\",\"NS_DEPRECATED\",\"NS_ENUM\",\"NS_OPTIONS\",\"NS_SWIFT_UNAVAILABLE\",\"NS_ASSUME_NONNULL_BEGIN\",\"NS_ASSUME_NONNULL_END\",\"NS_REFINED_FOR_SWIFT\",\"NS_SWIFT_NAME\",\"NS_SWIFT_NOTHROW\",\"NS_DURING\",\"NS_HANDLER\",\"NS_ENDHANDLER\",\"NS_VALUERETURN\",\"NS_VOIDRETURN\"],\nliteral:[\"false\",\"true\",\"FALSE\",\"TRUE\",\"nil\",\"YES\",\"NO\",\"NULL\"],\nbuilt_in:[\"dispatch_once_t\",\"dispatch_queue_t\",\"dispatch_sync\",\"dispatch_async\",\"dispatch_once\"],\ntype:[\"int\",\"float\",\"char\",\"unsigned\",\"signed\",\"short\",\"long\",\"double\",\"wchar_t\",\"unichar\",\"void\",\"bool\",\"BOOL\",\"id|0\",\"_Bool\"]\n},illegal:\"</\",contains:[{className:\"built_in\",\nbegin:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"\n},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{\nclassName:\"string\",variants:[{begin:'@\"',end:'\"',illegal:\"\\\\n\",\ncontains:[e.BACKSLASH_ESCAPE]}]},{className:\"meta\",begin:/#\\s*[a-z]+\\b/,end:/$/,\nkeywords:{\nkeyword:\"if else elif endif define undef warning error line pragma ifdef ifndef include\"\n},contains:[{begin:/\\\\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{\nclassName:\"string\"}),{className:\"string\",begin:/<.*?>/,end:/$/,illegal:\"\\\\n\"\n},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:\"class\",\nbegin:\"(\"+t.keyword.join(\"|\")+\")\\\\b\",end:/(\\{|$)/,excludeEnd:!0,keywords:t,\ncontains:[e.UNDERSCORE_TITLE_MODE]},{begin:\"\\\\.\"+e.UNDERSCORE_IDENT_RE,\nrelevance:0}]}},grmr_plaintext:e=>({name:\"Plain text\",aliases:[\"text\",\"txt\"],\ndisableAutodetect:!0}),grmr_shell:e=>({name:\"Shell Session\",\naliases:[\"console\",\"shellsession\"],contains:[{className:\"meta.prompt\",\nbegin:/^\\s{0,3}[/~\\w\\d[\\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\\\](?=\\s*$)/,\nsubLanguage:\"bash\"}}]}),grmr_swift:e=>{const n={match:/\\s+/,relevance:0\n},t=e.COMMENT(\"/\\\\*\",\"\\\\*/\",{contains:[\"self\"]}),a=[e.C_LINE_COMMENT_MODE,t],i={\nmatch:[/\\./,m(...ve,...ke)],className:{2:\"keyword\"}},s={match:b(/\\./,m(...Oe)),\nrelevance:0},r=Oe.filter((e=>\"string\"==typeof e)).concat([\"_|0\"]),o={variants:[{\nclassName:\"keyword\",\nmatch:m(...Oe.filter((e=>\"string\"!=typeof e)).concat(xe).map(we),...ke)}]},l={\n$pattern:m(/\\b\\w+/,/#\\w+/),keyword:r.concat(Me),literal:Se},c=[i,s,o],g=[{\nmatch:b(/\\./,m(...Ce)),relevance:0},{className:\"built_in\",\nmatch:b(/\\b/,m(...Ce),/(?=\\()/)}],u={match:/->/,relevance:0},p=[u,{\nclassName:\"operator\",relevance:0,variants:[{match:De},{match:`\\\\.(\\\\.|${Re})+`}]\n}],h=\"([0-9]_*)+\",f=\"([0-9a-fA-F]_*)+\",_={className:\"number\",relevance:0,\nvariants:[{match:`\\\\b(${h})(\\\\.(${h}))?([eE][+-]?(${h}))?\\\\b`},{\nmatch:`\\\\b0x(${f})(\\\\.(${f}))?([pP][+-]?(${h}))?\\\\b`},{match:/\\b0o([0-7]_*)+\\b/\n},{match:/\\b0b([01]_*)+\\b/}]},E=(e=\"\")=>({className:\"subst\",variants:[{\nmatch:b(/\\\\/,e,/[0\\\\tnr\"']/)},{match:b(/\\\\/,e,/u\\{[0-9a-fA-F]{1,8}\\}/)}]\n}),N=(e=\"\")=>({className:\"subst\",match:b(/\\\\/,e,/[\\t ]*(?:[\\r\\n]|\\r\\n)/)\n}),y=(e=\"\")=>({className:\"subst\",label:\"interpol\",begin:b(/\\\\/,e,/\\(/),end:/\\)/\n}),w=(e=\"\")=>({begin:b(e,/\"\"\"/),end:b(/\"\"\"/,e),contains:[E(e),N(e),y(e)]\n}),v=(e=\"\")=>({begin:b(e,/\"/),end:b(/\"/,e),contains:[E(e),y(e)]}),k={\nclassName:\"string\",\nvariants:[w(),w(\"#\"),w(\"##\"),w(\"###\"),v(),v(\"#\"),v(\"##\"),v(\"###\")]},x={\nmatch:b(/`/,Le,/`/)},O=[x,{className:\"variable\",match:/\\$\\d+/},{\nclassName:\"variable\",match:`\\\\$${Be}+`}],S=[{match:/(@|#(un)?)available/,\nclassName:\"keyword\",starts:{contains:[{begin:/\\(/,end:/\\)/,keywords:ze,\ncontains:[...p,_,k]}]}},{className:\"keyword\",match:b(/@/,m(...Fe))},{\nclassName:\"meta\",match:b(/@/,Le)}],A={match:d(/\\b[A-Z]/),relevance:0,contains:[{\nclassName:\"type\",\nmatch:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Be,\"+\")\n},{className:\"type\",match:$e,relevance:0},{match:/[?!]+/,relevance:0},{\nmatch:/\\.\\.\\./,relevance:0},{match:b(/\\s+&\\s+/,d($e)),relevance:0}]},M={\nbegin:/</,end:/>/,keywords:l,contains:[...a,...c,...S,u,A]};A.contains.push(M)\n;const C={begin:/\\(/,end:/\\)/,relevance:0,keywords:l,contains:[\"self\",{\nmatch:b(Le,/\\s*:/),keywords:\"_|0\",relevance:0\n},...a,...c,...g,...p,_,k,...O,...S,A]},T={begin:/</,end:/>/,contains:[...a,A]\n},R={begin:/\\(/,end:/\\)/,keywords:l,contains:[{\nbegin:m(d(b(Le,/\\s*:/)),d(b(Le,/\\s+/,Le,/\\s*:/))),end:/:/,relevance:0,\ncontains:[{className:\"keyword\",match:/\\b_\\b/},{className:\"params\",match:Le}]\n},...a,...c,...p,_,k,...S,A,C],endsParent:!0,illegal:/[\"']/},D={\nmatch:[/func/,/\\s+/,m(x.match,Le,De)],className:{1:\"keyword\",3:\"title.function\"\n},contains:[T,R,n],illegal:[/\\[/,/%/]},I={\nmatch:[/\\b(?:subscript|init[?!]?)/,/\\s*(?=[<(])/],className:{1:\"keyword\"},\ncontains:[T,R,n],illegal:/\\[|%/},B={match:[/operator/,/\\s+/,De],className:{\n1:\"keyword\",3:\"title\"}},L={begin:[/precedencegroup/,/\\s+/,$e],className:{\n1:\"keyword\",3:\"title\"},contains:[A],keywords:[...Ae,...Se],end:/}/}\n;for(const e of k.variants){const n=e.contains.find((e=>\"interpol\"===e.label))\n;n.keywords=l;const t=[...c,...g,...p,_,k,...O];n.contains=[...t,{begin:/\\(/,\nend:/\\)/,contains:[\"self\",...t]}]}return{name:\"Swift\",keywords:l,\ncontains:[...a,D,I,{beginKeywords:\"struct protocol class extension enum actor\",\nend:\"\\\\{\",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{\nclassName:\"title.class\",begin:/[A-Za-z$_][\\u00C0-\\u02B80-9A-Za-z$_]*/}),...c]\n},B,L,{beginKeywords:\"import\",end:/$/,contains:[...a],relevance:0\n},...c,...g,...p,_,k,...O,...S,A,C]}},grmr_ruby:e=>{\nconst n=e.regex,t=\"([a-zA-Z_]\\\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?)\",a=n.either(/\\b([A-Z]+[a-z0-9]+)+/,/\\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\\w+)*/),s={\n\"variable.constant\":[\"__FILE__\",\"__LINE__\",\"__ENCODING__\"],\n\"variable.language\":[\"self\",\"super\"],\nkeyword:[\"alias\",\"and\",\"begin\",\"BEGIN\",\"break\",\"case\",\"class\",\"defined\",\"do\",\"else\",\"elsif\",\"end\",\"END\",\"ensure\",\"for\",\"if\",\"in\",\"module\",\"next\",\"not\",\"or\",\"redo\",\"require\",\"rescue\",\"retry\",\"return\",\"then\",\"undef\",\"unless\",\"until\",\"when\",\"while\",\"yield\",\"include\",\"extend\",\"prepend\",\"public\",\"private\",\"protected\",\"raise\",\"throw\"],\nbuilt_in:[\"proc\",\"lambda\",\"attr_accessor\",\"attr_reader\",\"attr_writer\",\"define_method\",\"private_constant\",\"module_function\"],\nliteral:[\"true\",\"false\",\"nil\"]},r={className:\"doctag\",begin:\"@[A-Za-z]+\"},o={\nbegin:\"#<\",end:\">\"},l=[e.COMMENT(\"#\",\"$\",{contains:[r]\n}),e.COMMENT(\"^=begin\",\"^=end\",{contains:[r],relevance:10\n}),e.COMMENT(\"^__END__\",e.MATCH_NOTHING_RE)],c={className:\"subst\",begin:/#\\{/,\nend:/\\}/,keywords:s},d={className:\"string\",contains:[e.BACKSLASH_ESCAPE,c],\nvariants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/`/,end:/`/},{\nbegin:/%[qQwWx]?\\(/,end:/\\)/},{begin:/%[qQwWx]?\\[/,end:/\\]/},{\nbegin:/%[qQwWx]?\\{/,end:/\\}/},{begin:/%[qQwWx]?</,end:/>/},{begin:/%[qQwWx]?\\//,\nend:/\\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{\nbegin:/%[qQwWx]?\\|/,end:/\\|/},{begin:/\\B\\?(\\\\\\d{1,3})/},{\nbegin:/\\B\\?(\\\\x[A-Fa-f0-9]{1,2})/},{begin:/\\B\\?(\\\\u\\{?[A-Fa-f0-9]{1,6}\\}?)/},{\nbegin:/\\B\\?(\\\\M-\\\\C-|\\\\M-\\\\c|\\\\c\\\\M-|\\\\M-|\\\\C-\\\\M-)[\\x20-\\x7e]/},{\nbegin:/\\B\\?\\\\(c|C-)[\\x20-\\x7e]/},{begin:/\\B\\?\\\\?\\S/},{\nbegin:n.concat(/<<[-~]?'?/,n.lookahead(/(\\w+)(?=\\W)[^\\n]*\\n(?:[^\\n]*\\n)*?\\s*\\1\\b/)),\ncontains:[e.END_SAME_AS_BEGIN({begin:/(\\w+)/,end:/(\\w+)/,\ncontains:[e.BACKSLASH_ESCAPE,c]})]}]},g=\"[0-9](_?[0-9])*\",u={className:\"number\",\nrelevance:0,variants:[{\nbegin:`\\\\b([1-9](_?[0-9])*|0)(\\\\.(${g}))?([eE][+-]?(${g})|r)?i?\\\\b`},{\nbegin:\"\\\\b0[dD][0-9](_?[0-9])*r?i?\\\\b\"},{begin:\"\\\\b0[bB][0-1](_?[0-1])*r?i?\\\\b\"\n},{begin:\"\\\\b0[oO][0-7](_?[0-7])*r?i?\\\\b\"},{\nbegin:\"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\\\b\"},{\nbegin:\"\\\\b0(_?[0-7])+r?i?\\\\b\"}]},b={variants:[{match:/\\(\\)/},{\nclassName:\"params\",begin:/\\(/,end:/(?=\\))/,excludeBegin:!0,endsParent:!0,\nkeywords:s}]},m=[d,{variants:[{match:[/class\\s+/,i,/\\s+<\\s+/,i]},{\nmatch:[/\\b(class|module)\\s+/,i]}],scope:{2:\"title.class\",\n4:\"title.class.inherited\"},keywords:s},{match:[/(include|extend)\\s+/,i],scope:{\n2:\"title.class\"},keywords:s},{relevance:0,match:[i,/\\.new[. (]/],scope:{\n1:\"title.class\"}},{relevance:0,match:/\\b[A-Z][A-Z_0-9]+\\b/,\nclassName:\"variable.constant\"},{relevance:0,match:a,scope:\"title.class\"},{\nmatch:[/def/,/\\s+/,t],scope:{1:\"keyword\",3:\"title.function\"},contains:[b]},{\nbegin:e.IDENT_RE+\"::\"},{className:\"symbol\",\nbegin:e.UNDERSCORE_IDENT_RE+\"(!|\\\\?)?:\",relevance:0},{className:\"symbol\",\nbegin:\":(?!\\\\s)\",contains:[d,{begin:t}],relevance:0},u,{className:\"variable\",\nbegin:\"(\\\\$\\\\W)|((\\\\$|@@?)(\\\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])\"},{\nclassName:\"params\",begin:/\\|/,end:/\\|/,excludeBegin:!0,excludeEnd:!0,\nrelevance:0,keywords:s},{begin:\"(\"+e.RE_STARTERS_RE+\"|unless)\\\\s*\",\nkeywords:\"unless\",contains:[{className:\"regexp\",contains:[e.BACKSLASH_ESCAPE,c],\nillegal:/\\n/,variants:[{begin:\"/\",end:\"/[a-z]*\"},{begin:/%r\\{/,end:/\\}[a-z]*/},{\nbegin:\"%r\\\\(\",end:\"\\\\)[a-z]*\"},{begin:\"%r!\",end:\"![a-z]*\"},{begin:\"%r\\\\[\",\nend:\"\\\\][a-z]*\"}]}].concat(o,l),relevance:0}].concat(o,l)\n;c.contains=m,b.contains=m;const p=[{begin:/^\\s*=>/,starts:{end:\"$\",contains:m}\n},{className:\"meta.prompt\",\nbegin:\"^([>?]>|[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+[>*]|(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d+(p\\\\d+)?[^\\\\d][^>]+>)(?=[ ])\",\nstarts:{end:\"$\",keywords:s,contains:m}}];return l.unshift(o),{name:\"Ruby\",\naliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],keywords:s,illegal:/\\/\\*/,\ncontains:[e.SHEBANG({binary:\"ruby\"})].concat(p).concat(l).concat(m)}},\ngrmr_yaml:e=>{\nconst n=\"true false yes no null\",t=\"[\\\\w#;/?:@&=+$,.~*'()[\\\\]]+\",a={\nclassName:\"string\",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/\n},{begin:/\\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:\"template-variable\",\nvariants:[{begin:/\\{\\{/,end:/\\}\\}/},{begin:/%\\{/,end:/\\}/}]}]},i=e.inherit(a,{\nvariants:[{begin:/'/,end:/'/},{begin:/\"/,end:/\"/},{begin:/[^\\s,{}[\\]]+/}]}),s={\nend:\",\",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},r={begin:/\\{/,\nend:/\\}/,contains:[s],illegal:\"\\\\n\",relevance:0},o={begin:\"\\\\[\",end:\"\\\\]\",\ncontains:[s],illegal:\"\\\\n\",relevance:0},l=[{className:\"attr\",variants:[{\nbegin:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{begin:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{\nbegin:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{className:\"meta\",begin:\"^---\\\\s*$\",\nrelevance:10},{className:\"string\",\nbegin:\"[\\\\|>]([1-9]?[+-])?[ ]*\\\\n( +)[^ ][^\\\\n]*\\\\n(\\\\2[^\\\\n]+\\\\n?)*\"},{\nbegin:\"<%[%=-]?\",end:\"[%-]?%>\",subLanguage:\"ruby\",excludeBegin:!0,excludeEnd:!0,\nrelevance:0},{className:\"type\",begin:\"!\\\\w+!\"+t},{className:\"type\",\nbegin:\"!<\"+t+\">\"},{className:\"type\",begin:\"!\"+t},{className:\"type\",begin:\"!!\"+t\n},{className:\"meta\",begin:\"&\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"meta\",\nbegin:\"\\\\*\"+e.UNDERSCORE_IDENT_RE+\"$\"},{className:\"bullet\",begin:\"-(?=[ ]|$)\",\nrelevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{\nclassName:\"number\",\nbegin:\"\\\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\\\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\\\.[0-9]*)?([ \\\\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\\\b\"\n},{className:\"number\",begin:e.C_NUMBER_RE+\"\\\\b\",relevance:0},r,o,a],c=[...l]\n;return c.pop(),c.push(i),s.contains=c,{name:\"YAML\",case_insensitive:!0,\naliases:[\"yml\"],contains:l}}});const je=ae;for(const e of Object.keys(Ue)){\nconst n=e.replace(\"grmr_\",\"\").replace(\"_\",\"-\");je.registerLanguage(n,Ue[e])}\nreturn je}()\n;\"object\"==typeof exports&&\"undefined\"!=typeof module&&(module.exports=hljs);\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/readme.md",
    "content": "# Dart documentation generator\n\nThis directory includes static sources used by the Dart documentation generator\nthrough the `dart doc` command.\n\nTo learn more about generating and viewing the generated documentation,\ncheck out the [`dart doc` documentation][].\n\n[`dart doc` documentation]: https://dart.dev/tools/dart-doc\n\n## Third-party resources\n\n## highlight.js\n\nGenerated from https://highlightjs.org/download/ on 2021-07-13.\n\n**License:** https://github.com/highlightjs/highlight.js/blob/main/LICENSE\n\n**Included languages:**\n\n* bash\n* c  \n* css\n* dart\n* diff\n* html, xml\n* java\n* javascript\n* json\n* kotlin\n* markdown\n* objective-c\n* plaintext  \n* shell\n* swift\n* yaml\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/script.js",
    "content": "/*\n *\n *  Update script.js versions in all lib/templates when modifying this file!\n *\n */\nfunction initSideNav() {\n  const leftNavToggle = document.getElementById('sidenav-left-toggle');\n  const leftDrawer = document.querySelector('.sidebar-offcanvas-left');\n  const overlay = document.getElementById('overlay-under-drawer');\n\n  function toggleBoth() {\n    if (leftDrawer) {\n      leftDrawer.classList.toggle('active');\n    }\n\n    if (overlay) {\n      overlay.classList.toggle('active');\n    }\n  }\n\n  if (overlay) {\n    overlay.addEventListener('click', toggleBoth);\n  }\n\n  if (leftNavToggle) {\n    leftNavToggle.addEventListener('click', toggleBoth);\n  }\n}\n\nfunction saveLeftScroll() {\n  const leftSidebar = document.getElementById('dartdoc-sidebar-left');\n  sessionStorage.setItem('dartdoc-sidebar-left-scrollt' + window.location.pathname, leftSidebar.scrollTop.toString());\n  sessionStorage.setItem('dartdoc-sidebar-left-scrolll' + window.location.pathname, leftSidebar.scrollLeft.toString());\n}\n\nfunction saveMainContentScroll() {\n  const mainContent = document.getElementById('dartdoc-main-content');\n  sessionStorage.setItem('dartdoc-main-content-scrollt' + window.location.pathname, mainContent.scrollTop.toString());\n  sessionStorage.setItem('dartdoc-main-content-scrolll' + window.location.pathname, mainContent.scrollLeft.toString());\n}\n\nfunction saveRightScroll() {\n  const rightSidebar = document.getElementById('dartdoc-sidebar-right');\n  sessionStorage.setItem('dartdoc-sidebar-right-scrollt' + window.location.pathname, rightSidebar.scrollTop.toString());\n  sessionStorage.setItem('dartdoc-sidebar-right-scrolll' + window.location.pathname, rightSidebar.scrollLeft.toString());\n}\n\nfunction restoreScrolls() {\n  const leftSidebar = document.getElementById('dartdoc-sidebar-left');\n  const mainContent = document.getElementById('dartdoc-main-content');\n  const rightSidebar = document.getElementById('dartdoc-sidebar-right');\n\n  try {\n    const leftSidebarX = sessionStorage.getItem('dartdoc-sidebar-left-scrolll' + window.location.pathname);\n    const leftSidebarY = sessionStorage.getItem('dartdoc-sidebar-left-scrollt' + window.location.pathname);\n\n    const mainContentX = sessionStorage.getItem('dartdoc-main-content-scrolll' + window.location.pathname);\n    const mainContentY = sessionStorage.getItem('dartdoc-main-content-scrollt' + window.location.pathname);\n\n    const rightSidebarX = sessionStorage.getItem('dartdoc-sidebar-right-scrolll' + window.location.pathname);\n    const rightSidebarY = sessionStorage.getItem('dartdoc-sidebar-right-scrollt' + window.location.pathname);\n\n    leftSidebar.scrollTo(parseFloat(leftSidebarX), parseFloat(leftSidebarY));\n    mainContent.scrollTo(parseFloat(mainContentX), parseFloat(mainContentY));\n    rightSidebar.scrollTo(parseFloat(rightSidebarX), parseFloat(rightSidebarY));\n  } finally {\n    // Set visibility to visible after scroll to prevent the brief appearance of the\n    // panel in the wrong position.\n    leftSidebar.style.visibility = 'visible';\n    mainContent.style.visibility = 'visible';\n    rightSidebar.style.visibility = 'visible';\n  }\n}\n\nfunction initScrollSave() {\n  const leftSidebar = document.getElementById('dartdoc-sidebar-left');\n  const mainContent = document.getElementById('dartdoc-main-content');\n  const rightSidebar = document.getElementById('dartdoc-sidebar-right');\n\n  leftSidebar.addEventListener(\"scroll\", saveLeftScroll, true);\n  mainContent.addEventListener(\"scroll\", saveMainContentScroll, true);\n  rightSidebar.addEventListener(\"scroll\", saveRightScroll, true);\n}\n\nconst weights = {\n  'library' : 2,\n  'class' : 2,\n  'mixin' : 3,\n  'extension' : 3,\n  'typedef' : 3,\n  'method' : 4,\n  'accessor' : 4,\n  'operator' : 4,\n  'constant' : 4,\n  'property' : 4,\n  'constructor' : 4\n};\n\nfunction findMatches(index, query) {\n  if (query === '') {\n    return [];\n  }\n\n  const allMatches = [];\n\n  index.forEach(element => {\n    function score(value) {\n      value -= element.overriddenDepth * 10;\n      const weightFactor = weights[element.type] || 4;\n      allMatches.push({element: element, score: (value / weightFactor) >> 0});\n    }\n\n    const name = element.name;\n    const qualifiedName = element.qualifiedName;\n    const lowerName = name.toLowerCase();\n    const lowerQualifiedName = qualifiedName.toLowerCase();\n    const lowerQuery = query.toLowerCase();\n\n    if (name === query || qualifiedName === query || name === `dart:${query}`) {\n      score(2000);\n    } else if (lowerName === `dart:${lowerQuery}`) {\n      score(1800);\n    } else if (lowerName === lowerQuery || lowerQualifiedName === lowerQuery) {\n      score(1700);\n    } else if (query.length > 1) {\n      if (name.startsWith(query) || qualifiedName.startsWith(query)) {\n        score(750);\n      } else if (lowerName.startsWith(lowerQuery) || lowerQualifiedName.startsWith(lowerQuery)) {\n        score(650);\n      } else if (name.includes(query) || qualifiedName.includes(query)) {\n        score(500);\n      } else if (lowerName.includes(lowerQuery) || lowerQualifiedName.includes(query)) {\n        score(400);\n      }\n    }\n  });\n\n  allMatches.sort((a, b) => {\n    const x = b.score - a.score;\n    if (x === 0) {\n      return a.element.name.length - b.element.name.length;\n    }\n    return x;\n  });\n\n  const justElements = [];\n\n  for (let i = 0; i < allMatches.length; i++) {\n    justElements.push(allMatches[i].element);\n  }\n\n  return justElements;\n}\n\nlet baseHref = '';\n\nconst minLength = 1;\nconst suggestionLimit = 10;\n\nfunction initializeSearch(input, index) {\n  input.disabled = false;\n  input.setAttribute('placeholder', 'Search API Docs');\n\n  // Handle grabbing focus when the users types / outside of the input\n  document.addEventListener('keypress', (event) => {\n    if (event.code === 'Slash' && !(document.activeElement instanceof HTMLInputElement)) {\n      event.preventDefault();\n      input.focus();\n    }\n  });\n\n  // Prepare elements\n\n  const parentForm = input.parentNode;\n  const wrapper = document.createElement('div');\n  wrapper.classList.add('tt-wrapper');\n\n  parentForm.replaceChild(wrapper, input);\n\n  const inputHint = document.createElement('input');\n  inputHint.setAttribute('type', 'text');\n  inputHint.setAttribute('autocomplete', 'off');\n  inputHint.setAttribute('readonly', 'true');\n  inputHint.setAttribute('spellcheck', 'false');\n  inputHint.setAttribute('tabindex', '-1');\n  inputHint.classList.add('typeahead', 'tt-hint');\n\n  wrapper.appendChild(inputHint);\n\n  input.setAttribute('autocomplete', 'off');\n  input.setAttribute('spellcheck', 'false');\n  input.classList.add('tt-input');\n\n  wrapper.appendChild(input);\n\n  const listBox = document.createElement('div');\n  listBox.setAttribute('role', 'listbox');\n  listBox.setAttribute('aria-expanded', 'false');\n  listBox.style.display = 'none';\n  listBox.classList.add('tt-menu');\n\n  const presentation = document.createElement('div');\n  presentation.classList.add('tt-elements');\n\n  listBox.appendChild(presentation);\n\n  wrapper.appendChild(listBox);\n\n  // Set up various search functionality\n\n  function highlight(text, query) {\n    query = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    return text.replace(new RegExp(query, 'gi'), (matched) => {\n      return `<strong class='tt-highlight'>${matched}</strong>`;\n    });\n  }\n\n  function createSuggestion(query, match) {\n    const suggestion = document.createElement('div');\n    suggestion.setAttribute('data-href', match.href);\n    suggestion.classList.add('tt-suggestion');\n\n    const suggestionTitle = document.createElement('span');\n    suggestionTitle.classList.add('tt-suggestion-title');\n    suggestionTitle.innerHTML = highlight(`${match.name} ${match.type.toLowerCase()}`, query);\n\n    suggestion.appendChild(suggestionTitle);\n\n    if (match.enclosedBy) {\n      const fromLib = document.createElement('div');\n      fromLib.classList.add('search-from-lib');\n      fromLib.innerHTML = `from ${highlight(match.enclosedBy.name, query)}`;\n\n      suggestion.appendChild(fromLib);\n    }\n\n    suggestion.addEventListener('mousedown', event => {\n      event.preventDefault();\n    });\n\n    suggestion.addEventListener('click', event => {\n      if (match.href) {\n        window.location = baseHref + match.href;\n        event.preventDefault();\n      }\n    });\n\n    return suggestion;\n  }\n\n  let storedValue = null;\n  let actualValue = '';\n  let hint = null;\n\n  let suggestionElements = [];\n  let suggestionsInfo = [];\n  let selectedElement = null;\n\n  function setHint(value) {\n    hint = value;\n    inputHint.value = value || '';\n  }\n\n  function updateSuggestions(query, suggestions) {\n    suggestionsInfo = [];\n    suggestionElements = [];\n    presentation.textContent = '';\n\n    if (suggestions.length < minLength) {\n      setHint(null)\n      hideSuggestions();\n      return;\n    }\n\n    for (let i = 0; i < suggestions.length; i++) {\n      const element = createSuggestion(query, suggestions[i]);\n      suggestionElements.push(element);\n      presentation.appendChild(element);\n    }\n\n    suggestionsInfo = suggestions;\n\n    setHint(query + suggestions[0].name.slice(query.length));\n    selectedElement = null;\n\n    showSuggestions();\n  }\n\n  function handle(newValue, forceUpdate) {\n    if (actualValue === newValue && !forceUpdate) {\n      return;\n    }\n\n    if (newValue === null || newValue.length === 0) {\n      updateSuggestions('', []);\n      return;\n    }\n\n    const suggestions = findMatches(index, newValue).slice(0, suggestionLimit);\n    actualValue = newValue;\n\n    updateSuggestions(newValue, suggestions);\n  }\n\n  function showSuggestions() {\n    if (presentation.hasChildNodes()) {\n      listBox.style.display = 'block';\n      listBox.setAttribute('aria-expanded', 'true');\n    }\n  }\n\n  function hideSuggestions() {\n    listBox.style.display = 'none';\n    listBox.setAttribute('aria-expanded', 'false');\n  }\n\n  // Hook up events\n\n  input.addEventListener('focus', () => {\n    handle(input.value, true);\n  });\n\n  input.addEventListener('blur', () => {\n    selectedElement = null;\n    if (storedValue !== null) {\n      input.value = storedValue;\n      storedValue = null;\n    }\n    hideSuggestions();\n    setHint(null);\n  });\n\n  input.addEventListener('input', event => {\n    handle(event.target.value);\n  });\n\n  input.addEventListener('keydown', event => {\n    if (suggestionElements.length === 0) {\n      return;\n    }\n\n    if (event.code === 'Enter') {\n      const selectingElement = selectedElement || 0;\n      const href = suggestionElements[selectingElement].dataset.href;\n      if (href) {\n        window.location = baseHref + href;\n      }\n      return;\n    }\n\n    if (event.code === 'Tab') {\n      if (selectedElement === null) {\n        // The user wants to fill the field with the hint\n        if (hint !== null) {\n          input.value = hint;\n          handle(hint);\n          event.preventDefault();\n        }\n      } else {\n        // The user wants to fill the input field with their currently selected suggestion\n        handle(suggestionsInfo[selectedElement].name);\n        storedValue = null;\n        selectedElement = null;\n        event.preventDefault();\n      }\n      return;\n    }\n\n    const lastIndex = suggestionElements.length - 1;\n    const previousSelectedElement = selectedElement;\n\n    if (event.code === 'ArrowUp') {\n      if (selectedElement === null) {\n        selectedElement = lastIndex;\n      } else if (selectedElement === 0) {\n        selectedElement = null;\n      } else {\n        selectedElement--;\n      }\n    } else if (event.code === 'ArrowDown') {\n      if (selectedElement === null) {\n        selectedElement = 0;\n      } else if (selectedElement === lastIndex) {\n        selectedElement = null;\n      } else {\n        selectedElement++;\n      }\n    } else {\n      if (storedValue !== null) {\n        storedValue = null;\n        handle(input.value);\n      }\n      return;\n    }\n\n    if (previousSelectedElement !== null) {\n      suggestionElements[previousSelectedElement].classList.remove('tt-cursor');\n    }\n\n    if (selectedElement !== null) {\n      const selected = suggestionElements[selectedElement];\n      selected.classList.add('tt-cursor');\n\n      // Guarantee the selected element is visible\n      if (selectedElement === 0) {\n        listBox.scrollTop = 0;\n      } else if (selectedElement === lastIndex) {\n        listBox.scrollTop = listBox.scrollHeight;\n      } else {\n        const offsetTop = selected.offsetTop;\n        const parentOffsetHeight = listBox.offsetHeight;\n        if (offsetTop < parentOffsetHeight || parentOffsetHeight < (offsetTop + selected.offsetHeight)) {\n          selected.scrollIntoView({behavior: 'auto', block: 'nearest'});\n        }\n      }\n\n      if (storedValue === null) {\n        // Store the actual input value to display their currently selected item\n        storedValue = input.value;\n      }\n      input.value = suggestionsInfo[selectedElement].name;\n      setHint('');\n    } else if (storedValue !== null && previousSelectedElement !== null) {\n      // They are moving back to the input field, so return the stored value\n      input.value = storedValue;\n      setHint(storedValue + suggestionsInfo[0].name.slice(storedValue.length));\n      storedValue = null;\n    }\n\n    event.preventDefault();\n  });\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  // Place this first so that unexpected exceptions in other JavaScript do not block page visibility.\n  restoreScrolls();\n  hljs.highlightAll();\n  initSideNav();\n  initScrollSave();\n\n  const searchBox = document.getElementById('search-box');\n  const searchBody = document.getElementById('search-body');\n  const searchSidebar = document.getElementById('search-sidebar');\n\n  if (document.body.getAttribute('data-using-base-href') === 'false') {\n    // If dartdoc did not add a base-href tag, we will need to add the relative\n    // path ourselves.\n    baseHref = document.body.getAttribute('data-base-href');\n  }\n\n  function disableSearch() {\n    console.log('Could not activate search functionality.');\n    if (searchBox) {\n      searchBox.placeholder = 'Failed to initialize search';\n    }\n\n    if (searchBody) {\n      searchBody.placeholder = 'Failed to initialize search';\n    }\n\n    if (searchSidebar) {\n      searchSidebar.placeholder = 'Failed to initialize search';\n    }\n  }\n\n  if ('fetch' in window) {\n    fetch(baseHref + 'index.json', {method: 'GET'})\n        .then(response => response.json())\n        .then(index => {\n          // Handle if the user specified a `search` parameter in the URL\n          if ('URLSearchParams' in window) {\n            const search = new URLSearchParams(window.location.search).get('search');\n            if (search) {\n              const matches = findMatches(search);\n              if (matches.length !== 0) {\n                window.location = baseHref + matches[0].href;\n                return;\n              }\n            }\n          }\n\n          // Initialize all three search fields\n          if (searchBox) {\n            initializeSearch(searchBox, index);\n          }\n\n          if (searchBody) {\n            initializeSearch(searchBody, index);\n          }\n\n          if (searchSidebar) {\n            initializeSearch(searchSidebar, index);\n          }\n        })\n        .catch(() => {\n          disableSearch();\n        });\n  } else {\n    disableSearch();\n  }\n});\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/styles.css",
    "content": ".light-theme {\n  /*background-color body, listdropdown*/\n  --main-bg-color: #fff;\n  /*header id-tittle*/\n  --main-header-color: #eeeeee;\n  /*package-name*/\n  --main-sidebar-color: #727272;\n  /*section-title and section subtitle, desc markdown(body, dd, h3), header a*/\n  --main-text-color: #111111;\n  /*typehead search-box*/\n  --main-search-bar: #fff;\n  /* scrollbar-thumb */\n  --main-scrollbar-color: #CCC;\n  /* footer */\n  --main-footer-background: #111111;\n  /*header text color*/\n  --main-h-text: black;\n  /* hyperlinks*/\n  --main-hyperlinks-color: #0175C2;\n  /*search background*/\n  --main-search-background: transparent;\n\n  /*code snippets*/\n  --main-code-bg: #f8f8f8;\n  --main-keyword-color: #333;\n  --main-tag-color: #000080;\n  --main-section-color: #900;\n  --main-comment-color: #998;\n  --main-var-color: #008080;\n  --main-string-color: #d14;\n\n  --main-number-filter: invert(0%);\n  --main-icon-color: black;\n\n  /* alerts */\n  --alert-info: #e7f8ff;\n  --alert-tip: #ecfaf7;\n  --alert-important: #e2dbff;\n  --alert-warning: #fcf8e3;\n  --alert-error: #fde9ee;\n}\n\n.dark-theme {\n  /*background-color body, listdropdown*/\n  --main-bg-color: #10161E;\n  /*header id-tittle*/\n  --main-header-color: #1C2834;\n  /*package-name*/\n  --main-sidebar-color: #fff;\n  /*section-title and section subtitle, desc markdown(body, dd, h3), header a*/\n  --main-text-color: #fff;\n  /*typehead search-box*/\n  --main-search-bar: #454545;\n  /* scrollbar-thumb */\n  --main-scrollbar-color: #5f6368;\n  /* footer */\n  --main-footer-background: #27323a;\n  /* hyperlinks*/\n  --main-hyperlinks-color: #00D2FA;\n  /*search background*/\n  --main-search-background: black;\n\n  /*code snippets*/\n  --main-code-bg: #10161E;\n  --main-keyword-color: white;\n  --main-tag-color: #00D2FA;\n  --main-section-color: #FF2D64;\n  --main-comment-color: #909CC3;\n  --main-var-color: #55A09B;\n  --main-string-color: #FF2D64;\n\n  --main-number-filter: invert(100%);\n  --main-icon-color: white;\n\n  /* alerts */\n  --alert-info: #043875;\n  --alert-tip: #065517;\n  --alert-important: #4a00b4;\n  --alert-warning: #7b6909;\n  --alert-error: #7a0c17;\n}\n\n#theme {\n  display: none;\n}\n\n#theme-button {\n  position: absolute;\n  right: 30px;\n  height: 24px;\n}\n\n#theme-button .material-symbols-outlined {\n  color: var(--main-icon-color);\n  user-select: none;\n  cursor: pointer;\n}\n\n#theme-button .material-symbols-outlined:hover {\n  color: var(--main-hyperlinks-color);\n}\n\nli .material-symbols-outlined, dt .material-symbols-outlined {\n  font-size: 1em;\n  vertical-align: text-bottom;\n}\n\ndt .material-symbols-outlined {\n  text-indent: 0;\n}\n\n.light-theme #light-theme-button {\n  display: none;\n}\n\n.dark-theme #dark-theme-button {\n  display: none;\n}\n\n/*\nOnly show images that fit their theme using GitHub's syntax, see:\nhttps://github.blog/changelog/2021-11-24-specify-theme-context-for-images-in-markdown/\n*/\n.dark-theme img[src$=\"#gh-light-mode-only\"] {\n  display: none;\n}\n\n.light-theme img[src$=\"#gh-dark-mode-only\"] {\n  display: none;\n}\n\n/* for layout */\nhtml,\nbody {\n  margin: 0;\n  padding: 0;\n  height: 100%;\n  width: 100%;\n  overflow: hidden;\n  box-sizing: border-box;\n}\n\n*, *:before, *:after {\n  box-sizing: inherit;\n}\n\nbody {\n  display: flex;\n  flex-direction: column;\n  -webkit-overflow-scrolling: touch;\n}\n\nheader {\n  flex: 0 0 50px;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding-left: 30px;\n  padding-right: 30px;\n  background-color: var(--main-header-color);\n}\n\nheader ol {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\nheader ol li {\n  display: inline;\n}\n\nheader form {\n  display: flex;\n  flex: 1;\n  justify-content: flex-end;\n}\n\nheader#header-search-sidebar {\n  height: 50px;\n  margin-bottom: 25px;\n}\n\nfooter {\n  flex: 0 0 16px;\n  text-align: center;\n  padding: 16px 20px;\n}\n\nmain {\n  flex: 1;\n  display: flex;\n  flex-direction: row;\n  min-height: 0;\n}\n\n.sidebar-offcanvas-left {\n  flex: 0 1 230px;\n  order: 1;\n  overflow-y: scroll;\n  padding: 20px 0 15px 30px;\n  margin: 5px 20px 0 0;\n}\n\n::-webkit-scrollbar-button{ display: none; height: 13px; border-radius: 0; background-color: #AAA; }\n::-webkit-scrollbar-button:hover{ background-color: #AAA; }\n::-webkit-scrollbar-thumb{ background-color: var(--main-scrollbar-color); }\n::-webkit-scrollbar-thumb:hover{ background-color: var(--main-scrollbar-color); }\n::-webkit-scrollbar{ width: 4px; }\n\n.main-content::-webkit-scrollbar{ width: 8px; }\n\n.main-content {\n  flex: 1;\n  order: 2;\n  overflow-y: scroll;\n  padding: 10px 20px 0 20px;\n}\n\n.sidebar-offcanvas-right {\n  flex: 0 1 12em;\n  order: 3;\n  overflow-y: scroll;\n  padding: 20px 15px 15px 15px;\n  margin-top: 5px;\n  margin-right: 20px;\n}\n/* end for layout */\n\nbody {\n  -webkit-text-size-adjust: 100%;\n  overflow-x: hidden;\n  font-family: Roboto, sans-serif;\n  font-size: 16px;\n  line-height: 1.42857143;\n  color: var(--main-text-color);\n  background-color: var(--main-bg-color);\n}\n\nnav.navbar {\n  background-color: inherit;\n  min-height: 50px;\n  border: 0;\n}\n\n@media (max-width: 840px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 841px) {\n  .hidden-l {\n    display: none !important;\n  }\n}\n\nnav.navbar .row {\n  padding-top: 8px;\n}\n\nnav .container {\n  white-space: nowrap;\n}\n\nheader {\n  background-color: var(--main-header-color);\n  box-shadow: 0 3px 5px rgba(0,0,0,0.1);\n}\n\n.pre {\n    border: 1px solid #ddd;\n    font-size: 14px;\n}\n\n.hljs-string, .hljs-doctag {\n    color: var(--main-string-color);\n}\n\n.hljs-number, .hljs-literal, .hljs-variable, .hljs-template-variable, .hljs-tag .hljs-attr {\n    color: var(--main-var-color);\n}\n\n.hljs-comment, .hljs-quote {\n    color: var(--main-comment-color);\n    font-style: italic;\n}\n\n.hljs-title, .hljs-section, .hljs-selector-id {\n    color: var(--main-section-color);\n    font-weight: bold;\n}\n\n.hljs-tag, .hljs-name, .hljs-attribute {\n    color: var(--main-tag-color);\n    font-weight: normal;\n}\n\n.hljs-keyword, .hljs-selector-tag, .hljs-subst {\n    color: var(--main-keyword-color);\n    font-weight: bold;\n}\n\n.hljs {\n    display: block;\n    overflow-x: auto;\n    padding: 0.5em;\n    color: var(--main-text-color);\n    background: var(--main-code-bg);\n}\n\na {\n  text-decoration: none;\n}\n\nsection {\n  margin-bottom: 36px;\n}\n\ndl {\n  margin: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-family: Roboto, sans-serif;\n  font-weight: 400;\n  margin-top: 1.5em;\n  color: var(--main-text-color);\n}\n\nh1.title {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\nh1 {\n  font-size: 37px;\n  margin-top: 0;\n  margin-bottom: 0.67em;\n}\n\nh2 {\n  font-size: 28px;\n}\n\nh5 {\n  font-size: 16px;\n}\n\np {\n  margin-bottom: 1em;\n  margin-top: 0;\n}\n\na {\n  color: var(--main-hyperlinks-color);\n}\n\na:hover {\n  color: #13B9FD;\n}\n\npre.prettyprint {\n  font-family: 'Roboto Mono', Menlo, monospace;\n  color: black;\n  border-radius: 0;\n  font-size: 15px;\n  word-wrap: normal;\n  line-height: 1.4;\n  border: 0;\n  margin: 16px 0 16px 0;\n  padding: 8px;\n}\n\npre code {\n  white-space: pre;\n  word-wrap: initial;\n  font-size: 100%\n}\n\n.fixed {\n  white-space: pre;\n}\n\npre {\n  border: 1px solid #ddd;\n  background-color: #eee;\n  font-size: 14px;\n}\n\ncode {\n  font-family: 'Roboto Mono', Menlo, monospace;\n  color: inherit;\n  padding: 0.2em 0.4em;\n  font-size: 85%;\n  background-color: rgba(27,31,35,0.05);\n  border-radius: 3px;\n}\n\n@media(max-width: 840px) {\n  nav .container {\n    width: 100%\n  }\n\n  h1 {\n    font-size: 24px;\n  }\n\n  pre {\n    margin: 16px 0;\n  }\n}\n\nheader h1 {\n  font-weight: 400;\n  margin-bottom: 16px;\n}\n\nheader a,\nheader p,\nheader li {\n  color: #0175C2;\n}\n\nheader a:hover {\n  color: #0175C2;\n}\n\nheader h1 .kind {\n  color: #555;\n}\n\ndt {\n  font-weight: normal;\n}\n\ndd {\n  color: var(--main-text-color);\n  margin-bottom: 1em;\n  margin-left: 0;\n}\n\ndd.callable, dd.constant, dd.property {\n  margin-bottom: 24px;\n}\n\ndd p {\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n  margin-bottom: 0;\n}\n\n/* Enum values do not have their own pages; their full docs are presented on the\n * enum class's page. */\ndt.constant + dd p {\n  margin-bottom: 1em;\n}\n\n/* indents wrapped lines */\nsection.summary dt {\n  margin-left: 24px;\n  text-indent: -24px;\n}\n\n.dl-horizontal dd {\n  margin-left: initial;\n}\n\ndl.dl-horizontal dt {\n  font-style: normal;\n  text-align: left;\n  color: #727272;\n  margin-right: 20px;\n  width: initial;\n}\n\ndt .name {\n  font-weight: 500;\n}\n\ndl dt.callable .name {\n  float: none;\n  width: auto;\n}\n\n.type-parameter {\n  white-space: nowrap;\n}\n\n.multi-line-signature .type-parameter .parameter {\n  margin-left: 0;\n  display: unset;\n}\n\n.parameter-list {\n  display: table-cell;\n  margin-left: 10px;\n  list-style-type: none;\n  padding-inline-start: unset;\n}\n\n.parameter-list.single-line {\n  display: inline;\n  margin-left: 0;\n}\n\n.parameter-list.single-line > li {\n  display: inline;\n}\n\n.parameter-list.single-line > li > .parameter {\n  display: inline;\n  margin-left: 0;\n  text-indent: 0;\n}\n\n.signature {\n  color: var(--main-text-color);\n}\n\n.signature a {\n  color: var(--main-hyperlinks-color);\n}\n\n.optional {\n  font-style: italic;\n}\n\n.undocumented {\n  font-style: italic;\n}\n\n.is-const {\n  font-style: italic;\n}\n\n.deprecated {\n  text-decoration: line-through;\n}\n\n.category.linked {\n  font-weight: bold;\n  opacity: 1;\n}\n\n/* Colors for category based on categoryOrder in dartdoc_options.config. */\n.category.cp-0 {\n  background-color: #54b7c4\n}\n\n.category.cp-1 {\n  background-color: #54c47f\n}\n\n.category.cp-2 {\n  background-color: #c4c254\n}\n\n.category.cp-3 {\n  background-color: #c49f54\n}\n\n.category.cp-4 {\n  background-color: #c45465\n}\n\n.category.cp-5 {\n  background-color: #c454c4\n}\n\n.category a {\n  color: white;\n}\n\n.category {\n  padding: 2px 4px;\n  font-size: 12px;\n  border-radius: 4px;\n  background-color: #999;\n  text-transform: uppercase;\n  color: white;\n  opacity: .5;\n}\n\nh1 .category {\n  vertical-align: middle;\n}\n\n/* The badge under a declaration for things like \"const\", \"read-only\", etc. and for the badges inline like sealed or interface */\n/* See https://github.com/dart-lang/dartdoc/blob/main/lib/src/model/feature.dart */\n.feature {\n  display: inline-block;\n  background: var(--main-bg-color);\n  border: 1px solid var(--main-hyperlinks-color);\n  border-radius: 20px;\n  color: var(--main-hyperlinks-color);\n\n  font-size: 12px;\n  padding: 1px 6px;\n  margin: 0 8px 0 0;\n}\n\na.feature:hover {\n  border-color: #13B9FD;\n}\n\nh1 .feature {\n  vertical-align: middle;\n  margin: 0 -2px 0 0;\n}\n\n.source-link {\n  padding: 18px 4px;\n  font-size: 18px;\n  vertical-align: middle;\n}\n\n@media (max-width: 840px) {\n  .source-link {\n    padding: 7px 2px;\n    font-size: 10px;\n  }\n}\n\n#external-links {\n  float: right;\n}\n\n.btn-group {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\nfooter {\n  color: #fff;\n  background-color: var(--main-footer-background);\n  width: 100%;\n}\n\nfooter p {\n  margin: 0;\n}\n\nfooter .no-break {\n  white-space: nowrap;\n}\n\nfooter .container {\n  padding-left: 0;\n  padding-right: 0;\n}\n\nfooter a, footer a:hover {\n  color: #fff;\n}\n\n.markdown.desc {\n  max-width: 700px;\n}\n\n.markdown h1 {\n  font-size: 24px;\n  margin-bottom: 8px;\n}\n\n.markdown h2 {\n  font-size: 20px;\n  margin-top: 24px;\n  margin-bottom: 8px;\n}\n\n.markdown h3 {\n  font-size: 18px;\n  margin-bottom: 8px;\n  color: var(--main-text-color);\n}\n\n.markdown h4 {\n  font-size: 16px;\n  margin-bottom: 0;\n}\n\n.markdown li p {\n  margin: 0;\n}\n\ntable {\n  margin-bottom: 1em;\n}\n\ntable,\nth,\ntd {\n  border: 1px solid lightgrey;\n  border-collapse: collapse;\n}\n\nth,\ntd {\n  padding: 8px;\n}\n\n.gt-separated {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n.gt-separated li {\n  display: inline-block;\n}\n\n.gt-separated li:before {\n  background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><path fill='%23DDDDDD' d='M6.7,4L5.7,4.9L8.8,8l-3.1,3.1L6.7,12l4-4L6.7,4z'/></svg>\");\n  background-position: center;\n  content: \"\\00a0\";\n  margin: 0 6px 0 4px;\n  padding: 0 3px 0 0;\n}\n\n.gt-separated.dark li:before {\n  background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><path fill='%23727272' d='M6.7,4L5.7,4.9L8.8,8l-3.1,3.1L6.7,12l4-4L6.7,4z'/></svg>\");\n}\n\n.gt-separated li:first-child:before {\n  background-image: none;\n  content: \"\";\n  margin: 0;\n  padding: 0;\n}\n\n.multi-line-signature {\n  font-size: 17px;\n  color: #727272;\n}\n\n.multi-line-signature .parameter {\n  margin-left: 60px;\n  display: block;\n  text-indent: -36px;\n}\n\n.breadcrumbs {\n  padding: 0;\n  margin: 8px 0 8px 0;\n  white-space: nowrap;\n  line-height: 1;\n}\n\n@media screen and (min-width: 840px) {\n  nav ol.breadcrumbs {\n    float: left;\n  }\n}\n\n@media screen and (max-width: 840px) {\n  .breadcrumbs {\n    margin: 0 0 24px 0;\n    overflow-x: hidden;\n  }\n}\n\n.breadcrumbs .gt-separated .dark .hidden-xs li+li:before {\n  color: var(--main-h-text);\n}\n\nol.breadcrumbs li a {\n  color: var(--main-hyperlinks-color);\n}\n\n.self-crumb {\n  color: var(--main-h-text);\n}\n\n.self-name {\n  color: #555;\n  display: none;\n}\n\n.annotation-list {\n  list-style: none;\n  padding: 0;\n  display: inline;\n}\n\n.comma-separated {\n  list-style: none;\n  padding: 0;\n  display: inline;\n}\n\n.comma-separated li {\n  display: inline;\n}\n\n.comma-separated li:after {\n  content: \", \";\n}\n\n.comma-separated li:last-child:after {\n  content: \"\";\n}\n\n.end-with-period li:last-child:after {\n  content: \".\";\n}\n\n.container > section:first-child {\n  border: 0;\n}\n\n.constructor-modifier {\n  font-style: italic;\n}\n\nsection.multi-line-signature div.parameters {\n  margin-left: 24px;\n}\n\n/* sidebar styles */\n\n.sidebar ol {\n  list-style: none;\n  line-height: 22px;\n  margin-top: 0;\n  margin-bottom: 0;\n  padding: 0 0 15px 0;\n}\n\n.sidebar h5 a,\n.sidebar h5 a:hover {\n  color: var(--main-sidebar-color);\n}\n\n.sidebar h5,\n.sidebar ol li {\n  text-overflow: ellipsis;\n  overflow: hidden;\n  padding: 3px 0 3px 3px;\n}\n\n.sidebar h5 {\n  color: var(--main-sidebar-color);\n  font-size: 18px;\n  margin: 0 0 22px 0;\n  padding-top: 0;\n}\n\n.sidebar ol li.section-title {\n  font-size: 18px;\n  font-weight: normal;\n  text-transform: uppercase;\n  padding-top: 25px;\n}\n\n.sidebar ol li.section-subtitle a {\n  color: inherit;\n}\n\n.sidebar ol li.section-subtitle {\n  font-weight: 400;\n  text-transform: uppercase;\n}\n\n.sidebar ol li.section-subitem {\n  margin-left: 12px;\n}\n\n.sidebar ol li:first-child {\n  padding-top: 3px;\n  margin-top: 0;\n}\n\nbutton {\n  padding: 0;\n}\n\n#sidenav-left-toggle {\n  display: none;\n  vertical-align: text-bottom;\n  padding: 0;\n  color: var(--main-icon-color);\n  user-select: none;\n  cursor: pointer;\n}\n\n#sidenav-left-toggle:hover {\n  color: var(--main-hyperlinks-color);\n}\n\n/* left-nav disappears, and can transition in from the left */\n@media screen and (max-width:840px) {\n  #sidenav-left-toggle {\n    display: inline;\n    width: 24px;\n    height: 24px;\n    border: none;\n    margin-right: 24px;\n    margin-left: 24px;\n    font-size: 24px;\n  }\n\n  #overlay-under-drawer.active {\n    opacity: 0.4;\n    height: 100%;\n    z-index: 1999;\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: black;\n    display: block;\n  }\n\n  .sidebar-offcanvas-left {\n    left: -100%;\n    position: fixed;\n    -webkit-transition:all .25s ease-out;\n    -o-transition:all .25s ease-out;\n    transition:all .25s ease-out;\n    z-index: 2000;\n    top: 0;\n    width: 280px; /* works all the way down to an iphone 4 */\n    height: 90%;\n    background-color: var(--main-bg-color);\n    overflow-y: scroll; /* TODO: how to hide scroll bars? */\n    padding: 10px;\n    margin: 10px 10px;\n    box-shadow: 5px 5px 5px 5px #444444;\n  }\n\n  ol#sidebar-nav {\n    font-size: 18px;\n    white-space: pre-line;\n  }\n\n  .sidebar-offcanvas-left.active {\n    left: 0; /* this animates our drawer into the page */\n  }\n\n  .self-name {\n    display: inline-block;\n    color: var(--main-hyperlinks-color);\n  }\n}\n\n.sidebar-offcanvas-left h5 {\n  margin-bottom: 10px;\n}\n\n.sidebar-offcanvas-left h5:last-of-type {\n  border: 0;\n  margin-bottom: 25px;\n}\n\n/* the right nav disappears out of view when the window shrinks */\n@media screen and (max-width: 992px) {\n  .sidebar-offcanvas-right {\n     display: none;\n   }\n}\n\n#overlay-under-drawer {\n  display: none;\n}\n\n/* find-as-you-type search box */\n\n.form-control {\n  border-radius: 0;\n  border: 0;\n}\n\n@media screen and (max-width: 840px) {\n  form.search {\n    display: none;\n  }\n}\n\n.typeahead {\n  width: 200px;\n  padding: 2px 7px 1px 7px;\n  line-height: 20px;\n  outline: none;\n}\n\n.tt-wrapper {\n  position: relative;\n  display: inline-block;\n}\n\n.tt-input {\n  position: relative;\n  vertical-align: top;\n}\n\n.navbar-right .tt-menu {\n  right: 0;\n  left: inherit !important;\n  width: 540px;\n  max-height: 280px;\n  overflow-y: scroll;\n}\n\n.navbar-right {\n  padding-right: 60px;\n}\n\n.tt-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 100;\n  font-size: 14px;\n  margin: 0;\n  background-color: var(--main-bg-color);\n  border: 1px solid var(--main-header-color);\n  -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);\n     -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);\n          box-shadow: 0 5px 10px rgba(0,0,0,.2);\n}\n\n\n.typeahead {\n  padding: 17px 17px 17px 50px;\n  width: 422px;\n  height: 20px;\n  font-size: 13px;\n  background-image: url(\"./search.svg\");\n  background-repeat: no-repeat;\n  background-position: 4%;\n  outline: 0;\n  background-size: 20px;\n  filter: var(--main-number-filter);\n    -webkit-filter: var(--main-number-filter);\n}\n\n.search-summary {\n  margin-bottom: 10px;\n}\n\na.tt-container {\n  font-size: 16px;\n  color: var(--main-hyperlinks-color);\n}\n\n.enter-search-message {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  background-color: #AAA;\n  padding: 0;\n  font-size: 14px;\n  margin: 0;\n  clear: both;\n  text-align: center;\n  color: black;\n}\n\n.tt-suggestion:hover {\n  cursor: pointer;\n  color: #fff;\n  background-color: #0097cf;\n}\n\n.tt-suggestion:hover .search-from-lib {\n  color: #ddd;\n}\n\n.tt-suggestion.tt-cursor {\n  color: #fff;\n  background-color: #0097cf;\n}\n\n.tt-suggestion.tt-cursor .search-from-lib {\n  color: #ddd;\n}\n\n.tt-suggestion p {\n  margin: 0;\n}\n\n.tt-container {\n  font-size: 14px;\n  margin-bottom: 0;\n  margin-top: 15px;\n}\n\n.tt-container-text {\n  color: var(--main-text-color);\n}\n\n\n/* Search results formatting for mini results below search bar. */\n\n.tt-search-results .tt-container {\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n\n/* Do not show the container as a section. */\n.tt-search-results .tt-container-text {\n  display: none\n}\n\n/* An inline style. */\n.tt-search-results .tt-suggestion {\n  color: var(--main-text-color);\n  margin-top: 5px;\n  overflow: hidden;\n  padding-left: 10px;\n  padding-right: 10px;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.tt-search-results .tt-suggestion-title {\n  font-size: 14px;\n  padding-right: 5px;\n}\n\n.tt-search-results .tt-suggestion-container {\n  color: var(--main-keyword-color);\n  font-size: 14px;\n  font-style: italic;\n  padding-right: 5px;\n}\n\n.tt-search-results .one-line-description {\n  color: var(--main-keyword-color);\n  display: inline;\n  margin-left: 0;\n}\n\n\n.tt-search-results .one-line-description::before {\n  content: open-quote;\n}\n\n.tt-search-results .one-line-description::after {\n  content: close-quote;\n}\n\n/* Search results formatting for `search.html`. */\n\n/* A block style. */\n#dartdoc-main-content .tt-suggestion {\n  color: var(--main-text-color);\n  margin-top: 5px;\n  margin-bottom: 10px;\n  border-style: solid;\n  border-color: lightgrey;\n  border-width: 0.5px;\n}\n\n#dartdoc-main-content .tt-suggestion-title {\n  display: block;\n  font-weight: 500;\n  margin: 4px 10px 0;\n}\n\n#dartdoc-main-content .one-line-description {\n  display: block;\n  margin: 2px 10px 3px;\n}\n\n/* Do not show a result's container. */\n#dartdoc-main-content .tt-suggestion-container {\n  display: none;\n}\n\n@media screen and (max-width: 840px) {\n .typeahead {\n   padding: 17px 17px 17px 33px;\n   width: 240px;\n   height: 17px;\n   border: 1px solid #f5f5f5;\n   background-position: 3%;\n   margin: 10px 10px 10px 9px;\n }\n\n  header {\n    padding-left: 0;\n  }\n}\n\n@media screen and (max-width: 320px) {\n  #sidenav-left-toggle {\n    margin-right: 10px;\n    margin-left: 20px;\n  }\n\n  .self-name {\n    margin-right: 10px;\n  }\n}\n\n::placeholder {\n  filter: brightness(0.85);\n}\n\n.search-body {\n  border: 1px solid #7f7f7f;\n  max-width: 400px;\n  box-shadow: 3px 3px 5px rgba(0,0,0,0.1);\n}\n\nsection#setter {\n  border-top: 1px solid #ddd;\n  padding-top: 36px;\n}\n\nli.inherited a {\n  opacity: 0.65;\n  font-style: italic;\n}\n\n#instance-methods dt.inherited .name,\n#instance-properties dt.inherited .name,\n#operators dt.inherited .name {\n  font-weight: 400;\n  font-style: italic;\n}\n\n#instance-methods dt.inherited .signature,\n#instance-properties dt.inherited .signature,\n#operators dt.inherited .signature {\n  font-weight: 400;\n}\n\n@media print {\n  .subnav, .sidebar {\n    display: none;\n  }\n\n  a[href]:after {\n   content: \"\" !important;\n  }\n}\n\n/* github alert styles */\n\n.markdown-alert {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  padding: 1.25rem;\n}\n\n.markdown-alert>:last-child {\n  margin-bottom: 0;\n}\n\n.markdown-alert-title {\n  display: flex;\n  align-items: center;\n  gap: 0.4rem;\n  margin-bottom: 0.5rem;\n\n  font-weight: bold;\n  -webkit-font-smoothing: antialiased;\n}\n\n.markdown-alert-title:before {\n  font: 24px / 1 'Material Symbols Outlined';\n}\n\n/* note, tip, important, warning, caution */\n\n.markdown-alert.markdown-alert-note {\n  background-color: var(--alert-info);\n}\n\n.markdown-alert-note .markdown-alert-title:before {\n  content: 'info';\n}\n\n.markdown-alert.markdown-alert-tip {\n  background-color: var(--alert-tip);\n}\n\n.markdown-alert-tip .markdown-alert-title:before {\n  content: 'lightbulb';\n}\n\n.markdown-alert.markdown-alert-important {\n  background-color: var(--alert-important);\n}\n\n.markdown-alert-important .markdown-alert-title:before {\n  content: 'feedback';\n}\n\n.markdown-alert.markdown-alert-warning {\n  background-color: var(--alert-warning);\n}\n\n.markdown-alert-warning .markdown-alert-title:before {\n  content: 'warning';\n}\n\n.markdown-alert.markdown-alert-caution {\n  background-color: var(--alert-error);\n}\n\n.markdown-alert-caution .markdown-alert-title:before {\n  content: 'report';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/example/main.dart",
    "content": "import 'package:logger/logger.dart';\n\nvoid main() {\n  const logger = Logger(\n    nivel: Nivel.info,\n    printer: Printer(inicio: 'Customizado: {', fim: '}'),\n  );\n  logger.error('Este é um erro');\n  logger.warning('Este é um warning');\n  logger.info('Esta é uma info');\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/lib/logger.dart",
    "content": "export 'src/log.dart';\nexport 'src/printer.dart';\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/lib/src/log.dart",
    "content": "import 'printer.dart';\n\n/// Enum com as cores utilizadas para personalizar a fonte de log no terminal.\nenum Cores {\n  verde('\\x1b[32m'),\n  vermelho('\\x1b[31m'),\n  azul('\\x1b[36m');\n\n  const Cores(this.ansi);\n\n  final String ansi;\n}\n\n/// Código ANSI utilizado para resetar a cor da fonte no terminal.\nconst resetarCor = '\\x1b[m';\n\n/// Controla o [Nivel] permitido do log para ser impresso, quanto mais crítico\n/// mais restrito é, e menos níveis são impressos.\n/// Abaixo as opções ordenadas pelo menos crítico:\n///\n/// * [Nivel.info] signica que serão impressos todos os níveis.\n/// * [Nivel.warning] são impressos os logs de [Nivel.warning] e [Nivel.error]\n/// * [Nivel.error] é o nível mais restrito, e apenas [Nivel.error] são impressos.\nenum Nivel { info, warning, error }\n\n/// Controla a impressão de logs, feitas através do [printer].\n/// Imprime logs de acordo com o [nivel] informado.\nclass Logger {\n  const Logger({\n    this.printer = const Printer(),\n    required this.nivel,\n  });\n\n  /// Impressora responsável por imprimir o log de acordo com a plataforma.\n  final Printer printer;\n\n  /// Permite definir o [nivel] dos logs impressos.\n  final Nivel nivel;\n\n  /// Imprime logs de [Nivel.info] com a cor [Cores.verde].\n  void info(Object object) {\n    if (_habilitado(Nivel.info)) printer.log(Cores.verde, '[INFO] $object');\n  }\n\n  /// Imprime logs de [Nivel.warning] com a cor [Cores.azul].\n  void warning(Object object) {\n    if (_habilitado(Nivel.warning)) {\n      printer.log(Cores.azul, '[WARNING] $object');\n    }\n  }\n\n  /// Imprime logs de [Nivel.error] com a cor [Cores.vermelho].\n  void error(Object object) {\n    if (_habilitado(Nivel.error)) {\n      printer.log(Cores.vermelho, '[ERROR] $object');\n    }\n  }\n\n  /// Define se um determinado [Nivel] está habilitado para impressão.\n  bool _habilitado(Nivel nivelHabilitado) =>\n      nivelHabilitado.index >= nivel.index;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/lib/src/printer.dart",
    "content": "import 'log.dart';\nimport 'printer_console.dart' if (dart.library.io) 'printer_io.dart' as printer;\n\n/// Uma impressora de logs utilizada por [Logger] que funciona em todas\n/// as plataformas.\nclass Printer {\n  const Printer({this.inicio = '', this.fim = ''});\n\n  /// Utilizado para personalizar o início de cada linha impressa no log.\n  /// Por padrão não contém um valor.\n  final String inicio;\n\n  /// Utilizado para personalizar o término de cada linha impressa no log.\n  /// Por padrão não contém um valor.\n  final String fim;\n\n  /// Imprime o [object] de log de acordo com a plataforma utilizada.\n  /// É possível personalizar a [cor] do texto impresso.\n  void log(Cores cor, Object object) {\n    printer.log(\n      '${cor.ansi}'\n      '$inicio$object$fim'\n      '$resetarCor',\n    );\n  }\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/lib/src/printer_console.dart",
    "content": "/// Imprime o [object] no console, para a plataforma web.\nvoid log(Object object) {\n  print('[Console] $object');\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/lib/src/printer_io.dart",
    "content": "import 'dart:io';\n\n/// Imprime o [object] no terminal da plataforma.\nvoid log(Object object) {\n  stdout.writeln('[IO] $object');\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/07_logger_package/pubspec.yaml",
    "content": "name: logger\ndescription: Um package para facilitar a criação de logs nas aplicações.\nversion: 1.0.0\n\nenvironment:\n  sdk: ^3.5.1\n\ndev_dependencies:\n  lints: ^1.0.0\n  test: ^1.16.0\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/bin/climatempo.dart",
    "content": "import 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  try {\n    if (comando != null && comando.name == 'cidade') {\n      final nomeCidade = comando['nome'];\n      final estado = comando['estado'];\n      final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n      cidades.forEach((c) => print(c));\n    }\n\n    if (comando != null && comando.name == 'agora') {\n      final id = comando['id'];\n      if (id == null) {\n        print('É obrigatório informar um [-id] de cidade');\n        exit(2);\n      }\n      final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n      print(tempo);\n    }\n  } catch (e) {\n    print(e);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand(\n        'cidade',\n        ArgParser()\n          ..addOption('nome',\n              abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n          ..addOption('estado',\n              abbr: 'e', valueHelp: 'Sigla do estado para consulta'))\n    ..addCommand(\n        'agora',\n        ArgParser()\n          ..addOption('id',\n              abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo'))\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  @override\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/11_climatempo/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_client/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_client/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_client/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_client/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_client/bin/climatempo_client.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nvoid main(List<String> args) async {\n  var aviso = args.isNotEmpty ? args.first : '-';\n  final jsonMap = {'aviso': aviso};\n\n  HttpClientRequest request =\n      await HttpClient().post(InternetAddress.loopbackIPv4.host, 8080, '')\n        ..headers.contentType = ContentType.json\n        ..write(jsonEncode(jsonMap));\n\n  HttpClientResponse response = await request.close();\n  response.transform(utf8.decoder).forEach(print);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_client/pubspec.yaml",
    "content": "name: climatempo_client\ndescription: Aplicação CLI client do ClimaTempo.\nversion: 1.0.0\n\nenvironment:\n  sdk: ^3.5.1\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/bin/climatempo.dart",
    "content": "import 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/alerta_server.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  try {\n    if (comando != null && comando.name == 'cidade') {\n      final nomeCidade = comando['nome'];\n      final estado = comando['estado'];\n      final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n      cidades.forEach((c) => print(c));\n    }\n\n    if (comando != null && comando.name == 'agora') {\n      final id = comando['id'];\n      if (id == null) {\n        print('É obrigatório informar um [-id] de cidade');\n        exit(2);\n      }\n      final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n      print(tempo);\n    }\n\n    if (comando != null && comando.name == 'alerta') {\n      AlertaServer().start().listen(print);\n    }\n  } catch (e) {\n    print(e);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand('alerta')\n    ..addCommand(\n        'cidade',\n        ArgParser()\n          ..addOption('nome',\n              abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n          ..addOption('estado',\n              abbr: 'e', valueHelp: 'Sigla do estado para consulta'))\n    ..addCommand(\n        'agora',\n        ArgParser()\n          ..addOption('id',\n              abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo'))\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/lib/alerta_server.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nclass AlertaServer {\n  Stream<String> start() async* {\n    var server = await HttpServer.bind(\n      InternetAddress.loopbackIPv4,\n      8080,\n    );\n    await for (HttpRequest request in server) {\n      final contentType = request.headers.contentType != null\n          ? request.headers.contentType!.mimeType : '';\n      final response = request.response;\n\n      if (request.method == 'POST'\n          && contentType == 'application/json') {\n        final requestMap = await utf8.decoder.bind(request).join();\n        final String? aviso = jsonDecode(requestMap)['aviso'];\n        if (aviso != null) {\n          response\n            ..statusCode = HttpStatus.ok\n            ..write('Informação recebida!');\n          yield aviso;\n        } else {\n          response\n            ..statusCode = HttpStatus.badRequest\n            ..write('Formato de request errado..');\n        }\n      } else {\n        response\n          ..statusCode = HttpStatus.methodNotAllowed\n          ..write('É aceito apenas request POST');\n      }\n      await request.response.close();\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/13_climatempo_server/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/bin/climatempo.dart",
    "content": "import 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/alerta_server.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/log.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  try {\n    if (comando != null && comando.name == 'cidade') {\n      final nomeCidade = comando['nome'];\n      final estado = comando['estado'];\n      final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n      if (comando['salvar']) await salvarCidades(cidades);\n      cidades.forEach((c) => print(c));\n    }\n\n    if (comando != null && comando.name == 'agora') {\n      final id = comando['id'];\n      if (id == null) {\n        print('É obrigatório informar um [-id] de cidade');\n        exit(2);\n      }\n      final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n      if (comando['salvar']) await salvarTempo(tempo);\n      print(tempo);\n    }\n\n    if (comando != null && comando.name == 'alerta') {\n      AlertaServer().start().listen(print);\n    }\n  } catch (e) {\n    print(e);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand('alerta')\n    ..addCommand(\n      'cidade',\n      ArgParser()\n        ..addOption('nome',\n            abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n        ..addOption('estado',\n            abbr: 'e', valueHelp: 'Sigla do estado para consulta')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addCommand(\n      'agora',\n      ArgParser()\n        ..addOption('id',\n            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/lib/alerta_server.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nclass AlertaServer {\n  Stream<String> start() async* {\n    var server = await HttpServer.bind(\n      InternetAddress.loopbackIPv4,\n      8080,\n    );\n    await for (HttpRequest request in server) {\n      final contentType = request.headers.contentType != null\n          ? request.headers.contentType!.mimeType : '';\n      final response = request.response;\n\n      if (request.method == 'POST'\n          && contentType == 'application/json') {\n        final requestMap = await utf8.decoder.bind(request).join();\n        final String? aviso = jsonDecode(requestMap)['aviso'];\n        if (aviso != null) {\n          response\n            ..statusCode = HttpStatus.ok\n            ..write('Informação recebida!');\n          yield aviso;\n        } else {\n          response\n            ..statusCode = HttpStatus.badRequest\n            ..write('Formato de request errado..');\n        }\n      } else {\n        response\n          ..statusCode = HttpStatus.methodNotAllowed\n          ..write('É aceito apenas request POST');\n      }\n      await request.response.close();\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/lib/log.dart",
    "content": "import 'dart:io';\n\nimport 'package:climatempo/model/clima_tempo.dart';\n\nimport 'model/cidade.dart';\n\nFuture<void> _validarDiretorio() async {\n  final dir = Directory('log');\n  if (!(await dir.exists())) {\n    await dir.create();\n  }\n}\n\nFuture<void> salvarCidades(List<Cidade> cidades) async {\n  await _validarDiretorio();\n  final file = File('log/cidades.txt');\n  final sink = file.openWrite(mode: FileMode.write);\n  cidades.forEach((c) => sink.writeln(c));\n  await sink.flush();\n  await sink.close();\n}\n\nFuture<void> salvarTempo(ClimaTempo climaTempo) async {\n  await _validarDiretorio();\n  final file = File('log/${climaTempo.cidade.id}.txt');\n  await file.writeAsString('===\\n$climaTempo', mode: FileMode.append);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/log/4915.txt",
    "content": "===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR\n2024-12-21 17:20:45.000\nTemperatura:  26  -  Sensação:  27\nUmidade:  74  -  Velocidade  do  Vento:  24\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/log/cidades.txt",
    "content": "Id:  5049  -  Nome:  Abdon Batista  -  Estado:  SC, País:  BR  \nId:  5050  -  Nome:  Abelardo Luz  -  Estado:  SC, País:  BR  \nId:  5051  -  Nome:  Agrolândia  -  Estado:  SC, País:  BR  \nId:  5052  -  Nome:  Agronômica  -  Estado:  SC, País:  BR  \nId:  5053  -  Nome:  Água Doce  -  Estado:  SC, País:  BR  \nId:  5054  -  Nome:  Águas Brancas  -  Estado:  SC, País:  BR  \nId:  5055  -  Nome:  Águas de Chapecó  -  Estado:  SC, País:  BR  \nId:  5056  -  Nome:  Águas Frias  -  Estado:  SC, País:  BR  \nId:  5057  -  Nome:  Águas Mornas  -  Estado:  SC, País:  BR  \nId:  5058  -  Nome:  Alfredo Wagner  -  Estado:  SC, País:  BR  \nId:  5059  -  Nome:  Alto Bela Vista  -  Estado:  SC, País:  BR  \nId:  5060  -  Nome:  Anchieta  -  Estado:  SC, País:  BR  \nId:  5061  -  Nome:  Angelina  -  Estado:  SC, País:  BR  \nId:  5062  -  Nome:  Anita Garibaldi  -  Estado:  SC, País:  BR  \nId:  5063  -  Nome:  Anitápolis  -  Estado:  SC, País:  BR  \nId:  5064  -  Nome:  Anta Gorda  -  Estado:  SC, País:  BR  \nId:  5065  -  Nome:  Antônio Carlos  -  Estado:  SC, País:  BR  \nId:  5066  -  Nome:  Apiúna  -  Estado:  SC, País:  BR  \nId:  5067  -  Nome:  Arabutã  -  Estado:  SC, País:  BR  \nId:  5068  -  Nome:  Araquari  -  Estado:  SC, País:  BR  \nId:  5069  -  Nome:  Araranguá  -  Estado:  SC, País:  BR  \nId:  5070  -  Nome:  Armazém  -  Estado:  SC, País:  BR  \nId:  5071  -  Nome:  Arroio Trinta  -  Estado:  SC, País:  BR  \nId:  5072  -  Nome:  Arvoredo  -  Estado:  SC, País:  BR  \nId:  5073  -  Nome:  Ascurra  -  Estado:  SC, País:  BR  \nId:  5074  -  Nome:  Atalanta  -  Estado:  SC, País:  BR  \nId:  5075  -  Nome:  Aurora  -  Estado:  SC, País:  BR  \nId:  5076  -  Nome:  Balneário Arroio do Silva  -  Estado:  SC, País:  BR  \nId:  5077  -  Nome:  Balneário Barra do Sul  -  Estado:  SC, País:  BR  \nId:  5078  -  Nome:  Balneário Camboriú  -  Estado:  SC, País:  BR  \nId:  5080  -  Nome:  Balneário Gaivota  -  Estado:  SC, País:  BR  \nId:  4769  -  Nome:  Balneário Piçarras  -  Estado:  SC, País:  BR  \nId:  5081  -  Nome:  Bandeirante  -  Estado:  SC, País:  BR  \nId:  5082  -  Nome:  Barra Bonita  -  Estado:  SC, País:  BR  \nId:  5083  -  Nome:  Barra do Ibiraquera  -  Estado:  SC, País:  BR  \nId:  5084  -  Nome:  Barra do Saí  -  Estado:  SC, País:  BR  \nId:  5085  -  Nome:  Barra Velha  -  Estado:  SC, País:  BR  \nId:  5086  -  Nome:  Bela Vista do Toldo  -  Estado:  SC, País:  BR  \nId:  5087  -  Nome:  Belmonte  -  Estado:  SC, País:  BR  \nId:  5088  -  Nome:  Benedito Novo  -  Estado:  SC, País:  BR  \nId:  5089  -  Nome:  Biguaçu  -  Estado:  SC, País:  BR  \nId:  5090  -  Nome:  Blumenau  -  Estado:  SC, País:  BR  \nId:  5091  -  Nome:  Bocaina do Sul  -  Estado:  SC, País:  BR  \nId:  5092  -  Nome:  Bombinhas  -  Estado:  SC, País:  BR  \nId:  5093  -  Nome:  Bom Jardim da Serra  -  Estado:  SC, País:  BR  \nId:  5095  -  Nome:  Bom Jesus  -  Estado:  SC, País:  BR  \nId:  5094  -  Nome:  Bom Jesus do Oeste  -  Estado:  SC, País:  BR  \nId:  5096  -  Nome:  Bom Retiro  -  Estado:  SC, País:  BR  \nId:  5097  -  Nome:  Bom Sucesso  -  Estado:  SC, País:  BR  \nId:  5098  -  Nome:  Botuverá  -  Estado:  SC, País:  BR  \nId:  5099  -  Nome:  Braço do Norte  -  Estado:  SC, País:  BR  \nId:  5100  -  Nome:  Braço do Trombudo  -  Estado:  SC, País:  BR  \nId:  5101  -  Nome:  Brunópolis  -  Estado:  SC, País:  BR  \nId:  5102  -  Nome:  Brusque  -  Estado:  SC, País:  BR  \nId:  5103  -  Nome:  Caçador  -  Estado:  SC, País:  BR  \nId:  5104  -  Nome:  Caibi  -  Estado:  SC, País:  BR  \nId:  5105  -  Nome:  Calmon  -  Estado:  SC, País:  BR  \nId:  5106  -  Nome:  Camboriú  -  Estado:  SC, País:  BR  \nId:  5107  -  Nome:  Campina da Alegria  -  Estado:  SC, País:  BR  \nId:  5108  -  Nome:  Campo Alegre  -  Estado:  SC, País:  BR  \nId:  5109  -  Nome:  Campo Belo do Sul  -  Estado:  SC, País:  BR  \nId:  5110  -  Nome:  Campo Erê  -  Estado:  SC, País:  BR  \nId:  5111  -  Nome:  Campos Novos  -  Estado:  SC, País:  BR  \nId:  5112  -  Nome:  Canelinha  -  Estado:  SC, País:  BR  \nId:  5113  -  Nome:  Canoinhas  -  Estado:  SC, País:  BR  \nId:  5114  -  Nome:  Capão Alto  -  Estado:  SC, País:  BR  \nId:  5115  -  Nome:  Capinzal  -  Estado:  SC, País:  BR  \nId:  5116  -  Nome:  Capivari de Baixo  -  Estado:  SC, País:  BR  \nId:  5117  -  Nome:  Catanduvas  -  Estado:  SC, País:  BR  \nId:  5118  -  Nome:  Caxambu do Sul  -  Estado:  SC, País:  BR  \nId:  5119  -  Nome:  Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4888  -  Nome:  Cerro Negro  -  Estado:  SC, País:  BR  \nId:  4889  -  Nome:  Chapadão do Lageado  -  Estado:  SC, País:  BR  \nId:  4890  -  Nome:  Chapecó  -  Estado:  SC, País:  BR  \nId:  4891  -  Nome:  Cocal do Sul  -  Estado:  SC, País:  BR  \nId:  4892  -  Nome:  Concórdia  -  Estado:  SC, País:  BR  \nId:  4893  -  Nome:  Cordilheira Alta  -  Estado:  SC, País:  BR  \nId:  4894  -  Nome:  Coronel Freitas  -  Estado:  SC, País:  BR  \nId:  4895  -  Nome:  Coronel Martins  -  Estado:  SC, País:  BR  \nId:  4896  -  Nome:  Correia Pinto  -  Estado:  SC, País:  BR  \nId:  4897  -  Nome:  Corupá  -  Estado:  SC, País:  BR  \nId:  4898  -  Nome:  Criciúma  -  Estado:  SC, País:  BR  \nId:  4899  -  Nome:  Cunha Porã  -  Estado:  SC, País:  BR  \nId:  4900  -  Nome:  Cunhataí  -  Estado:  SC, País:  BR  \nId:  4901  -  Nome:  Curitibanos  -  Estado:  SC, País:  BR  \nId:  4902  -  Nome:  Descanso  -  Estado:  SC, País:  BR  \nId:  4903  -  Nome:  Dionísio Cerqueira  -  Estado:  SC, País:  BR  \nId:  4904  -  Nome:  Dona Emma  -  Estado:  SC, País:  BR  \nId:  4905  -  Nome:  Doutor Pedrinho  -  Estado:  SC, País:  BR  \nId:  4906  -  Nome:  Enseada de Brito  -  Estado:  SC, País:  BR  \nId:  4907  -  Nome:  Entre Rios  -  Estado:  SC, País:  BR  \nId:  4909  -  Nome:  Ermo  -  Estado:  SC, País:  BR  \nId:  4912  -  Nome:  Erval Velho  -  Estado:  SC, País:  BR  \nId:  4913  -  Nome:  Faxinal dos Guedes  -  Estado:  SC, País:  BR  \nId:  4914  -  Nome:  Flor do Sertão  -  Estado:  SC, País:  BR  \nId:  4915  -  Nome:  Florianópolis  -  Estado:  SC, País:  BR  \nId:  4916  -  Nome:  Formosa do Sul  -  Estado:  SC, País:  BR  \nId:  4918  -  Nome:  Forquilhinha  -  Estado:  SC, País:  BR  \nId:  4919  -  Nome:  Fraiburgo  -  Estado:  SC, País:  BR  \nId:  4920  -  Nome:  Frei Rogério  -  Estado:  SC, País:  BR  \nId:  4921  -  Nome:  Galvão  -  Estado:  SC, País:  BR  \nId:  4922  -  Nome:  Garopaba  -  Estado:  SC, País:  BR  \nId:  4923  -  Nome:  Garuva  -  Estado:  SC, País:  BR  \nId:  4924  -  Nome:  Gaspar  -  Estado:  SC, País:  BR  \nId:  4925  -  Nome:  Governador Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4927  -  Nome:  Grão Pará  -  Estado:  SC, País:  BR  \nId:  4928  -  Nome:  Gravatal  -  Estado:  SC, País:  BR  \nId:  4929  -  Nome:  Guabiruba  -  Estado:  SC, País:  BR  \nId:  4930  -  Nome:  Guaraciaba  -  Estado:  SC, País:  BR  \nId:  4931  -  Nome:  Guaramirim  -  Estado:  SC, País:  BR  \nId:  4932  -  Nome:  Guarda do Embaú  -  Estado:  SC, País:  BR  \nId:  4933  -  Nome:  Guarujá do Sul  -  Estado:  SC, País:  BR  \nId:  4935  -  Nome:  Guatá  -  Estado:  SC, País:  BR  \nId:  4934  -  Nome:  Guatambú  -  Estado:  SC, País:  BR  \nId:  4936  -  Nome:  Herval d'Oeste  -  Estado:  SC, País:  BR  \nId:  4937  -  Nome:  Ibiam  -  Estado:  SC, País:  BR  \nId:  4938  -  Nome:  Ibicaré  -  Estado:  SC, País:  BR  \nId:  4939  -  Nome:  Ibirama  -  Estado:  SC, País:  BR  \nId:  4940  -  Nome:  Içara  -  Estado:  SC, País:  BR  \nId:  4941  -  Nome:  Ilhota  -  Estado:  SC, País:  BR  \nId:  4942  -  Nome:  Imaruí  -  Estado:  SC, País:  BR  \nId:  4943  -  Nome:  Imbituba  -  Estado:  SC, País:  BR  \nId:  4944  -  Nome:  Imbuia  -  Estado:  SC, País:  BR  \nId:  4945  -  Nome:  Indaial  -  Estado:  SC, País:  BR  \nId:  4946  -  Nome:  Iomerê  -  Estado:  SC, País:  BR  \nId:  4947  -  Nome:  Ipira  -  Estado:  SC, País:  BR  \nId:  4948  -  Nome:  Ipoméia  -  Estado:  SC, País:  BR  \nId:  4949  -  Nome:  Iporã do Oeste  -  Estado:  SC, País:  BR  \nId:  4950  -  Nome:  Ipuaçu  -  Estado:  SC, País:  BR  \nId:  4951  -  Nome:  Ipumirim  -  Estado:  SC, País:  BR  \nId:  4952  -  Nome:  Iraceminha  -  Estado:  SC, País:  BR  \nId:  4953  -  Nome:  Irani  -  Estado:  SC, País:  BR  \nId:  4954  -  Nome:  Irati  -  Estado:  SC, País:  BR  \nId:  4955  -  Nome:  Irineópolis  -  Estado:  SC, País:  BR  \nId:  4962  -  Nome:  Itá  -  Estado:  SC, País:  BR  \nId:  4956  -  Nome:  Itaiópolis  -  Estado:  SC, País:  BR  \nId:  4957  -  Nome:  Itajaí  -  Estado:  SC, País:  BR  \nId:  4958  -  Nome:  Itapema  -  Estado:  SC, País:  BR  \nId:  4959  -  Nome:  Itapiranga  -  Estado:  SC, País:  BR  \nId:  4960  -  Nome:  Itapoá  -  Estado:  SC, País:  BR  \nId:  4961  -  Nome:  Itapocu  -  Estado:  SC, País:  BR  \nId:  4963  -  Nome:  Ituporanga  -  Estado:  SC, País:  BR  \nId:  4964  -  Nome:  Jaborá  -  Estado:  SC, País:  BR  \nId:  4965  -  Nome:  Jacinto Machado  -  Estado:  SC, País:  BR  \nId:  4966  -  Nome:  Jaguaruna  -  Estado:  SC, País:  BR  \nId:  4967  -  Nome:  Jaraguá do Sul  -  Estado:  SC, País:  BR  \nId:  4968  -  Nome:  Jardinópolis  -  Estado:  SC, País:  BR  \nId:  4969  -  Nome:  Joaçaba  -  Estado:  SC, País:  BR  \nId:  4970  -  Nome:  Joinville  -  Estado:  SC, País:  BR  \nId:  4971  -  Nome:  José Boiteux  -  Estado:  SC, País:  BR  \nId:  4972  -  Nome:  Jupiá  -  Estado:  SC, País:  BR  \nId:  4974  -  Nome:  Lacerdópolis  -  Estado:  SC, País:  BR  \nId:  4975  -  Nome:  Lages  -  Estado:  SC, País:  BR  \nId:  4976  -  Nome:  Laguna  -  Estado:  SC, País:  BR  \nId:  4977  -  Nome:  Lajeado Grande  -  Estado:  SC, País:  BR  \nId:  4978  -  Nome:  Laurentino  -  Estado:  SC, País:  BR  \nId:  4979  -  Nome:  Lauro Muller  -  Estado:  SC, País:  BR  \nId:  4980  -  Nome:  Lebon Régis  -  Estado:  SC, País:  BR  \nId:  4981  -  Nome:  Leoberto Leal  -  Estado:  SC, País:  BR  \nId:  4982  -  Nome:  Lindóia do Sul  -  Estado:  SC, País:  BR  \nId:  4983  -  Nome:  Lontras  -  Estado:  SC, País:  BR  \nId:  4984  -  Nome:  Luiz Alves  -  Estado:  SC, País:  BR  \nId:  4985  -  Nome:  Luzerna  -  Estado:  SC, País:  BR  \nId:  4986  -  Nome:  Macieira  -  Estado:  SC, País:  BR  \nId:  4987  -  Nome:  Mafra  -  Estado:  SC, País:  BR  \nId:  4988  -  Nome:  Major Gercino  -  Estado:  SC, País:  BR  \nId:  4989  -  Nome:  Major Vieira  -  Estado:  SC, País:  BR  \nId:  4990  -  Nome:  Maracajá  -  Estado:  SC, País:  BR  \nId:  4991  -  Nome:  Maravilha  -  Estado:  SC, País:  BR  \nId:  4992  -  Nome:  Marema  -  Estado:  SC, País:  BR  \nId:  4993  -  Nome:  Massaranduba  -  Estado:  SC, País:  BR  \nId:  4994  -  Nome:  Matos Costa  -  Estado:  SC, País:  BR  \nId:  4995  -  Nome:  Meleiro  -  Estado:  SC, País:  BR  \nId:  4996  -  Nome:  Mirim Doce  -  Estado:  SC, País:  BR  \nId:  4997  -  Nome:  Modelo  -  Estado:  SC, País:  BR  \nId:  4998  -  Nome:  Mondaí  -  Estado:  SC, País:  BR  \nId:  4999  -  Nome:  Monte Carlo  -  Estado:  SC, País:  BR  \nId:  5000  -  Nome:  Monte Castelo  -  Estado:  SC, País:  BR  \nId:  5001  -  Nome:  Morro da Fumaça  -  Estado:  SC, País:  BR  \nId:  5002  -  Nome:  Morro Grande  -  Estado:  SC, País:  BR  \nId:  5003  -  Nome:  Navegantes  -  Estado:  SC, País:  BR  \nId:  5004  -  Nome:  Nova Erechim  -  Estado:  SC, País:  BR  \nId:  5005  -  Nome:  Nova Itaberaba  -  Estado:  SC, País:  BR  \nId:  5006  -  Nome:  Nova Trento  -  Estado:  SC, País:  BR  \nId:  5007  -  Nome:  Nova Veneza  -  Estado:  SC, País:  BR  \nId:  4678  -  Nome:  Novo Horizonte  -  Estado:  SC, País:  BR  \nId:  4679  -  Nome:  Orleans  -  Estado:  SC, País:  BR  \nId:  4680  -  Nome:  Otacílio Costa  -  Estado:  SC, País:  BR  \nId:  4681  -  Nome:  Ouro  -  Estado:  SC, País:  BR  \nId:  4682  -  Nome:  Ouro Verde  -  Estado:  SC, País:  BR  \nId:  4683  -  Nome:  Paial  -  Estado:  SC, País:  BR  \nId:  4648  -  Nome:  Painel  -  Estado:  SC, País:  BR  \nId:  4756  -  Nome:  Palhoça  -  Estado:  SC, País:  BR  \nId:  4757  -  Nome:  Palma Sola  -  Estado:  SC, País:  BR  \nId:  4758  -  Nome:  Palmeira  -  Estado:  SC, País:  BR  \nId:  4759  -  Nome:  Palmitos  -  Estado:  SC, País:  BR  \nId:  4760  -  Nome:  Papanduva  -  Estado:  SC, País:  BR  \nId:  4761  -  Nome:  Paraíso  -  Estado:  SC, País:  BR  \nId:  4762  -  Nome:  Passo de Torres  -  Estado:  SC, País:  BR  \nId:  4763  -  Nome:  Passos Maia  -  Estado:  SC, País:  BR  \nId:  4764  -  Nome:  Paulo Lopes  -  Estado:  SC, País:  BR  \nId:  4765  -  Nome:  Pedras Grandes  -  Estado:  SC, País:  BR  \nId:  4766  -  Nome:  Penha  -  Estado:  SC, País:  BR  \nId:  4767  -  Nome:  Peritiba  -  Estado:  SC, País:  BR  \nId:  4768  -  Nome:  Petrolândia  -  Estado:  SC, País:  BR  \nId:  4770  -  Nome:  Pinhalzinho  -  Estado:  SC, País:  BR  \nId:  4771  -  Nome:  Pinheiro Preto  -  Estado:  SC, País:  BR  \nId:  4772  -  Nome:  Piratuba  -  Estado:  SC, País:  BR  \nId:  4773  -  Nome:  Planalto Alegre  -  Estado:  SC, País:  BR  \nId:  4774  -  Nome:  Pomerode  -  Estado:  SC, País:  BR  \nId:  4776  -  Nome:  Ponte Alta  -  Estado:  SC, País:  BR  \nId:  4775  -  Nome:  Ponte Alta do Norte  -  Estado:  SC, País:  BR  \nId:  4777  -  Nome:  Ponte Serrada  -  Estado:  SC, País:  BR  \nId:  4778  -  Nome:  Porto Belo  -  Estado:  SC, País:  BR  \nId:  4779  -  Nome:  Porto União  -  Estado:  SC, País:  BR  \nId:  4780  -  Nome:  Pouso Redondo  -  Estado:  SC, País:  BR  \nId:  4781  -  Nome:  Praia do Santinho  -  Estado:  SC, País:  BR  \nId:  4782  -  Nome:  Praia Grande  -  Estado:  SC, País:  BR  \nId:  4783  -  Nome:  Presidente Castelo Branco  -  Estado:  SC, País:  BR  \nId:  4784  -  Nome:  Presidente Getúlio  -  Estado:  SC, País:  BR  \nId:  4785  -  Nome:  Presidente Nereu  -  Estado:  SC, País:  BR  \nId:  4811  -  Nome:  Princesa  -  Estado:  SC, País:  BR  \nId:  4812  -  Nome:  Quilombo  -  Estado:  SC, País:  BR  \nId:  4813  -  Nome:  Rancho Queimado  -  Estado:  SC, País:  BR  \nId:  4814  -  Nome:  Rio das Antas  -  Estado:  SC, País:  BR  \nId:  4815  -  Nome:  Rio do Campo  -  Estado:  SC, País:  BR  \nId:  4816  -  Nome:  Rio d'Oeste  -  Estado:  SC, País:  BR  \nId:  4817  -  Nome:  Rio dos Cedros  -  Estado:  SC, País:  BR  \nId:  4818  -  Nome:  Rio do Sul  -  Estado:  SC, País:  BR  \nId:  4819  -  Nome:  Rio Fortuna  -  Estado:  SC, País:  BR  \nId:  4820  -  Nome:  Rio Negrinho  -  Estado:  SC, País:  BR  \nId:  4821  -  Nome:  Rio Rufino  -  Estado:  SC, País:  BR  \nId:  4822  -  Nome:  Riqueza  -  Estado:  SC, País:  BR  \nId:  4823  -  Nome:  Rodeio  -  Estado:  SC, País:  BR  \nId:  4824  -  Nome:  Romelândia  -  Estado:  SC, País:  BR  \nId:  4825  -  Nome:  Salete  -  Estado:  SC, País:  BR  \nId:  4826  -  Nome:  Saltinho  -  Estado:  SC, País:  BR  \nId:  4827  -  Nome:  Salto Veloso  -  Estado:  SC, País:  BR  \nId:  4828  -  Nome:  Sangão  -  Estado:  SC, País:  BR  \nId:  4829  -  Nome:  Santa Cecília  -  Estado:  SC, País:  BR  \nId:  4830  -  Nome:  Santa Helena  -  Estado:  SC, País:  BR  \nId:  4831  -  Nome:  Santa Rosa de Lima  -  Estado:  SC, País:  BR  \nId:  4832  -  Nome:  Santa Rosa do Sul  -  Estado:  SC, País:  BR  \nId:  4834  -  Nome:  Santa Terezinha  -  Estado:  SC, País:  BR  \nId:  4833  -  Nome:  Santa Terezinha do Progresso  -  Estado:  SC, País:  BR  \nId:  4835  -  Nome:  Santiago do Sul  -  Estado:  SC, País:  BR  \nId:  4836  -  Nome:  Santo Amaro da Imperatriz  -  Estado:  SC, País:  BR  \nId:  4837  -  Nome:  São Bento do Sul  -  Estado:  SC, País:  BR  \nId:  4838  -  Nome:  São Bernardino  -  Estado:  SC, País:  BR  \nId:  4839  -  Nome:  São Bonifácio  -  Estado:  SC, País:  BR  \nId:  4840  -  Nome:  São Carlos  -  Estado:  SC, País:  BR  \nId:  4841  -  Nome:  São Cristovão do Sul  -  Estado:  SC, País:  BR  \nId:  4842  -  Nome:  São Domingos  -  Estado:  SC, País:  BR  \nId:  4843  -  Nome:  São Francisco do Sul  -  Estado:  SC, País:  BR  \nId:  4844  -  Nome:  São João Batista  -  Estado:  SC, País:  BR  \nId:  4845  -  Nome:  São João do Itaperiú  -  Estado:  SC, País:  BR  \nId:  4846  -  Nome:  São João do Oeste  -  Estado:  SC, País:  BR  \nId:  4847  -  Nome:  São João do Sul  -  Estado:  SC, País:  BR  \nId:  4848  -  Nome:  São Joaquim  -  Estado:  SC, País:  BR  \nId:  4851  -  Nome:  São José  -  Estado:  SC, País:  BR  \nId:  4849  -  Nome:  São José do Cedro  -  Estado:  SC, País:  BR  \nId:  4850  -  Nome:  São José do Cerrito  -  Estado:  SC, País:  BR  \nId:  4852  -  Nome:  São Lourenço d'Oeste  -  Estado:  SC, País:  BR  \nId:  4853  -  Nome:  São Ludgero  -  Estado:  SC, País:  BR  \nId:  4854  -  Nome:  São Martinho  -  Estado:  SC, País:  BR  \nId:  4855  -  Nome:  São Miguel da Boa Vista  -  Estado:  SC, País:  BR  \nId:  4856  -  Nome:  São Miguel do Oeste  -  Estado:  SC, País:  BR  \nId:  4857  -  Nome:  São Pedro de Alcântara  -  Estado:  SC, País:  BR  \nId:  4858  -  Nome:  Saudades  -  Estado:  SC, País:  BR  \nId:  85793  -  Nome:  SBCH  -  Estado:  SC, País:  BR  \nId:  74832  -  Nome:  SBFL  -  Estado:  SC, País:  BR  \nId:  74833  -  Nome:  SBJV  -  Estado:  SC, País:  BR  \nId:  85285  -  Nome:  SBNF  -  Estado:  SC, País:  BR  \nId:  4859  -  Nome:  Schroeder  -  Estado:  SC, País:  BR  \nId:  4860  -  Nome:  Seara  -  Estado:  SC, País:  BR  \nId:  4861  -  Nome:  Serra Alta  -  Estado:  SC, País:  BR  \nId:  4862  -  Nome:  Siderópolis  -  Estado:  SC, País:  BR  \nId:  4863  -  Nome:  Sombrio  -  Estado:  SC, País:  BR  \nId:  4864  -  Nome:  Sul Brasil  -  Estado:  SC, País:  BR  \nId:  4865  -  Nome:  Taió  -  Estado:  SC, País:  BR  \nId:  4866  -  Nome:  Tangará  -  Estado:  SC, País:  BR  \nId:  4867  -  Nome:  Tigrinhos  -  Estado:  SC, País:  BR  \nId:  4868  -  Nome:  Tijucas  -  Estado:  SC, País:  BR  \nId:  4869  -  Nome:  Timbé do Sul  -  Estado:  SC, País:  BR  \nId:  4871  -  Nome:  Timbó  -  Estado:  SC, País:  BR  \nId:  4870  -  Nome:  Timbó Grande  -  Estado:  SC, País:  BR  \nId:  4872  -  Nome:  Três Barras  -  Estado:  SC, País:  BR  \nId:  4875  -  Nome:  Treviso  -  Estado:  SC, País:  BR  \nId:  4878  -  Nome:  Treze de Maio  -  Estado:  SC, País:  BR  \nId:  4879  -  Nome:  Treze Tílias  -  Estado:  SC, País:  BR  \nId:  4880  -  Nome:  Trombudo Central  -  Estado:  SC, País:  BR  \nId:  4881  -  Nome:  Tubarão  -  Estado:  SC, País:  BR  \nId:  4882  -  Nome:  Tunápolis  -  Estado:  SC, País:  BR  \nId:  4883  -  Nome:  Turvo  -  Estado:  SC, País:  BR  \nId:  4884  -  Nome:  União do Oeste  -  Estado:  SC, País:  BR  \nId:  4885  -  Nome:  Urubici  -  Estado:  SC, País:  BR  \nId:  4886  -  Nome:  Urupema  -  Estado:  SC, País:  BR  \nId:  4887  -  Nome:  Urussanga  -  Estado:  SC, País:  BR  \nId:  4482  -  Nome:  Vargeão  -  Estado:  SC, País:  BR  \nId:  4484  -  Nome:  Vargem  -  Estado:  SC, País:  BR  \nId:  4483  -  Nome:  Vargem Bonita  -  Estado:  SC, País:  BR  \nId:  4485  -  Nome:  Vidal Ramos  -  Estado:  SC, País:  BR  \nId:  4486  -  Nome:  Videira  -  Estado:  SC, País:  BR  \nId:  4487  -  Nome:  Vitor Meireles  -  Estado:  SC, País:  BR  \nId:  4488  -  Nome:  Witmarsum  -  Estado:  SC, País:  BR  \nId:  4489  -  Nome:  Xanxerê  -  Estado:  SC, País:  BR  \nId:  4490  -  Nome:  Xavantina  -  Estado:  SC, País:  BR  \nId:  4491  -  Nome:  Xaxim  -  Estado:  SC, País:  BR  \nId:  4492  -  Nome:  Zortéa  -  Estado:  SC, País:  BR  \n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/bin/climatempo.dart",
    "content": "import 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/alerta_server.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/log.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  try {\n    if (comando != null && comando.name == 'cidade') {\n      final nomeCidade = comando['nome'];\n      final estado = comando['estado'];\n      final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n      if (comando['salvar']) await salvarCidadesIsolate(cidades);\n      cidades.forEach((c) => print(c));\n    }\n\n    if (comando != null && comando.name == 'agora') {\n      final id = comando['id'];\n      if (id == null) {\n        print('É obrigatório informar um [-id] de cidade');\n        exit(2);\n      }\n      final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n      if (comando['salvar']) await salvarTempoIsolate(tempo);\n      print(tempo);\n    }\n\n    if (comando != null && comando.name == 'alerta') {\n      AlertaServer().start().listen(print);\n    }\n  } catch (e) {\n    print(e);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand('alerta')\n    ..addCommand(\n      'cidade',\n      ArgParser()\n        ..addOption('nome',\n            abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n        ..addOption('estado',\n            abbr: 'e', valueHelp: 'Sigla do estado para consulta')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addCommand(\n      'agora',\n      ArgParser()\n        ..addOption('id',\n            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/alerta_server.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nclass AlertaServer {\n  Stream<String> start() async* {\n    var server = await HttpServer.bind(\n      InternetAddress.loopbackIPv4,\n      8080,\n    );\n    await for (HttpRequest request in server) {\n      final contentType = request.headers.contentType != null\n          ? request.headers.contentType!.mimeType : '';\n      final response = request.response;\n\n      if (request.method == 'POST'\n          && contentType == 'application/json') {\n        final requestMap = await utf8.decoder.bind(request).join();\n        final String? aviso = jsonDecode(requestMap)['aviso'];\n        if (aviso != null) {\n          response\n            ..statusCode = HttpStatus.ok\n            ..write('Informação recebida!');\n          yield aviso;\n        } else {\n          response\n            ..statusCode = HttpStatus.badRequest\n            ..write('Formato de request errado..');\n        }\n      } else {\n        response\n          ..statusCode = HttpStatus.methodNotAllowed\n          ..write('É aceito apenas request POST');\n      }\n      await request.response.close();\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/log.dart",
    "content": "import 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:climatempo/model/clima_tempo.dart';\n\nimport 'model/cidade.dart';\n\nFuture<void> _validarDiretorio() async {\n  final dir = Directory('log');\n  if (!(await dir.exists())) {\n    await dir.create();\n  }\n}\n\nFuture<void> salvarTempoIsolate(ClimaTempo climaTempo) async {\n  final isolate = await Isolate.spawn(salvarTempo, climaTempo);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarTempo(ClimaTempo climaTempo) async {\n  await _validarDiretorio();\n  final file = File('log/${climaTempo.cidade.id}.txt');\n  await file.writeAsString('===\\n$climaTempo', mode: FileMode.append);\n}\n\nvoid _registrarCallbackFinalizacao(Isolate isolate) {\n  final receivePort = ReceivePort();\n  receivePort.listen((mensagem) {\n    print(mensagem);\n    receivePort.close();\n  });\n  isolate.addOnExitListener(receivePort.sendPort,\n      response: 'Arquivo salvo com sucesso!');\n}\n\nFuture<void> salvarCidadesIsolate(List<Cidade> cidades) async {\n  final isolate = await Isolate.spawn(salvarCidades, cidades);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarCidades(List<Cidade> cidades) async {\n  await _validarDiretorio();\n  final file = File('log/cidades.txt');\n  final sink = file.openWrite(mode: FileMode.write);\n  cidades.forEach((c) => sink.writeln(c));\n  await sink.flush();\n  await sink.close();\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/log/4915.txt",
    "content": "===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:45:02.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR\n2024-12-21 17:20:45.000\nTemperatura:  26  -  Sensação:  27\nUmidade:  74  -  Velocidade  do  Vento:  24\n===\nCidade:  Florianópolis,  SC  -  BR\n2024-12-21 17:20:45.000\nTemperatura:  26  -  Sensação:  27\nUmidade:  74  -  Velocidade  do  Vento:  24\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/log/cidades.txt",
    "content": "Id:  5049  -  Nome:  Abdon Batista  -  Estado:  SC, País:  BR  \nId:  5050  -  Nome:  Abelardo Luz  -  Estado:  SC, País:  BR  \nId:  5051  -  Nome:  Agrolândia  -  Estado:  SC, País:  BR  \nId:  5052  -  Nome:  Agronômica  -  Estado:  SC, País:  BR  \nId:  5053  -  Nome:  Água Doce  -  Estado:  SC, País:  BR  \nId:  5054  -  Nome:  Águas Brancas  -  Estado:  SC, País:  BR  \nId:  5055  -  Nome:  Águas de Chapecó  -  Estado:  SC, País:  BR  \nId:  5056  -  Nome:  Águas Frias  -  Estado:  SC, País:  BR  \nId:  5057  -  Nome:  Águas Mornas  -  Estado:  SC, País:  BR  \nId:  5058  -  Nome:  Alfredo Wagner  -  Estado:  SC, País:  BR  \nId:  5059  -  Nome:  Alto Bela Vista  -  Estado:  SC, País:  BR  \nId:  5060  -  Nome:  Anchieta  -  Estado:  SC, País:  BR  \nId:  5061  -  Nome:  Angelina  -  Estado:  SC, País:  BR  \nId:  5062  -  Nome:  Anita Garibaldi  -  Estado:  SC, País:  BR  \nId:  5063  -  Nome:  Anitápolis  -  Estado:  SC, País:  BR  \nId:  5064  -  Nome:  Anta Gorda  -  Estado:  SC, País:  BR  \nId:  5065  -  Nome:  Antônio Carlos  -  Estado:  SC, País:  BR  \nId:  5066  -  Nome:  Apiúna  -  Estado:  SC, País:  BR  \nId:  5067  -  Nome:  Arabutã  -  Estado:  SC, País:  BR  \nId:  5068  -  Nome:  Araquari  -  Estado:  SC, País:  BR  \nId:  5069  -  Nome:  Araranguá  -  Estado:  SC, País:  BR  \nId:  5070  -  Nome:  Armazém  -  Estado:  SC, País:  BR  \nId:  5071  -  Nome:  Arroio Trinta  -  Estado:  SC, País:  BR  \nId:  5072  -  Nome:  Arvoredo  -  Estado:  SC, País:  BR  \nId:  5073  -  Nome:  Ascurra  -  Estado:  SC, País:  BR  \nId:  5074  -  Nome:  Atalanta  -  Estado:  SC, País:  BR  \nId:  5075  -  Nome:  Aurora  -  Estado:  SC, País:  BR  \nId:  5076  -  Nome:  Balneário Arroio do Silva  -  Estado:  SC, País:  BR  \nId:  5077  -  Nome:  Balneário Barra do Sul  -  Estado:  SC, País:  BR  \nId:  5078  -  Nome:  Balneário Camboriú  -  Estado:  SC, País:  BR  \nId:  5080  -  Nome:  Balneário Gaivota  -  Estado:  SC, País:  BR  \nId:  4769  -  Nome:  Balneário Piçarras  -  Estado:  SC, País:  BR  \nId:  5081  -  Nome:  Bandeirante  -  Estado:  SC, País:  BR  \nId:  5082  -  Nome:  Barra Bonita  -  Estado:  SC, País:  BR  \nId:  5083  -  Nome:  Barra do Ibiraquera  -  Estado:  SC, País:  BR  \nId:  5084  -  Nome:  Barra do Saí  -  Estado:  SC, País:  BR  \nId:  5085  -  Nome:  Barra Velha  -  Estado:  SC, País:  BR  \nId:  5086  -  Nome:  Bela Vista do Toldo  -  Estado:  SC, País:  BR  \nId:  5087  -  Nome:  Belmonte  -  Estado:  SC, País:  BR  \nId:  5088  -  Nome:  Benedito Novo  -  Estado:  SC, País:  BR  \nId:  5089  -  Nome:  Biguaçu  -  Estado:  SC, País:  BR  \nId:  5090  -  Nome:  Blumenau  -  Estado:  SC, País:  BR  \nId:  5091  -  Nome:  Bocaina do Sul  -  Estado:  SC, País:  BR  \nId:  5092  -  Nome:  Bombinhas  -  Estado:  SC, País:  BR  \nId:  5093  -  Nome:  Bom Jardim da Serra  -  Estado:  SC, País:  BR  \nId:  5095  -  Nome:  Bom Jesus  -  Estado:  SC, País:  BR  \nId:  5094  -  Nome:  Bom Jesus do Oeste  -  Estado:  SC, País:  BR  \nId:  5096  -  Nome:  Bom Retiro  -  Estado:  SC, País:  BR  \nId:  5097  -  Nome:  Bom Sucesso  -  Estado:  SC, País:  BR  \nId:  5098  -  Nome:  Botuverá  -  Estado:  SC, País:  BR  \nId:  5099  -  Nome:  Braço do Norte  -  Estado:  SC, País:  BR  \nId:  5100  -  Nome:  Braço do Trombudo  -  Estado:  SC, País:  BR  \nId:  5101  -  Nome:  Brunópolis  -  Estado:  SC, País:  BR  \nId:  5102  -  Nome:  Brusque  -  Estado:  SC, País:  BR  \nId:  5103  -  Nome:  Caçador  -  Estado:  SC, País:  BR  \nId:  5104  -  Nome:  Caibi  -  Estado:  SC, País:  BR  \nId:  5105  -  Nome:  Calmon  -  Estado:  SC, País:  BR  \nId:  5106  -  Nome:  Camboriú  -  Estado:  SC, País:  BR  \nId:  5107  -  Nome:  Campina da Alegria  -  Estado:  SC, País:  BR  \nId:  5108  -  Nome:  Campo Alegre  -  Estado:  SC, País:  BR  \nId:  5109  -  Nome:  Campo Belo do Sul  -  Estado:  SC, País:  BR  \nId:  5110  -  Nome:  Campo Erê  -  Estado:  SC, País:  BR  \nId:  5111  -  Nome:  Campos Novos  -  Estado:  SC, País:  BR  \nId:  5112  -  Nome:  Canelinha  -  Estado:  SC, País:  BR  \nId:  5113  -  Nome:  Canoinhas  -  Estado:  SC, País:  BR  \nId:  5114  -  Nome:  Capão Alto  -  Estado:  SC, País:  BR  \nId:  5115  -  Nome:  Capinzal  -  Estado:  SC, País:  BR  \nId:  5116  -  Nome:  Capivari de Baixo  -  Estado:  SC, País:  BR  \nId:  5117  -  Nome:  Catanduvas  -  Estado:  SC, País:  BR  \nId:  5118  -  Nome:  Caxambu do Sul  -  Estado:  SC, País:  BR  \nId:  5119  -  Nome:  Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4888  -  Nome:  Cerro Negro  -  Estado:  SC, País:  BR  \nId:  4889  -  Nome:  Chapadão do Lageado  -  Estado:  SC, País:  BR  \nId:  4890  -  Nome:  Chapecó  -  Estado:  SC, País:  BR  \nId:  4891  -  Nome:  Cocal do Sul  -  Estado:  SC, País:  BR  \nId:  4892  -  Nome:  Concórdia  -  Estado:  SC, País:  BR  \nId:  4893  -  Nome:  Cordilheira Alta  -  Estado:  SC, País:  BR  \nId:  4894  -  Nome:  Coronel Freitas  -  Estado:  SC, País:  BR  \nId:  4895  -  Nome:  Coronel Martins  -  Estado:  SC, País:  BR  \nId:  4896  -  Nome:  Correia Pinto  -  Estado:  SC, País:  BR  \nId:  4897  -  Nome:  Corupá  -  Estado:  SC, País:  BR  \nId:  4898  -  Nome:  Criciúma  -  Estado:  SC, País:  BR  \nId:  4899  -  Nome:  Cunha Porã  -  Estado:  SC, País:  BR  \nId:  4900  -  Nome:  Cunhataí  -  Estado:  SC, País:  BR  \nId:  4901  -  Nome:  Curitibanos  -  Estado:  SC, País:  BR  \nId:  4902  -  Nome:  Descanso  -  Estado:  SC, País:  BR  \nId:  4903  -  Nome:  Dionísio Cerqueira  -  Estado:  SC, País:  BR  \nId:  4904  -  Nome:  Dona Emma  -  Estado:  SC, País:  BR  \nId:  4905  -  Nome:  Doutor Pedrinho  -  Estado:  SC, País:  BR  \nId:  4906  -  Nome:  Enseada de Brito  -  Estado:  SC, País:  BR  \nId:  4907  -  Nome:  Entre Rios  -  Estado:  SC, País:  BR  \nId:  4909  -  Nome:  Ermo  -  Estado:  SC, País:  BR  \nId:  4912  -  Nome:  Erval Velho  -  Estado:  SC, País:  BR  \nId:  4913  -  Nome:  Faxinal dos Guedes  -  Estado:  SC, País:  BR  \nId:  4914  -  Nome:  Flor do Sertão  -  Estado:  SC, País:  BR  \nId:  4915  -  Nome:  Florianópolis  -  Estado:  SC, País:  BR  \nId:  4916  -  Nome:  Formosa do Sul  -  Estado:  SC, País:  BR  \nId:  4918  -  Nome:  Forquilhinha  -  Estado:  SC, País:  BR  \nId:  4919  -  Nome:  Fraiburgo  -  Estado:  SC, País:  BR  \nId:  4920  -  Nome:  Frei Rogério  -  Estado:  SC, País:  BR  \nId:  4921  -  Nome:  Galvão  -  Estado:  SC, País:  BR  \nId:  4922  -  Nome:  Garopaba  -  Estado:  SC, País:  BR  \nId:  4923  -  Nome:  Garuva  -  Estado:  SC, País:  BR  \nId:  4924  -  Nome:  Gaspar  -  Estado:  SC, País:  BR  \nId:  4925  -  Nome:  Governador Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4927  -  Nome:  Grão Pará  -  Estado:  SC, País:  BR  \nId:  4928  -  Nome:  Gravatal  -  Estado:  SC, País:  BR  \nId:  4929  -  Nome:  Guabiruba  -  Estado:  SC, País:  BR  \nId:  4930  -  Nome:  Guaraciaba  -  Estado:  SC, País:  BR  \nId:  4931  -  Nome:  Guaramirim  -  Estado:  SC, País:  BR  \nId:  4932  -  Nome:  Guarda do Embaú  -  Estado:  SC, País:  BR  \nId:  4933  -  Nome:  Guarujá do Sul  -  Estado:  SC, País:  BR  \nId:  4935  -  Nome:  Guatá  -  Estado:  SC, País:  BR  \nId:  4934  -  Nome:  Guatambú  -  Estado:  SC, País:  BR  \nId:  4936  -  Nome:  Herval d'Oeste  -  Estado:  SC, País:  BR  \nId:  4937  -  Nome:  Ibiam  -  Estado:  SC, País:  BR  \nId:  4938  -  Nome:  Ibicaré  -  Estado:  SC, País:  BR  \nId:  4939  -  Nome:  Ibirama  -  Estado:  SC, País:  BR  \nId:  4940  -  Nome:  Içara  -  Estado:  SC, País:  BR  \nId:  4941  -  Nome:  Ilhota  -  Estado:  SC, País:  BR  \nId:  4942  -  Nome:  Imaruí  -  Estado:  SC, País:  BR  \nId:  4943  -  Nome:  Imbituba  -  Estado:  SC, País:  BR  \nId:  4944  -  Nome:  Imbuia  -  Estado:  SC, País:  BR  \nId:  4945  -  Nome:  Indaial  -  Estado:  SC, País:  BR  \nId:  4946  -  Nome:  Iomerê  -  Estado:  SC, País:  BR  \nId:  4947  -  Nome:  Ipira  -  Estado:  SC, País:  BR  \nId:  4948  -  Nome:  Ipoméia  -  Estado:  SC, País:  BR  \nId:  4949  -  Nome:  Iporã do Oeste  -  Estado:  SC, País:  BR  \nId:  4950  -  Nome:  Ipuaçu  -  Estado:  SC, País:  BR  \nId:  4951  -  Nome:  Ipumirim  -  Estado:  SC, País:  BR  \nId:  4952  -  Nome:  Iraceminha  -  Estado:  SC, País:  BR  \nId:  4953  -  Nome:  Irani  -  Estado:  SC, País:  BR  \nId:  4954  -  Nome:  Irati  -  Estado:  SC, País:  BR  \nId:  4955  -  Nome:  Irineópolis  -  Estado:  SC, País:  BR  \nId:  4962  -  Nome:  Itá  -  Estado:  SC, País:  BR  \nId:  4956  -  Nome:  Itaiópolis  -  Estado:  SC, País:  BR  \nId:  4957  -  Nome:  Itajaí  -  Estado:  SC, País:  BR  \nId:  4958  -  Nome:  Itapema  -  Estado:  SC, País:  BR  \nId:  4959  -  Nome:  Itapiranga  -  Estado:  SC, País:  BR  \nId:  4960  -  Nome:  Itapoá  -  Estado:  SC, País:  BR  \nId:  4961  -  Nome:  Itapocu  -  Estado:  SC, País:  BR  \nId:  4963  -  Nome:  Ituporanga  -  Estado:  SC, País:  BR  \nId:  4964  -  Nome:  Jaborá  -  Estado:  SC, País:  BR  \nId:  4965  -  Nome:  Jacinto Machado  -  Estado:  SC, País:  BR  \nId:  4966  -  Nome:  Jaguaruna  -  Estado:  SC, País:  BR  \nId:  4967  -  Nome:  Jaraguá do Sul  -  Estado:  SC, País:  BR  \nId:  4968  -  Nome:  Jardinópolis  -  Estado:  SC, País:  BR  \nId:  4969  -  Nome:  Joaçaba  -  Estado:  SC, País:  BR  \nId:  4970  -  Nome:  Joinville  -  Estado:  SC, País:  BR  \nId:  4971  -  Nome:  José Boiteux  -  Estado:  SC, País:  BR  \nId:  4972  -  Nome:  Jupiá  -  Estado:  SC, País:  BR  \nId:  4974  -  Nome:  Lacerdópolis  -  Estado:  SC, País:  BR  \nId:  4975  -  Nome:  Lages  -  Estado:  SC, País:  BR  \nId:  4976  -  Nome:  Laguna  -  Estado:  SC, País:  BR  \nId:  4977  -  Nome:  Lajeado Grande  -  Estado:  SC, País:  BR  \nId:  4978  -  Nome:  Laurentino  -  Estado:  SC, País:  BR  \nId:  4979  -  Nome:  Lauro Muller  -  Estado:  SC, País:  BR  \nId:  4980  -  Nome:  Lebon Régis  -  Estado:  SC, País:  BR  \nId:  4981  -  Nome:  Leoberto Leal  -  Estado:  SC, País:  BR  \nId:  4982  -  Nome:  Lindóia do Sul  -  Estado:  SC, País:  BR  \nId:  4983  -  Nome:  Lontras  -  Estado:  SC, País:  BR  \nId:  4984  -  Nome:  Luiz Alves  -  Estado:  SC, País:  BR  \nId:  4985  -  Nome:  Luzerna  -  Estado:  SC, País:  BR  \nId:  4986  -  Nome:  Macieira  -  Estado:  SC, País:  BR  \nId:  4987  -  Nome:  Mafra  -  Estado:  SC, País:  BR  \nId:  4988  -  Nome:  Major Gercino  -  Estado:  SC, País:  BR  \nId:  4989  -  Nome:  Major Vieira  -  Estado:  SC, País:  BR  \nId:  4990  -  Nome:  Maracajá  -  Estado:  SC, País:  BR  \nId:  4991  -  Nome:  Maravilha  -  Estado:  SC, País:  BR  \nId:  4992  -  Nome:  Marema  -  Estado:  SC, País:  BR  \nId:  4993  -  Nome:  Massaranduba  -  Estado:  SC, País:  BR  \nId:  4994  -  Nome:  Matos Costa  -  Estado:  SC, País:  BR  \nId:  4995  -  Nome:  Meleiro  -  Estado:  SC, País:  BR  \nId:  4996  -  Nome:  Mirim Doce  -  Estado:  SC, País:  BR  \nId:  4997  -  Nome:  Modelo  -  Estado:  SC, País:  BR  \nId:  4998  -  Nome:  Mondaí  -  Estado:  SC, País:  BR  \nId:  4999  -  Nome:  Monte Carlo  -  Estado:  SC, País:  BR  \nId:  5000  -  Nome:  Monte Castelo  -  Estado:  SC, País:  BR  \nId:  5001  -  Nome:  Morro da Fumaça  -  Estado:  SC, País:  BR  \nId:  5002  -  Nome:  Morro Grande  -  Estado:  SC, País:  BR  \nId:  5003  -  Nome:  Navegantes  -  Estado:  SC, País:  BR  \nId:  5004  -  Nome:  Nova Erechim  -  Estado:  SC, País:  BR  \nId:  5005  -  Nome:  Nova Itaberaba  -  Estado:  SC, País:  BR  \nId:  5006  -  Nome:  Nova Trento  -  Estado:  SC, País:  BR  \nId:  5007  -  Nome:  Nova Veneza  -  Estado:  SC, País:  BR  \nId:  4678  -  Nome:  Novo Horizonte  -  Estado:  SC, País:  BR  \nId:  4679  -  Nome:  Orleans  -  Estado:  SC, País:  BR  \nId:  4680  -  Nome:  Otacílio Costa  -  Estado:  SC, País:  BR  \nId:  4681  -  Nome:  Ouro  -  Estado:  SC, País:  BR  \nId:  4682  -  Nome:  Ouro Verde  -  Estado:  SC, País:  BR  \nId:  4683  -  Nome:  Paial  -  Estado:  SC, País:  BR  \nId:  4648  -  Nome:  Painel  -  Estado:  SC, País:  BR  \nId:  4756  -  Nome:  Palhoça  -  Estado:  SC, País:  BR  \nId:  4757  -  Nome:  Palma Sola  -  Estado:  SC, País:  BR  \nId:  4758  -  Nome:  Palmeira  -  Estado:  SC, País:  BR  \nId:  4759  -  Nome:  Palmitos  -  Estado:  SC, País:  BR  \nId:  4760  -  Nome:  Papanduva  -  Estado:  SC, País:  BR  \nId:  4761  -  Nome:  Paraíso  -  Estado:  SC, País:  BR  \nId:  4762  -  Nome:  Passo de Torres  -  Estado:  SC, País:  BR  \nId:  4763  -  Nome:  Passos Maia  -  Estado:  SC, País:  BR  \nId:  4764  -  Nome:  Paulo Lopes  -  Estado:  SC, País:  BR  \nId:  4765  -  Nome:  Pedras Grandes  -  Estado:  SC, País:  BR  \nId:  4766  -  Nome:  Penha  -  Estado:  SC, País:  BR  \nId:  4767  -  Nome:  Peritiba  -  Estado:  SC, País:  BR  \nId:  4768  -  Nome:  Petrolândia  -  Estado:  SC, País:  BR  \nId:  4770  -  Nome:  Pinhalzinho  -  Estado:  SC, País:  BR  \nId:  4771  -  Nome:  Pinheiro Preto  -  Estado:  SC, País:  BR  \nId:  4772  -  Nome:  Piratuba  -  Estado:  SC, País:  BR  \nId:  4773  -  Nome:  Planalto Alegre  -  Estado:  SC, País:  BR  \nId:  4774  -  Nome:  Pomerode  -  Estado:  SC, País:  BR  \nId:  4776  -  Nome:  Ponte Alta  -  Estado:  SC, País:  BR  \nId:  4775  -  Nome:  Ponte Alta do Norte  -  Estado:  SC, País:  BR  \nId:  4777  -  Nome:  Ponte Serrada  -  Estado:  SC, País:  BR  \nId:  4778  -  Nome:  Porto Belo  -  Estado:  SC, País:  BR  \nId:  4779  -  Nome:  Porto União  -  Estado:  SC, País:  BR  \nId:  4780  -  Nome:  Pouso Redondo  -  Estado:  SC, País:  BR  \nId:  4781  -  Nome:  Praia do Santinho  -  Estado:  SC, País:  BR  \nId:  4782  -  Nome:  Praia Grande  -  Estado:  SC, País:  BR  \nId:  4783  -  Nome:  Presidente Castelo Branco  -  Estado:  SC, País:  BR  \nId:  4784  -  Nome:  Presidente Getúlio  -  Estado:  SC, País:  BR  \nId:  4785  -  Nome:  Presidente Nereu  -  Estado:  SC, País:  BR  \nId:  4811  -  Nome:  Princesa  -  Estado:  SC, País:  BR  \nId:  4812  -  Nome:  Quilombo  -  Estado:  SC, País:  BR  \nId:  4813  -  Nome:  Rancho Queimado  -  Estado:  SC, País:  BR  \nId:  4814  -  Nome:  Rio das Antas  -  Estado:  SC, País:  BR  \nId:  4815  -  Nome:  Rio do Campo  -  Estado:  SC, País:  BR  \nId:  4816  -  Nome:  Rio d'Oeste  -  Estado:  SC, País:  BR  \nId:  4817  -  Nome:  Rio dos Cedros  -  Estado:  SC, País:  BR  \nId:  4818  -  Nome:  Rio do Sul  -  Estado:  SC, País:  BR  \nId:  4819  -  Nome:  Rio Fortuna  -  Estado:  SC, País:  BR  \nId:  4820  -  Nome:  Rio Negrinho  -  Estado:  SC, País:  BR  \nId:  4821  -  Nome:  Rio Rufino  -  Estado:  SC, País:  BR  \nId:  4822  -  Nome:  Riqueza  -  Estado:  SC, País:  BR  \nId:  4823  -  Nome:  Rodeio  -  Estado:  SC, País:  BR  \nId:  4824  -  Nome:  Romelândia  -  Estado:  SC, País:  BR  \nId:  4825  -  Nome:  Salete  -  Estado:  SC, País:  BR  \nId:  4826  -  Nome:  Saltinho  -  Estado:  SC, País:  BR  \nId:  4827  -  Nome:  Salto Veloso  -  Estado:  SC, País:  BR  \nId:  4828  -  Nome:  Sangão  -  Estado:  SC, País:  BR  \nId:  4829  -  Nome:  Santa Cecília  -  Estado:  SC, País:  BR  \nId:  4830  -  Nome:  Santa Helena  -  Estado:  SC, País:  BR  \nId:  4831  -  Nome:  Santa Rosa de Lima  -  Estado:  SC, País:  BR  \nId:  4832  -  Nome:  Santa Rosa do Sul  -  Estado:  SC, País:  BR  \nId:  4834  -  Nome:  Santa Terezinha  -  Estado:  SC, País:  BR  \nId:  4833  -  Nome:  Santa Terezinha do Progresso  -  Estado:  SC, País:  BR  \nId:  4835  -  Nome:  Santiago do Sul  -  Estado:  SC, País:  BR  \nId:  4836  -  Nome:  Santo Amaro da Imperatriz  -  Estado:  SC, País:  BR  \nId:  4837  -  Nome:  São Bento do Sul  -  Estado:  SC, País:  BR  \nId:  4838  -  Nome:  São Bernardino  -  Estado:  SC, País:  BR  \nId:  4839  -  Nome:  São Bonifácio  -  Estado:  SC, País:  BR  \nId:  4840  -  Nome:  São Carlos  -  Estado:  SC, País:  BR  \nId:  4841  -  Nome:  São Cristovão do Sul  -  Estado:  SC, País:  BR  \nId:  4842  -  Nome:  São Domingos  -  Estado:  SC, País:  BR  \nId:  4843  -  Nome:  São Francisco do Sul  -  Estado:  SC, País:  BR  \nId:  4844  -  Nome:  São João Batista  -  Estado:  SC, País:  BR  \nId:  4845  -  Nome:  São João do Itaperiú  -  Estado:  SC, País:  BR  \nId:  4846  -  Nome:  São João do Oeste  -  Estado:  SC, País:  BR  \nId:  4847  -  Nome:  São João do Sul  -  Estado:  SC, País:  BR  \nId:  4848  -  Nome:  São Joaquim  -  Estado:  SC, País:  BR  \nId:  4851  -  Nome:  São José  -  Estado:  SC, País:  BR  \nId:  4849  -  Nome:  São José do Cedro  -  Estado:  SC, País:  BR  \nId:  4850  -  Nome:  São José do Cerrito  -  Estado:  SC, País:  BR  \nId:  4852  -  Nome:  São Lourenço d'Oeste  -  Estado:  SC, País:  BR  \nId:  4853  -  Nome:  São Ludgero  -  Estado:  SC, País:  BR  \nId:  4854  -  Nome:  São Martinho  -  Estado:  SC, País:  BR  \nId:  4855  -  Nome:  São Miguel da Boa Vista  -  Estado:  SC, País:  BR  \nId:  4856  -  Nome:  São Miguel do Oeste  -  Estado:  SC, País:  BR  \nId:  4857  -  Nome:  São Pedro de Alcântara  -  Estado:  SC, País:  BR  \nId:  4858  -  Nome:  Saudades  -  Estado:  SC, País:  BR  \nId:  85793  -  Nome:  SBCH  -  Estado:  SC, País:  BR  \nId:  74832  -  Nome:  SBFL  -  Estado:  SC, País:  BR  \nId:  74833  -  Nome:  SBJV  -  Estado:  SC, País:  BR  \nId:  85285  -  Nome:  SBNF  -  Estado:  SC, País:  BR  \nId:  4859  -  Nome:  Schroeder  -  Estado:  SC, País:  BR  \nId:  4860  -  Nome:  Seara  -  Estado:  SC, País:  BR  \nId:  4861  -  Nome:  Serra Alta  -  Estado:  SC, País:  BR  \nId:  4862  -  Nome:  Siderópolis  -  Estado:  SC, País:  BR  \nId:  4863  -  Nome:  Sombrio  -  Estado:  SC, País:  BR  \nId:  4864  -  Nome:  Sul Brasil  -  Estado:  SC, País:  BR  \nId:  4865  -  Nome:  Taió  -  Estado:  SC, País:  BR  \nId:  4866  -  Nome:  Tangará  -  Estado:  SC, País:  BR  \nId:  4867  -  Nome:  Tigrinhos  -  Estado:  SC, País:  BR  \nId:  4868  -  Nome:  Tijucas  -  Estado:  SC, País:  BR  \nId:  4869  -  Nome:  Timbé do Sul  -  Estado:  SC, País:  BR  \nId:  4871  -  Nome:  Timbó  -  Estado:  SC, País:  BR  \nId:  4870  -  Nome:  Timbó Grande  -  Estado:  SC, País:  BR  \nId:  4872  -  Nome:  Três Barras  -  Estado:  SC, País:  BR  \nId:  4875  -  Nome:  Treviso  -  Estado:  SC, País:  BR  \nId:  4878  -  Nome:  Treze de Maio  -  Estado:  SC, País:  BR  \nId:  4879  -  Nome:  Treze Tílias  -  Estado:  SC, País:  BR  \nId:  4880  -  Nome:  Trombudo Central  -  Estado:  SC, País:  BR  \nId:  4881  -  Nome:  Tubarão  -  Estado:  SC, País:  BR  \nId:  4882  -  Nome:  Tunápolis  -  Estado:  SC, País:  BR  \nId:  4883  -  Nome:  Turvo  -  Estado:  SC, País:  BR  \nId:  4884  -  Nome:  União do Oeste  -  Estado:  SC, País:  BR  \nId:  4885  -  Nome:  Urubici  -  Estado:  SC, País:  BR  \nId:  4886  -  Nome:  Urupema  -  Estado:  SC, País:  BR  \nId:  4887  -  Nome:  Urussanga  -  Estado:  SC, País:  BR  \nId:  4482  -  Nome:  Vargeão  -  Estado:  SC, País:  BR  \nId:  4484  -  Nome:  Vargem  -  Estado:  SC, País:  BR  \nId:  4483  -  Nome:  Vargem Bonita  -  Estado:  SC, País:  BR  \nId:  4485  -  Nome:  Vidal Ramos  -  Estado:  SC, País:  BR  \nId:  4486  -  Nome:  Videira  -  Estado:  SC, País:  BR  \nId:  4487  -  Nome:  Vitor Meireles  -  Estado:  SC, País:  BR  \nId:  4488  -  Nome:  Witmarsum  -  Estado:  SC, País:  BR  \nId:  4489  -  Nome:  Xanxerê  -  Estado:  SC, País:  BR  \nId:  4490  -  Nome:  Xavantina  -  Estado:  SC, País:  BR  \nId:  4491  -  Nome:  Xaxim  -  Estado:  SC, País:  BR  \nId:  4492  -  Nome:  Zortéa  -  Estado:  SC, País:  BR  \n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/.gitignore",
    "content": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/CHANGELOG.md",
    "content": "## 1.0.0\n\n- Initial version.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/README.md",
    "content": "A sample command-line application with an entrypoint in `bin/`, library code\nin `lib/`, and example unit test in `test/`.\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/analysis_options.yaml",
    "content": "# This file configures the static analysis results for your project (errors,\n# warnings, and lints).\n#\n# This enables the 'recommended' set of lints from `package:lints`.\n# This set helps identify many issues that may lead to problems when running\n# or consuming Dart code, and enforces writing Dart using a single, idiomatic\n# style and format.\n#\n# If you want a smaller set of lints you can change this to specify\n# 'package:lints/core.yaml'. These are just the most critical lints\n# (the recommended set includes the core lints).\n# The core lints are also what is used by pub.dev for scoring packages.\n\ninclude: package:lints/recommended.yaml\n\n# Uncomment the following section to specify additional rules.\n\n# linter:\n#   rules:\n#     - camel_case_types\n\n# analyzer:\n#   exclude:\n#     - path/to/excluded/files/**\n\n# For more information about the core and recommended set of lints, see\n# https://dart.dev/go/core-lints\n\n# For additional information about configuring this file, see\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:climatempo/alerta_server.dart';\nimport 'package:climatempo/api.dart';\nimport 'package:climatempo/log.dart';\nimport 'package:climatempo/model/clima_tempo.dart';\n\nvoid main(List<String> args) {\n  runZonedGuarded(() {\n    executar(args);\n  }, (e, s) {\n    print(e);\n    print(s);\n    salvarErro(e, s);\n  });\n}\n\nFuture<void> executar(List<String> args) async {\n  final parser = criarParser();\n  final argsResult = parser.parse(args);\n\n  if (argsResult['help']) {\n    mostrarAjuda(parser);\n    exit(0);\n  }\n\n  final comando = argsResult.command;\n  if (comando != null && comando.name == 'cidade') {\n    final nomeCidade = comando['nome'];\n    final estado = comando['estado'];\n    final cidades = await buscarCidades(estado: estado, nome: nomeCidade);\n    if (comando['salvar']) await salvarCidadesIsolate(cidades);\n    cidades.forEach((c) => print(c));\n  }\n\n  if (comando != null && comando.name == 'agora') {\n    final id = comando['id'];\n    if (id == null) {\n      print('É obrigatório informar um [-id] de cidade');\n      exit(2);\n    }\n    final tempo = await registrarCidadeEBuscarTempo(int.parse(id));\n    if (comando['salvar']) await salvarTempoIsolate(tempo);\n    print(tempo);\n  }\n\n  if (comando != null && comando.name == 'alerta') {\n    AlertaServer().start().listen(print);\n  }\n}\n\nFuture<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {\n  await registrarCidade(idCidade: idCidade);\n  return await climaAtual(idCidade: idCidade);\n}\n\nvoid mostrarAjuda(ArgParser parser) {\n  print('--- HELP ---');\n  print(parser.usage);\n  for (var comando in parser.commands.entries) {\n    print('> Comando [${comando.key}]');\n    print(comando.value.usage);\n  }\n}\n\nArgParser criarParser() {\n  return ArgParser()\n    ..addCommand('alerta')\n    ..addCommand(\n      'cidade',\n      ArgParser()\n        ..addOption('nome',\n            abbr: 'n', valueHelp: 'Nome da cidade para consulta')\n        ..addOption('estado',\n            abbr: 'e', valueHelp: 'Sigla do estado para consulta')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addCommand(\n      'agora',\n      ArgParser()\n        ..addOption('id',\n            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')\n        ..addFlag('salvar',\n            abbr: 's',\n            help: 'Salvar o resultado em arquivo de log',\n            negatable: false),\n    )\n    ..addFlag('help',\n        abbr: 'h', help: 'Como utilizar o programa', negatable: false);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/alerta_server.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nclass AlertaServer {\n  Stream<String> start() async* {\n    var server = await HttpServer.bind(\n      InternetAddress.loopbackIPv4,\n      8080,\n    );\n    await for (HttpRequest request in server) {\n      final contentType = request.headers.contentType != null\n          ? request.headers.contentType!.mimeType : '';\n      final response = request.response;\n\n      if (request.method == 'POST'\n          && contentType == 'application/json') {\n        final requestMap = await utf8.decoder.bind(request).join();\n        final String? aviso = jsonDecode(requestMap)['aviso'];\n        if (aviso != null) {\n          response\n            ..statusCode = HttpStatus.ok\n            ..write('Informação recebida!');\n          yield aviso;\n        } else {\n          response\n            ..statusCode = HttpStatus.badRequest\n            ..write('Formato de request errado..');\n        }\n      } else {\n        response\n          ..statusCode = HttpStatus.methodNotAllowed\n          ..write('É aceito apenas request POST');\n      }\n      await request.response.close();\n    }\n  }\n}"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/api.dart",
    "content": "import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport 'model/cidade.dart';\nimport 'model/clima_tempo.dart';\n\nconst apiBaseUrl = 'https://apiadvisor.climatempo.com.br';\nconst token = '5e411a25e4adf6786d3fd7fa45d9fa9c';\n\nFuture<List<Cidade>> buscarCidades({String? nome, String? estado}) async {\n  var url = '$apiBaseUrl/api/v1/locale/city?';\n  if (nome != null) url += 'name=$nome';\n  if (estado != null) url += '&state=$estado';\n\n  final response = await http.get(Uri.parse('$url&token=$token'));\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  final cidades = <Cidade>[];\n  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));\n  return cidades;\n}\n\nFuture<void> registrarCidade({required int idCidade}) async {\n  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';\n  final map = {'localeId[]': '$idCidade'};\n  await http.put(Uri.parse(url), body: map);\n}\n\nFuture<ClimaTempo> climaAtual({required int idCidade}) async {\n  final url =\n      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';\n  final response = await http.get(Uri.parse(url));\n\n  if (response.statusCode != 200) throw response.body;\n  final responseJson = json.decode(response.body);\n\n  return ClimaTempo.fromJson(responseJson);\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/log.dart",
    "content": "import 'dart:io';\nimport 'dart:isolate';\n\nimport 'package:climatempo/model/clima_tempo.dart';\n\nimport 'model/cidade.dart';\n\nFuture<void> _validarDiretorio() async {\n  final dir = Directory('log');\n  if (!(await dir.exists())) {\n    await dir.create();\n  }\n}\n\nFuture<void> salvarTempoIsolate(ClimaTempo climaTempo) async {\n  final isolate = await Isolate.spawn(salvarTempo, climaTempo);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarTempo(ClimaTempo climaTempo) async {\n  await _validarDiretorio();\n  final file = File('log/${climaTempo.cidade.id}.txt');\n  await file.writeAsString('===\\n$climaTempo', mode: FileMode.append);\n}\n\nvoid _registrarCallbackFinalizacao(Isolate isolate) {\n  final receivePort = ReceivePort();\n  receivePort.listen((mensagem) {\n    print(mensagem);\n    receivePort.close();\n  });\n  isolate.addOnExitListener(receivePort.sendPort,\n      response: 'Arquivo salvo com sucesso!');\n}\n\nFuture<void> salvarCidadesIsolate(List<Cidade> cidades) async {\n  final isolate = await Isolate.spawn(salvarCidades, cidades);\n  _registrarCallbackFinalizacao(isolate);\n}\n\nFuture<void> salvarCidades(List<Cidade> cidades) async {\n  await _validarDiretorio();\n  final file = File('log/cidades.txt');\n  final sink = file.openWrite(mode: FileMode.write);\n  cidades.forEach((c) => sink.writeln(c));\n  await sink.flush();\n  await sink.close();\n}\n\nFuture<void> salvarErro(Object erro, StackTrace stackTrace) async {\n  await _validarDiretorio();\n\n  final data = DateTime.now();\n  final ano = data.year;\n  final mes = _doisDigitos(data.month);\n  final dia = _doisDigitos(data.day);\n  final file = File('log/$dia$mes$ano.txt');\n\n  await file.writeAsString('${data.toIso8601String()} : $erro\\n',\n      mode: FileMode.append);\n  await file.writeAsString('${data.toIso8601String()} : $stackTrace',\n      mode: FileMode.append);\n}\n\nString _doisDigitos(int numero) {\n  if (numero >= 10) return '$numero';\n  return '0$numero';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/cidade.dart",
    "content": "class Cidade {\n  Cidade.fromJson(Map<String, dynamic> jsonMap)\n      : id = jsonMap['id'],\n        nome = jsonMap['name'],\n        estado = jsonMap['state'],\n        pais = jsonMap['country'];\n  final int id;\n  final String nome;\n  final String estado;\n  final String pais;\n\n  @override\n  String toString() =>\n      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/clima_tempo.dart",
    "content": "import 'cidade.dart';\nimport 'tempo.dart';\n\nclass ClimaTempo {\n  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)\n      : cidade = Cidade.fromJson(jsonMap),\n        tempo = Tempo.fromJson(jsonMap['data']);\n  final Cidade cidade;\n  final Tempo tempo;\n\n  String toString() => '''\nCidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}\n${tempo.data}\nTemperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}\nUmidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}\n''';\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/tempo.dart",
    "content": "class Tempo {\n  Tempo.fromJson(Map<String, dynamic> jsonMap)\n      : temperatura = jsonMap['temperature'],\n        velocidadeVento = jsonMap['wind_velocity'],\n        humidade = jsonMap['humidity'],\n        sensacao = jsonMap['sensation'],\n        data = DateTime.parse(jsonMap['date']);\n  final num temperatura;\n  final num velocidadeVento;\n  final num humidade;\n  final num sensacao;\n  final DateTime data;\n}\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/log/13032022.txt",
    "content": "2022-03-13T22:18:37.172126 : {\"error\":true,\"detail\":\"Invalid token\"}\n2022-03-13T22:18:37.172126 : #0      climaAtual (package:climatempo/api.dart:34:35)\n<asynchronous suspension>\n#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)\n<asynchronous suspension>\n#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)\n<asynchronous suspension>\n2022-03-13T22:18:54.065327 : {\"error\":true,\"detail\":\"Invalid token\"}\n2022-03-13T22:18:54.065327 : #0      climaAtual (package:climatempo/api.dart:34:35)\n<asynchronous suspension>\n#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)\n<asynchronous suspension>\n#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)\n<asynchronous suspension>\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/log/4915.txt",
    "content": "===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:32:11.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 21:45:02.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  17\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 22:18:07.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  15\n===\nCidade:  Florianópolis,  SC  -  BR  \n2022-03-13 22:18:07.000\nTemperatura:  20  -  Sensação:  20\nUmidade:  100  -  Velocidade  do  Vento:  15\n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/log/cidades.txt",
    "content": "Id:  5049  -  Nome:  Abdon Batista  -  Estado:  SC, País:  BR  \nId:  5050  -  Nome:  Abelardo Luz  -  Estado:  SC, País:  BR  \nId:  5051  -  Nome:  Agrolândia  -  Estado:  SC, País:  BR  \nId:  5052  -  Nome:  Agronômica  -  Estado:  SC, País:  BR  \nId:  5053  -  Nome:  Água Doce  -  Estado:  SC, País:  BR  \nId:  5054  -  Nome:  Águas Brancas  -  Estado:  SC, País:  BR  \nId:  5055  -  Nome:  Águas de Chapecó  -  Estado:  SC, País:  BR  \nId:  5056  -  Nome:  Águas Frias  -  Estado:  SC, País:  BR  \nId:  5057  -  Nome:  Águas Mornas  -  Estado:  SC, País:  BR  \nId:  5058  -  Nome:  Alfredo Wagner  -  Estado:  SC, País:  BR  \nId:  5059  -  Nome:  Alto Bela Vista  -  Estado:  SC, País:  BR  \nId:  5060  -  Nome:  Anchieta  -  Estado:  SC, País:  BR  \nId:  5061  -  Nome:  Angelina  -  Estado:  SC, País:  BR  \nId:  5062  -  Nome:  Anita Garibaldi  -  Estado:  SC, País:  BR  \nId:  5063  -  Nome:  Anitápolis  -  Estado:  SC, País:  BR  \nId:  5064  -  Nome:  Anta Gorda  -  Estado:  SC, País:  BR  \nId:  5065  -  Nome:  Antônio Carlos  -  Estado:  SC, País:  BR  \nId:  5066  -  Nome:  Apiúna  -  Estado:  SC, País:  BR  \nId:  5067  -  Nome:  Arabutã  -  Estado:  SC, País:  BR  \nId:  5068  -  Nome:  Araquari  -  Estado:  SC, País:  BR  \nId:  5069  -  Nome:  Araranguá  -  Estado:  SC, País:  BR  \nId:  5070  -  Nome:  Armazém  -  Estado:  SC, País:  BR  \nId:  5071  -  Nome:  Arroio Trinta  -  Estado:  SC, País:  BR  \nId:  5072  -  Nome:  Arvoredo  -  Estado:  SC, País:  BR  \nId:  5073  -  Nome:  Ascurra  -  Estado:  SC, País:  BR  \nId:  5074  -  Nome:  Atalanta  -  Estado:  SC, País:  BR  \nId:  5075  -  Nome:  Aurora  -  Estado:  SC, País:  BR  \nId:  5076  -  Nome:  Balneário Arroio do Silva  -  Estado:  SC, País:  BR  \nId:  5077  -  Nome:  Balneário Barra do Sul  -  Estado:  SC, País:  BR  \nId:  5078  -  Nome:  Balneário Camboriú  -  Estado:  SC, País:  BR  \nId:  5080  -  Nome:  Balneário Gaivota  -  Estado:  SC, País:  BR  \nId:  4769  -  Nome:  Balneário Piçarras  -  Estado:  SC, País:  BR  \nId:  5081  -  Nome:  Bandeirante  -  Estado:  SC, País:  BR  \nId:  5082  -  Nome:  Barra Bonita  -  Estado:  SC, País:  BR  \nId:  5083  -  Nome:  Barra do Ibiraquera  -  Estado:  SC, País:  BR  \nId:  5084  -  Nome:  Barra do Saí  -  Estado:  SC, País:  BR  \nId:  5085  -  Nome:  Barra Velha  -  Estado:  SC, País:  BR  \nId:  5086  -  Nome:  Bela Vista do Toldo  -  Estado:  SC, País:  BR  \nId:  5087  -  Nome:  Belmonte  -  Estado:  SC, País:  BR  \nId:  5088  -  Nome:  Benedito Novo  -  Estado:  SC, País:  BR  \nId:  5089  -  Nome:  Biguaçu  -  Estado:  SC, País:  BR  \nId:  5090  -  Nome:  Blumenau  -  Estado:  SC, País:  BR  \nId:  5091  -  Nome:  Bocaina do Sul  -  Estado:  SC, País:  BR  \nId:  5092  -  Nome:  Bombinhas  -  Estado:  SC, País:  BR  \nId:  5093  -  Nome:  Bom Jardim da Serra  -  Estado:  SC, País:  BR  \nId:  5095  -  Nome:  Bom Jesus  -  Estado:  SC, País:  BR  \nId:  5094  -  Nome:  Bom Jesus do Oeste  -  Estado:  SC, País:  BR  \nId:  5096  -  Nome:  Bom Retiro  -  Estado:  SC, País:  BR  \nId:  5097  -  Nome:  Bom Sucesso  -  Estado:  SC, País:  BR  \nId:  5098  -  Nome:  Botuverá  -  Estado:  SC, País:  BR  \nId:  5099  -  Nome:  Braço do Norte  -  Estado:  SC, País:  BR  \nId:  5100  -  Nome:  Braço do Trombudo  -  Estado:  SC, País:  BR  \nId:  5101  -  Nome:  Brunópolis  -  Estado:  SC, País:  BR  \nId:  5102  -  Nome:  Brusque  -  Estado:  SC, País:  BR  \nId:  5103  -  Nome:  Caçador  -  Estado:  SC, País:  BR  \nId:  5104  -  Nome:  Caibi  -  Estado:  SC, País:  BR  \nId:  5105  -  Nome:  Calmon  -  Estado:  SC, País:  BR  \nId:  5106  -  Nome:  Camboriú  -  Estado:  SC, País:  BR  \nId:  5107  -  Nome:  Campina da Alegria  -  Estado:  SC, País:  BR  \nId:  5108  -  Nome:  Campo Alegre  -  Estado:  SC, País:  BR  \nId:  5109  -  Nome:  Campo Belo do Sul  -  Estado:  SC, País:  BR  \nId:  5110  -  Nome:  Campo Erê  -  Estado:  SC, País:  BR  \nId:  5111  -  Nome:  Campos Novos  -  Estado:  SC, País:  BR  \nId:  5112  -  Nome:  Canelinha  -  Estado:  SC, País:  BR  \nId:  5113  -  Nome:  Canoinhas  -  Estado:  SC, País:  BR  \nId:  5114  -  Nome:  Capão Alto  -  Estado:  SC, País:  BR  \nId:  5115  -  Nome:  Capinzal  -  Estado:  SC, País:  BR  \nId:  5116  -  Nome:  Capivari de Baixo  -  Estado:  SC, País:  BR  \nId:  5117  -  Nome:  Catanduvas  -  Estado:  SC, País:  BR  \nId:  5118  -  Nome:  Caxambu do Sul  -  Estado:  SC, País:  BR  \nId:  5119  -  Nome:  Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4888  -  Nome:  Cerro Negro  -  Estado:  SC, País:  BR  \nId:  4889  -  Nome:  Chapadão do Lageado  -  Estado:  SC, País:  BR  \nId:  4890  -  Nome:  Chapecó  -  Estado:  SC, País:  BR  \nId:  4891  -  Nome:  Cocal do Sul  -  Estado:  SC, País:  BR  \nId:  4892  -  Nome:  Concórdia  -  Estado:  SC, País:  BR  \nId:  4893  -  Nome:  Cordilheira Alta  -  Estado:  SC, País:  BR  \nId:  4894  -  Nome:  Coronel Freitas  -  Estado:  SC, País:  BR  \nId:  4895  -  Nome:  Coronel Martins  -  Estado:  SC, País:  BR  \nId:  4896  -  Nome:  Correia Pinto  -  Estado:  SC, País:  BR  \nId:  4897  -  Nome:  Corupá  -  Estado:  SC, País:  BR  \nId:  4898  -  Nome:  Criciúma  -  Estado:  SC, País:  BR  \nId:  4899  -  Nome:  Cunha Porã  -  Estado:  SC, País:  BR  \nId:  4900  -  Nome:  Cunhataí  -  Estado:  SC, País:  BR  \nId:  4901  -  Nome:  Curitibanos  -  Estado:  SC, País:  BR  \nId:  4902  -  Nome:  Descanso  -  Estado:  SC, País:  BR  \nId:  4903  -  Nome:  Dionísio Cerqueira  -  Estado:  SC, País:  BR  \nId:  4904  -  Nome:  Dona Emma  -  Estado:  SC, País:  BR  \nId:  4905  -  Nome:  Doutor Pedrinho  -  Estado:  SC, País:  BR  \nId:  4906  -  Nome:  Enseada de Brito  -  Estado:  SC, País:  BR  \nId:  4907  -  Nome:  Entre Rios  -  Estado:  SC, País:  BR  \nId:  4909  -  Nome:  Ermo  -  Estado:  SC, País:  BR  \nId:  4912  -  Nome:  Erval Velho  -  Estado:  SC, País:  BR  \nId:  4913  -  Nome:  Faxinal dos Guedes  -  Estado:  SC, País:  BR  \nId:  4914  -  Nome:  Flor do Sertão  -  Estado:  SC, País:  BR  \nId:  4915  -  Nome:  Florianópolis  -  Estado:  SC, País:  BR  \nId:  4916  -  Nome:  Formosa do Sul  -  Estado:  SC, País:  BR  \nId:  4918  -  Nome:  Forquilhinha  -  Estado:  SC, País:  BR  \nId:  4919  -  Nome:  Fraiburgo  -  Estado:  SC, País:  BR  \nId:  4920  -  Nome:  Frei Rogério  -  Estado:  SC, País:  BR  \nId:  4921  -  Nome:  Galvão  -  Estado:  SC, País:  BR  \nId:  4922  -  Nome:  Garopaba  -  Estado:  SC, País:  BR  \nId:  4923  -  Nome:  Garuva  -  Estado:  SC, País:  BR  \nId:  4924  -  Nome:  Gaspar  -  Estado:  SC, País:  BR  \nId:  4925  -  Nome:  Governador Celso Ramos  -  Estado:  SC, País:  BR  \nId:  4927  -  Nome:  Grão Pará  -  Estado:  SC, País:  BR  \nId:  4928  -  Nome:  Gravatal  -  Estado:  SC, País:  BR  \nId:  4929  -  Nome:  Guabiruba  -  Estado:  SC, País:  BR  \nId:  4930  -  Nome:  Guaraciaba  -  Estado:  SC, País:  BR  \nId:  4931  -  Nome:  Guaramirim  -  Estado:  SC, País:  BR  \nId:  4932  -  Nome:  Guarda do Embaú  -  Estado:  SC, País:  BR  \nId:  4933  -  Nome:  Guarujá do Sul  -  Estado:  SC, País:  BR  \nId:  4935  -  Nome:  Guatá  -  Estado:  SC, País:  BR  \nId:  4934  -  Nome:  Guatambú  -  Estado:  SC, País:  BR  \nId:  4936  -  Nome:  Herval d'Oeste  -  Estado:  SC, País:  BR  \nId:  4937  -  Nome:  Ibiam  -  Estado:  SC, País:  BR  \nId:  4938  -  Nome:  Ibicaré  -  Estado:  SC, País:  BR  \nId:  4939  -  Nome:  Ibirama  -  Estado:  SC, País:  BR  \nId:  4940  -  Nome:  Içara  -  Estado:  SC, País:  BR  \nId:  4941  -  Nome:  Ilhota  -  Estado:  SC, País:  BR  \nId:  4942  -  Nome:  Imaruí  -  Estado:  SC, País:  BR  \nId:  4943  -  Nome:  Imbituba  -  Estado:  SC, País:  BR  \nId:  4944  -  Nome:  Imbuia  -  Estado:  SC, País:  BR  \nId:  4945  -  Nome:  Indaial  -  Estado:  SC, País:  BR  \nId:  4946  -  Nome:  Iomerê  -  Estado:  SC, País:  BR  \nId:  4947  -  Nome:  Ipira  -  Estado:  SC, País:  BR  \nId:  4948  -  Nome:  Ipoméia  -  Estado:  SC, País:  BR  \nId:  4949  -  Nome:  Iporã do Oeste  -  Estado:  SC, País:  BR  \nId:  4950  -  Nome:  Ipuaçu  -  Estado:  SC, País:  BR  \nId:  4951  -  Nome:  Ipumirim  -  Estado:  SC, País:  BR  \nId:  4952  -  Nome:  Iraceminha  -  Estado:  SC, País:  BR  \nId:  4953  -  Nome:  Irani  -  Estado:  SC, País:  BR  \nId:  4954  -  Nome:  Irati  -  Estado:  SC, País:  BR  \nId:  4955  -  Nome:  Irineópolis  -  Estado:  SC, País:  BR  \nId:  4962  -  Nome:  Itá  -  Estado:  SC, País:  BR  \nId:  4956  -  Nome:  Itaiópolis  -  Estado:  SC, País:  BR  \nId:  4957  -  Nome:  Itajaí  -  Estado:  SC, País:  BR  \nId:  4958  -  Nome:  Itapema  -  Estado:  SC, País:  BR  \nId:  4959  -  Nome:  Itapiranga  -  Estado:  SC, País:  BR  \nId:  4960  -  Nome:  Itapoá  -  Estado:  SC, País:  BR  \nId:  4961  -  Nome:  Itapocu  -  Estado:  SC, País:  BR  \nId:  4963  -  Nome:  Ituporanga  -  Estado:  SC, País:  BR  \nId:  4964  -  Nome:  Jaborá  -  Estado:  SC, País:  BR  \nId:  4965  -  Nome:  Jacinto Machado  -  Estado:  SC, País:  BR  \nId:  4966  -  Nome:  Jaguaruna  -  Estado:  SC, País:  BR  \nId:  4967  -  Nome:  Jaraguá do Sul  -  Estado:  SC, País:  BR  \nId:  4968  -  Nome:  Jardinópolis  -  Estado:  SC, País:  BR  \nId:  4969  -  Nome:  Joaçaba  -  Estado:  SC, País:  BR  \nId:  4970  -  Nome:  Joinville  -  Estado:  SC, País:  BR  \nId:  4971  -  Nome:  José Boiteux  -  Estado:  SC, País:  BR  \nId:  4972  -  Nome:  Jupiá  -  Estado:  SC, País:  BR  \nId:  4974  -  Nome:  Lacerdópolis  -  Estado:  SC, País:  BR  \nId:  4975  -  Nome:  Lages  -  Estado:  SC, País:  BR  \nId:  4976  -  Nome:  Laguna  -  Estado:  SC, País:  BR  \nId:  4977  -  Nome:  Lajeado Grande  -  Estado:  SC, País:  BR  \nId:  4978  -  Nome:  Laurentino  -  Estado:  SC, País:  BR  \nId:  4979  -  Nome:  Lauro Muller  -  Estado:  SC, País:  BR  \nId:  4980  -  Nome:  Lebon Régis  -  Estado:  SC, País:  BR  \nId:  4981  -  Nome:  Leoberto Leal  -  Estado:  SC, País:  BR  \nId:  4982  -  Nome:  Lindóia do Sul  -  Estado:  SC, País:  BR  \nId:  4983  -  Nome:  Lontras  -  Estado:  SC, País:  BR  \nId:  4984  -  Nome:  Luiz Alves  -  Estado:  SC, País:  BR  \nId:  4985  -  Nome:  Luzerna  -  Estado:  SC, País:  BR  \nId:  4986  -  Nome:  Macieira  -  Estado:  SC, País:  BR  \nId:  4987  -  Nome:  Mafra  -  Estado:  SC, País:  BR  \nId:  4988  -  Nome:  Major Gercino  -  Estado:  SC, País:  BR  \nId:  4989  -  Nome:  Major Vieira  -  Estado:  SC, País:  BR  \nId:  4990  -  Nome:  Maracajá  -  Estado:  SC, País:  BR  \nId:  4991  -  Nome:  Maravilha  -  Estado:  SC, País:  BR  \nId:  4992  -  Nome:  Marema  -  Estado:  SC, País:  BR  \nId:  4993  -  Nome:  Massaranduba  -  Estado:  SC, País:  BR  \nId:  4994  -  Nome:  Matos Costa  -  Estado:  SC, País:  BR  \nId:  4995  -  Nome:  Meleiro  -  Estado:  SC, País:  BR  \nId:  4996  -  Nome:  Mirim Doce  -  Estado:  SC, País:  BR  \nId:  4997  -  Nome:  Modelo  -  Estado:  SC, País:  BR  \nId:  4998  -  Nome:  Mondaí  -  Estado:  SC, País:  BR  \nId:  4999  -  Nome:  Monte Carlo  -  Estado:  SC, País:  BR  \nId:  5000  -  Nome:  Monte Castelo  -  Estado:  SC, País:  BR  \nId:  5001  -  Nome:  Morro da Fumaça  -  Estado:  SC, País:  BR  \nId:  5002  -  Nome:  Morro Grande  -  Estado:  SC, País:  BR  \nId:  5003  -  Nome:  Navegantes  -  Estado:  SC, País:  BR  \nId:  5004  -  Nome:  Nova Erechim  -  Estado:  SC, País:  BR  \nId:  5005  -  Nome:  Nova Itaberaba  -  Estado:  SC, País:  BR  \nId:  5006  -  Nome:  Nova Trento  -  Estado:  SC, País:  BR  \nId:  5007  -  Nome:  Nova Veneza  -  Estado:  SC, País:  BR  \nId:  4678  -  Nome:  Novo Horizonte  -  Estado:  SC, País:  BR  \nId:  4679  -  Nome:  Orleans  -  Estado:  SC, País:  BR  \nId:  4680  -  Nome:  Otacílio Costa  -  Estado:  SC, País:  BR  \nId:  4681  -  Nome:  Ouro  -  Estado:  SC, País:  BR  \nId:  4682  -  Nome:  Ouro Verde  -  Estado:  SC, País:  BR  \nId:  4683  -  Nome:  Paial  -  Estado:  SC, País:  BR  \nId:  4648  -  Nome:  Painel  -  Estado:  SC, País:  BR  \nId:  4756  -  Nome:  Palhoça  -  Estado:  SC, País:  BR  \nId:  4757  -  Nome:  Palma Sola  -  Estado:  SC, País:  BR  \nId:  4758  -  Nome:  Palmeira  -  Estado:  SC, País:  BR  \nId:  4759  -  Nome:  Palmitos  -  Estado:  SC, País:  BR  \nId:  4760  -  Nome:  Papanduva  -  Estado:  SC, País:  BR  \nId:  4761  -  Nome:  Paraíso  -  Estado:  SC, País:  BR  \nId:  4762  -  Nome:  Passo de Torres  -  Estado:  SC, País:  BR  \nId:  4763  -  Nome:  Passos Maia  -  Estado:  SC, País:  BR  \nId:  4764  -  Nome:  Paulo Lopes  -  Estado:  SC, País:  BR  \nId:  4765  -  Nome:  Pedras Grandes  -  Estado:  SC, País:  BR  \nId:  4766  -  Nome:  Penha  -  Estado:  SC, País:  BR  \nId:  4767  -  Nome:  Peritiba  -  Estado:  SC, País:  BR  \nId:  4768  -  Nome:  Petrolândia  -  Estado:  SC, País:  BR  \nId:  4770  -  Nome:  Pinhalzinho  -  Estado:  SC, País:  BR  \nId:  4771  -  Nome:  Pinheiro Preto  -  Estado:  SC, País:  BR  \nId:  4772  -  Nome:  Piratuba  -  Estado:  SC, País:  BR  \nId:  4773  -  Nome:  Planalto Alegre  -  Estado:  SC, País:  BR  \nId:  4774  -  Nome:  Pomerode  -  Estado:  SC, País:  BR  \nId:  4776  -  Nome:  Ponte Alta  -  Estado:  SC, País:  BR  \nId:  4775  -  Nome:  Ponte Alta do Norte  -  Estado:  SC, País:  BR  \nId:  4777  -  Nome:  Ponte Serrada  -  Estado:  SC, País:  BR  \nId:  4778  -  Nome:  Porto Belo  -  Estado:  SC, País:  BR  \nId:  4779  -  Nome:  Porto União  -  Estado:  SC, País:  BR  \nId:  4780  -  Nome:  Pouso Redondo  -  Estado:  SC, País:  BR  \nId:  4781  -  Nome:  Praia do Santinho  -  Estado:  SC, País:  BR  \nId:  4782  -  Nome:  Praia Grande  -  Estado:  SC, País:  BR  \nId:  4783  -  Nome:  Presidente Castelo Branco  -  Estado:  SC, País:  BR  \nId:  4784  -  Nome:  Presidente Getúlio  -  Estado:  SC, País:  BR  \nId:  4785  -  Nome:  Presidente Nereu  -  Estado:  SC, País:  BR  \nId:  4811  -  Nome:  Princesa  -  Estado:  SC, País:  BR  \nId:  4812  -  Nome:  Quilombo  -  Estado:  SC, País:  BR  \nId:  4813  -  Nome:  Rancho Queimado  -  Estado:  SC, País:  BR  \nId:  4814  -  Nome:  Rio das Antas  -  Estado:  SC, País:  BR  \nId:  4815  -  Nome:  Rio do Campo  -  Estado:  SC, País:  BR  \nId:  4816  -  Nome:  Rio d'Oeste  -  Estado:  SC, País:  BR  \nId:  4817  -  Nome:  Rio dos Cedros  -  Estado:  SC, País:  BR  \nId:  4818  -  Nome:  Rio do Sul  -  Estado:  SC, País:  BR  \nId:  4819  -  Nome:  Rio Fortuna  -  Estado:  SC, País:  BR  \nId:  4820  -  Nome:  Rio Negrinho  -  Estado:  SC, País:  BR  \nId:  4821  -  Nome:  Rio Rufino  -  Estado:  SC, País:  BR  \nId:  4822  -  Nome:  Riqueza  -  Estado:  SC, País:  BR  \nId:  4823  -  Nome:  Rodeio  -  Estado:  SC, País:  BR  \nId:  4824  -  Nome:  Romelândia  -  Estado:  SC, País:  BR  \nId:  4825  -  Nome:  Salete  -  Estado:  SC, País:  BR  \nId:  4826  -  Nome:  Saltinho  -  Estado:  SC, País:  BR  \nId:  4827  -  Nome:  Salto Veloso  -  Estado:  SC, País:  BR  \nId:  4828  -  Nome:  Sangão  -  Estado:  SC, País:  BR  \nId:  4829  -  Nome:  Santa Cecília  -  Estado:  SC, País:  BR  \nId:  4830  -  Nome:  Santa Helena  -  Estado:  SC, País:  BR  \nId:  4831  -  Nome:  Santa Rosa de Lima  -  Estado:  SC, País:  BR  \nId:  4832  -  Nome:  Santa Rosa do Sul  -  Estado:  SC, País:  BR  \nId:  4834  -  Nome:  Santa Terezinha  -  Estado:  SC, País:  BR  \nId:  4833  -  Nome:  Santa Terezinha do Progresso  -  Estado:  SC, País:  BR  \nId:  4835  -  Nome:  Santiago do Sul  -  Estado:  SC, País:  BR  \nId:  4836  -  Nome:  Santo Amaro da Imperatriz  -  Estado:  SC, País:  BR  \nId:  4837  -  Nome:  São Bento do Sul  -  Estado:  SC, País:  BR  \nId:  4838  -  Nome:  São Bernardino  -  Estado:  SC, País:  BR  \nId:  4839  -  Nome:  São Bonifácio  -  Estado:  SC, País:  BR  \nId:  4840  -  Nome:  São Carlos  -  Estado:  SC, País:  BR  \nId:  4841  -  Nome:  São Cristovão do Sul  -  Estado:  SC, País:  BR  \nId:  4842  -  Nome:  São Domingos  -  Estado:  SC, País:  BR  \nId:  4843  -  Nome:  São Francisco do Sul  -  Estado:  SC, País:  BR  \nId:  4844  -  Nome:  São João Batista  -  Estado:  SC, País:  BR  \nId:  4845  -  Nome:  São João do Itaperiú  -  Estado:  SC, País:  BR  \nId:  4846  -  Nome:  São João do Oeste  -  Estado:  SC, País:  BR  \nId:  4847  -  Nome:  São João do Sul  -  Estado:  SC, País:  BR  \nId:  4848  -  Nome:  São Joaquim  -  Estado:  SC, País:  BR  \nId:  4851  -  Nome:  São José  -  Estado:  SC, País:  BR  \nId:  4849  -  Nome:  São José do Cedro  -  Estado:  SC, País:  BR  \nId:  4850  -  Nome:  São José do Cerrito  -  Estado:  SC, País:  BR  \nId:  4852  -  Nome:  São Lourenço d'Oeste  -  Estado:  SC, País:  BR  \nId:  4853  -  Nome:  São Ludgero  -  Estado:  SC, País:  BR  \nId:  4854  -  Nome:  São Martinho  -  Estado:  SC, País:  BR  \nId:  4855  -  Nome:  São Miguel da Boa Vista  -  Estado:  SC, País:  BR  \nId:  4856  -  Nome:  São Miguel do Oeste  -  Estado:  SC, País:  BR  \nId:  4857  -  Nome:  São Pedro de Alcântara  -  Estado:  SC, País:  BR  \nId:  4858  -  Nome:  Saudades  -  Estado:  SC, País:  BR  \nId:  85793  -  Nome:  SBCH  -  Estado:  SC, País:  BR  \nId:  74832  -  Nome:  SBFL  -  Estado:  SC, País:  BR  \nId:  74833  -  Nome:  SBJV  -  Estado:  SC, País:  BR  \nId:  85285  -  Nome:  SBNF  -  Estado:  SC, País:  BR  \nId:  4859  -  Nome:  Schroeder  -  Estado:  SC, País:  BR  \nId:  4860  -  Nome:  Seara  -  Estado:  SC, País:  BR  \nId:  4861  -  Nome:  Serra Alta  -  Estado:  SC, País:  BR  \nId:  4862  -  Nome:  Siderópolis  -  Estado:  SC, País:  BR  \nId:  4863  -  Nome:  Sombrio  -  Estado:  SC, País:  BR  \nId:  4864  -  Nome:  Sul Brasil  -  Estado:  SC, País:  BR  \nId:  4865  -  Nome:  Taió  -  Estado:  SC, País:  BR  \nId:  4866  -  Nome:  Tangará  -  Estado:  SC, País:  BR  \nId:  4867  -  Nome:  Tigrinhos  -  Estado:  SC, País:  BR  \nId:  4868  -  Nome:  Tijucas  -  Estado:  SC, País:  BR  \nId:  4869  -  Nome:  Timbé do Sul  -  Estado:  SC, País:  BR  \nId:  4871  -  Nome:  Timbó  -  Estado:  SC, País:  BR  \nId:  4870  -  Nome:  Timbó Grande  -  Estado:  SC, País:  BR  \nId:  4872  -  Nome:  Três Barras  -  Estado:  SC, País:  BR  \nId:  4875  -  Nome:  Treviso  -  Estado:  SC, País:  BR  \nId:  4878  -  Nome:  Treze de Maio  -  Estado:  SC, País:  BR  \nId:  4879  -  Nome:  Treze Tílias  -  Estado:  SC, País:  BR  \nId:  4880  -  Nome:  Trombudo Central  -  Estado:  SC, País:  BR  \nId:  4881  -  Nome:  Tubarão  -  Estado:  SC, País:  BR  \nId:  4882  -  Nome:  Tunápolis  -  Estado:  SC, País:  BR  \nId:  4883  -  Nome:  Turvo  -  Estado:  SC, País:  BR  \nId:  4884  -  Nome:  União do Oeste  -  Estado:  SC, País:  BR  \nId:  4885  -  Nome:  Urubici  -  Estado:  SC, País:  BR  \nId:  4886  -  Nome:  Urupema  -  Estado:  SC, País:  BR  \nId:  4887  -  Nome:  Urussanga  -  Estado:  SC, País:  BR  \nId:  4482  -  Nome:  Vargeão  -  Estado:  SC, País:  BR  \nId:  4484  -  Nome:  Vargem  -  Estado:  SC, País:  BR  \nId:  4483  -  Nome:  Vargem Bonita  -  Estado:  SC, País:  BR  \nId:  4485  -  Nome:  Vidal Ramos  -  Estado:  SC, País:  BR  \nId:  4486  -  Nome:  Videira  -  Estado:  SC, País:  BR  \nId:  4487  -  Nome:  Vitor Meireles  -  Estado:  SC, País:  BR  \nId:  4488  -  Nome:  Witmarsum  -  Estado:  SC, País:  BR  \nId:  4489  -  Nome:  Xanxerê  -  Estado:  SC, País:  BR  \nId:  4490  -  Nome:  Xavantina  -  Estado:  SC, País:  BR  \nId:  4491  -  Nome:  Xaxim  -  Estado:  SC, País:  BR  \nId:  4492  -  Nome:  Zortéa  -  Estado:  SC, País:  BR  \n"
  },
  {
    "path": "code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/pubspec.yaml",
    "content": "name: climatempo\ndescription: Aplicação CLI para consulta de clima.\nversion: 0.0.1\n\nenvironment:\n  sdk: ^3.5.1\n\ndependencies:\n  args: ^2.4.2\n  http: ^1.2.2\n\ndev_dependencies:\n  lints: ^4.0.0\n  test: ^1.24.0\n  \nexecutables:\n  climatempo: climatempo"
  },
  {
    "path": "website/.gitignore",
    "content": "node_modules/\n.cache/\npublic\n"
  },
  {
    "path": "website/README.md",
    "content": ""
  },
  {
    "path": "website/gatsby-config.js",
    "content": "module.exports = {\n  siteMetadata: {\n    title: `O guia de Dart`,\n    siteUrl: `https://www.dartguide.dev`,\n    description: `A história, os fundamentos, os conceitos avançados e tudo mais.`,\n    image: `/green_guy.png`\n  },\n  plugins: [\n    {\n      resolve: \"gatsby-plugin-google-tagmanager\",\n      options: {\n        id: \"GTM-MLR7B9C\",\n        includeInDevelopment: false,\n        routeChangeEventName: \"gatsby-route-change\",\n        enableWebVitalsTracking: true\n      },\n    },\n    \"gatsby-plugin-styled-components\",\n    `gatsby-plugin-image`,\n    `gatsby-plugin-sharp`,\n    `gatsby-transformer-sharp`,\n    {\n      resolve: `gatsby-plugin-manifest`,\n      options: {\n        name: `Dart Guide Book`,\n        short_name: `DartGuide`,\n        display: `standalone`,\n        icon: `src/images/green_guy.png`\n      },\n    },\n    {\n      resolve: \"gatsby-plugin-react-svg\",\n      options: {\n        rule: {\n          include: /svgs/,\n        },\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "website/package.json",
    "content": "{\n  \"name\": \"dart-book\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"description\": \"Dart Book\",\n  \"author\": \"Julio Bitencourt\",\n  \"keywords\": [\n    \"gatsby\"\n  ],\n  \"scripts\": {\n    \"develop\": \"gatsby develop\",\n    \"start\": \"gatsby develop\",\n    \"build\": \"gatsby build\",\n    \"serve\": \"gatsby serve\",\n    \"clean\": \"gatsby clean\",\n    \"deploy\": \"gatsby build && gh-pages -d public -b main\"\n  },\n  \"dependencies\": {\n    \"@styled-icons/boxicons-logos\": \"^10.38.0\",\n    \"babel-plugin-styled-components\": \"^2.0.2\",\n    \"gatsby\": \"^4.7.1\",\n    \"gatsby-plugin-google-tagmanager\": \"^4.10.2\",\n    \"gatsby-plugin-image\": \"^2.7.0\",\n    \"gatsby-plugin-manifest\": \"^4.10.2\",\n    \"gatsby-plugin-react-svg\": \"^3.1.0\",\n    \"gatsby-plugin-sharp\": \"^4.10.2\",\n    \"gatsby-plugin-styled-components\": \"^5.7.0\",\n    \"gatsby-source-filesystem\": \"^4.7.0\",\n    \"gatsby-transformer-sharp\": \"^4.10.0\",\n    \"react\": \"^17.0.1\",\n    \"react-day-and-night-toggle\": \"^1.0.18\",\n    \"react-dom\": \"^17.0.1\",\n    \"styled-components\": \"^5.3.3\"\n  },\n  \"devDependencies\": {\n    \"gh-pages\": \"^3.2.3\"\n  }\n}\n"
  },
  {
    "path": "website/src/components/audience/audience.js",
    "content": "import React from \"react\";\nimport { StaticImage } from \"gatsby-plugin-image\";\nimport * as G from \"../layout/styles\";\n\nconst Audience = () => {\n  return (\n    <G.Section>\n      <G.Boundary>\n        <G.AlignTitle>\n          <G.SectionTitle>Pra quem é o livro?&nbsp;</G.SectionTitle>\n          <StaticImage\n            src=\"../../images/marvin.png\"\n            alt=\"Robô marvin\"\n            height={35}\n          />\n        </G.AlignTitle>\n        <br/>\n        <G.Paragraph>\n          <b><span><b>Este livro</b></span></b> é indicado para todos aqueles e aquelas que desejam\n          expandir um pouco o seu conhecimento sobre Dart, ou até mesmo para\n          quem não conhece nada da linguagem e quer se aventurar nesse novo\n          mundo, tendo uma nova carta na manga em seu currículo para começar a\n          desenvolver algo server side, para web, desktop, mobile, IOT... várias\n          possibilidades.\n        </G.Paragraph>\n        <G.Paragraph>\n          O objetivo é que o livro sirva como um guia estruturado para introdução e aprofundamento na \n          linguagem. Nele, abordarei desde os conceitos mais básicos envolvendo a sintaxe (como tipos, \n          operadores, estruturas de repetição etc.) até <i>features</i> mais avançadas da linguagem (como \n          programação assíncrona, generics etc.), sempre focando na parte teórica seguida de prática com exemplos\n        </G.Paragraph>\n        <G.Paragraph>\n          <b><span><b>Este livro não</b></span></b> é uma abordagem de Dart focada para algum SDK\n          específico, como a utilização do AngularDart para desenvolvimento web\n          ou até mesmo o Flutter para criação de aplicações móveis. Porém, como\n          eles trabalham em cima do core do Dart, todos os fundamentos e\n          conceitos aprendidos aqui serão essenciais e com certeza úteis para\n          utilização de qualquer outro framework criado a partir da linguagem.\n        </G.Paragraph>\n      </G.Boundary>\n    </G.Section>\n  );\n};\n\nexport default Audience;\n"
  },
  {
    "path": "website/src/components/author/author.js",
    "content": "import React from \"react\";\nimport { StaticImage } from \"gatsby-plugin-image\";\nimport * as S from \"./styles\";\nimport * as G from \"../layout/styles\";\nimport { Github, Instagram } from \"@styled-icons/boxicons-logos\";\n\nconst Author = () => {\n  return (\n    <G.Section primary>\n      <G.Boundary>\n        <G.AlignTitle>\n          <StaticImage\n            src=\"../../images/green_guy.png\"\n            alt=\"Boneco verde\"\n            height={20}\n          />\n          <G.SectionTitle>&nbsp;E o autor?</G.SectionTitle>\n        </G.AlignTitle>\n        <br />\n        <G.SplitColumnFlex>\n          <S.AuthorContainer\n            widthExpanded={\"70%\"}\n            textAlign={\"start\"}\n            alignItems={\"flex-start\"}\n          >\n            <G.Paragraph>\n              <b>Julio Henrique Bitencourt</b>\n              <br />\n            </G.Paragraph>\n            <G.Paragraph>\n              Bacharel em Ciência da Computação e pós-graduando em\n              desenvolvimento mobile pela FIAP. Um eterno estudante, acredito\n              que conhecimento nunca será demais e sempre é o momento certo para\n              ser um aprendiz em algo.\n            </G.Paragraph>\n            <G.Paragraph>\n              Entusiasta em desenvolvimento mobile, após anos flertando com\n              desenvolvimento Android, a partir do final de 2017 venho me\n              especializando e trabalhando com Dart na criação de aplicações\n              multiplataformas e nativas com o querido Flutter. SDK no qual\n              tenho prazer em trabalhar hoje em dia em meu atual emprego como\n              Desenvolvedor Mobile.\n            </G.Paragraph>\n          </S.AuthorContainer>\n\n          <S.AuthorContainer\n            widthExpanded={\"30%\"}\n            textAlign={\"center\"}\n            alignItems={\"center\"}\n          >\n            <S.Avatar>\n              <StaticImage\n                src=\"../../images/JHB.png\"\n                alt=\"Capa do livro\"\n                width={150}\n                height={150}\n              />\n            </S.Avatar>\n            <G.SplitColumn>\n              <S.Icon>\n                <a\n                  href=\"https://github.com/JHBitencourt\"\n                  target=\"_blank\"\n                  rel=\"noreferrer\"\n                >\n                  <Github />\n                </a>\n              </S.Icon>\n              <S.Icon>\n                <a\n                  href=\"https://www.instagram.com/juliobitencourt.dev\"\n                  target=\"_blank\"\n                  rel=\"noreferrer\"\n                >\n                  <Instagram />\n                </a>\n              </S.Icon>\n            </G.SplitColumn>\n          </S.AuthorContainer>\n        </G.SplitColumnFlex>\n      </G.Boundary>\n    </G.Section>\n  );\n};\n\nexport default Author;\n"
  },
  {
    "path": "website/src/components/author/styles.js",
    "content": "import styled, { css } from \"styled-components\";\n\nexport const Avatar = styled.figure`\n  ${({ theme }) => css`\n    min-width: 120px;\n    width: 120px;\n    height: 120px;\n    border: 3px solid ${theme.textColor};\n    border-radius: 50%;\n    overflow: hidden;\n\n    @media (max-width: 900px) {\n      margin: 0px 0px 20px 0px;\n    }\n  `};\n`;\n\nexport const AuthorContainer = styled.div`\n  ${({ theme, widthExpanded, textAlign, alignItems }) => css`\n    display: flex;\n    flex-direction: column;\n    text-align: ${textAlign};\n    align-items: ${alignItems};\n    width: ${widthExpanded};\n\n    @media (max-width: 900px) {\n      width: 100%;\n      margin-bottom: 30px;\n    }\n  `};\n`;\n\nexport const Icon = styled.div`\n  ${({ theme }) => css`\n    width: 30px;\n    height: 30px;\n    cursor: pointer;\n    color: ${theme.textColor};\n\n    &:not(:last-child) {\n      margin-right: 10px;\n    }\n\n    a {\n      all: unset;\n    }\n  `};\n`;\n"
  },
  {
    "path": "website/src/components/book-info/book-info.js",
    "content": "import React from \"react\";\nimport { useTheme } from \"styled-components\";\nimport { StaticImage } from \"gatsby-plugin-image\";\nimport * as S from \"./styles\";\nimport * as G from \"../layout/styles\";\n\nconst BookInfo = () => {\n  const theme = useTheme();\n\n  return (\n    <G.Section primary>\n      <G.Boundary>\n        <G.SplitColumnFlex>\n          <S.Content>\n            <G.Title>O guia de Dart</G.Title>\n            <G.Subtitle>Fundamentos, prática, conceitos avançados e <u>tudo mais</u>.</G.Subtitle>\n            <G.Paragraph>\n              Disponível impresso ou em seu leitor favorito (.pdf, .epub, .mob).\n            </G.Paragraph>\n            <G.Paragraph>Garanta a sua cópia: </G.Paragraph>\n\n            <p>\n              <G.LinkButton\n                target=\"_blank\"\n                el=\"noreferrer noopener\"\n                href=\"https://parceiro.casadocodigo.com.br/r/46p8/livro-dart\"\n              >\n                <G.Button color=\"#FF9900\" hoverColor=\"#E78B00\" textColor=\"#FFF\">\n                  Casa do Código\n                </G.Button>\n              </G.LinkButton>\n\n              <G.LinkButton\n                target=\"_blank\"\n                el=\"noreferrer noopener\"\n                href=\"https://www.amazon.com.br/dp/B09Z33JMKV/\"\n              >\n                <G.Button\n                  color={theme.dark === \"true\" ? \"#FFF\" : \"#37475A\"}\n                  hoverColor={theme.dark === \"true\" ? \"#F4F4F4\" : \"#212B36\"}\n                  textColor={theme.dark === \"true\" ? \"#37475A\" : \"#FFF\"}\n                >\n                  <span>Amazon Kindle</span>\n                </G.Button>\n              </G.LinkButton>\n            </p>\n          </S.Content>\n\n          <S.BookCover>\n            <S.Book>\n              <StaticImage height={340} width={240} src=\"../../images/cover.jpeg\" alt=\"Capa do livro\" />\n            </S.Book>\n          </S.BookCover>\n        </G.SplitColumnFlex>\n      </G.Boundary>\n    </G.Section>\n  );\n};\n\nexport default BookInfo;\n"
  },
  {
    "path": "website/src/components/book-info/styles.js",
    "content": "import { keyframes } from \"styled-components\";\nimport styled, { css } from \"styled-components\";\n\nexport const Content = styled.div`\n  /* display: flex; */\n  flex-direction: column;\n  justify-content: center;\n  text-align: start;\n  align-items: flex-start;\n  width: 70%;\n\n  @media (max-width: 900px) {\n    align-items: start;\n    width: 100%;\n  }\n`;\n\nconst coverAnimation = keyframes`\n  0% {\n    transform: rotateY(0deg);\n  }\n  100% {\n    transform: rotateY(-29deg);\n  }  \n`;\n\nexport const BookCover = styled.div`\n  ${({ theme }) => css`\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    perspective: 617px;    \n  `};\n`;\n\nexport const Book = styled.div`\n  ${({ theme }) => css`\n    width: 200px;\n    height: 285px;\n    position: relative;\n    transform-style: preserve-3d;\n    transform: rotateY(-29deg);\n    transition: transform 1s ease;\n    animation: 1s ease 0s 1 ${coverAnimation};\n\n    :hover {\n      transform: rotateY(0deg);\n    }\n\n    > :first-child {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 200px;\n      height: 285px;\n      transform: translateZ(22.5px);\n      border-radius: 0 2px 2px 0;\n      box-shadow: 5px 5px 20px #aaaaaa;\n      background-color: #01060f;\n    }\n\n    ::before {\n      position: absolute;\n      content: ' ';\n      left: 0;\n      top: 3px;\n      width: 43px;\n      height: 279px;\n      transform: translateX(174.5px) rotateY(90deg);\n      background: linear-gradient(90deg, \n        #fff 0%,\n        #f9f9f9 5%,\n        #fff 10%,\n        #f9f9f9 15%,\n        #fff 20%,\n        #f9f9f9 25%,\n        #fff 30%,\n        #f9f9f9 35%,\n        #fff 40%,\n        #f9f9f9 45%,\n        #fff 50%,\n        #f9f9f9 55%,\n        #fff 60%,\n        #f9f9f9 65%,\n        #fff 70%,\n        #f9f9f9 75%,\n        #fff 80%,\n        #f9f9f9 85%,\n        #fff 90%,\n        #f9f9f9 95%,\n        #fff 100%\n        );\n    }\n\n    ::after {\n      position: absolute;\n      top: 0;\n      left: 0;\n      content: ' ';\n      width: 200px;\n      height: 285px;\n      transform: translateZ(-22.5px);\n      background-color: #6e1c76;\n      border-radius: 0 2px 2px 0;\n      box-shadow: -10px 0 50px 10px #aaaaaa;\n    }\n  `};\n`;\n"
  },
  {
    "path": "website/src/components/github/github.js",
    "content": "import React from \"react\";\nimport { useTheme } from \"styled-components\";\nimport * as S from \"./styles\";\nimport * as G from \"../layout/styles\";\n\nconst Github = () => {\n  const theme = useTheme();\n\n  return (\n    <G.Section primary>\n      <G.Boundary>\n        <G.AlignTitle>\n          <S.ButtonArea>\n            <G.LinkButton\n              target=\"_blank\"\n              el=\"noreferrer noopener\"\n              href=\"https://github.com/JHBitencourt/dart-book\"\n            >\n              <G.Button\n                color={theme.dark === \"true\" ? \"#FFF\" : \"#37475A\"}\n                hoverColor={theme.dark === \"true\" ? \"#F4F4F4\" : \"#212B36\"}\n                textColor={theme.dark === \"true\" ? \"#37475A\" : \"#FFF\"}\n              >\n                Acesse o Github do livro\n              </G.Button>\n            </G.LinkButton>\n          </S.ButtonArea>\n        </G.AlignTitle>\n      </G.Boundary>\n    </G.Section>\n  );\n};\n\nexport default Github;\n"
  },
  {
    "path": "website/src/components/github/styles.js",
    "content": "import styled from \"styled-components\";\n\nexport const ButtonArea = styled.section`\n  margin: 12px;\n`;\n"
  },
  {
    "path": "website/src/components/layout/error.js",
    "content": "import React from \"react\";\nimport { useTheme } from \"styled-components\";\nimport * as G from \"../layout/styles\";\n\nconst ErrorContent = () => {\n  const theme = useTheme();\n\n  return (\n    <G.Section>\n      <G.Boundary>\n        <G.Link href=\"/\" rel=\"noreferrer\" textColor={theme.textColor}>\n          Voltar para home\n        </G.Link>\n        <br />\n        <br />\n        <br />\n\n        <G.Paragraph>Esta página não existe :/ </G.Paragraph>\n      </G.Boundary>\n    </G.Section>\n  );\n};\n\nexport default ErrorContent;\n"
  },
  {
    "path": "website/src/components/layout/footer/footer.js",
    "content": "import React from \"react\";\nimport { useTheme } from \"styled-components\";\nimport * as S from \"./styles\";\nimport * as G from \"../styles\";\nimport HitchhikersDark from \"../../../images/svgs/hitchhikers_guide_dark.svg\";\nimport HitchhikersLight from \"../../../images/svgs/hitchhikers_guide_light.svg\";\n\nconst Footer = (props) => {\n  const theme = useTheme();\n\n  let svg = theme.dark === \"true\" ? <HitchhikersLight /> : <HitchhikersDark />;\n\n  return (\n    <S.Footer bgColor={props.bgColor}>\n      <G.DefaultText>\n        Até mais, e obrigado pelos peixes! <S.Svg>{svg}</S.Svg>\n      </G.DefaultText>\n      <G.DefaultText>\n        Autoria de&nbsp;\n        <G.Link href=\"https://juliobitencourt.com/\" target=\"_blank\" rel=\"noreferrer\" textColor=\"#35DF91\">\n          Julio Bitencourt\n        </G.Link>\n        &nbsp;&nbsp;|&nbsp;&nbsp;Arte da capa por&nbsp;\n        <G.Link href=\"https://antunesketch.artstation.com/\" target=\"_blank\" rel=\"noreferrer\" textColor=\"#35DF91\">\n          @antunesketchreal\n        </G.Link>\n      </G.DefaultText>\n      &nbsp;\n    </S.Footer>\n  );\n};\n\nexport default Footer;\n"
  },
  {
    "path": "website/src/components/layout/footer/styles.js",
    "content": "import styled, { css } from \"styled-components\";\n\nexport const Footer = styled.footer`\n  ${({ theme, bgColor }) => css`\n    background-color: ${bgColor};\n    text-align: center;\n    padding: 20px;\n    color: ${theme.textColor};\n  `};\n`;\n\nexport const Svg = styled.svg`\n  width: 30px;\n  height: 30px;\n  vertical-align: middle;\n`;\n"
  },
  {
    "path": "website/src/components/layout/global.js",
    "content": "import { createGlobalStyle } from \"styled-components\";\n\nexport default createGlobalStyle`\n    @font-face {\n      font-family: \"Source Code Pro\";\n      src: url(\"/fonts/SourceCodePro.ttf\") format(\"ttf\");\n    }\n\n    body {\n      line-height: 0.9;\n    }\n\n    * {\n      font-family: 'Source Code Pro', monospace;\n      letter-spacing: 0.04rem;\n      box-sizing: border-box;\n    }\n`;\n"
  },
  {
    "path": "website/src/components/layout/header/header.js",
    "content": "import React, { useState, useEffect } from \"react\";\nimport DayNightToggle from \"react-day-and-night-toggle\";\nimport * as S from \"./styles\";\n\nconst Header = ({ changeTheme, isDarkTheme }) => {\n  const [isDarkMode, setIsDarkMode] = useState(isDarkTheme);\n  useEffect(() => {\n    setIsDarkMode(isDarkTheme);\n  }, [isDarkTheme]);\n\n  return (\n    <S.Header>\n      <S.Toggle>\n        <DayNightToggle\n          onChange={(e) => {\n            changeTheme();\n            setIsDarkMode(e);\n          }}\n          checked={isDarkMode}\n          shadows={true}\n          size={28}\n          className=\"toggle\"\n        />\n      </S.Toggle>\n    </S.Header>\n  );\n};\n\nexport default Header;\n"
  },
  {
    "path": "website/src/components/layout/header/styles.js",
    "content": "import styled, { css } from \"styled-components\";\n\nexport const Header = styled.header`\n  ${({ theme }) => css`\n    background-color: ${theme.primaryBg};\n  `};\n`;\n\nexport const Toggle = styled.div`\n  ${({ theme }) => css`\n    max-width: 80%;\n    margin: auto;\n    padding-top: 20px;\n    padding-bottom: 10px;\n\n    .toggle {\n      margin-left: auto;\n    }\n\n    .toggle > div {\n      /* box-shadow: ${theme.dark ? \"0 0 35px 1px #e0e0e0a8\" : \"none\"}; */\n      box-shadow: none;\n    }\n  `};\n`;\n"
  },
  {
    "path": "website/src/components/layout/layout.js",
    "content": "import React from \"react\";\nimport GlobalCSS from \"./global\";\nimport Header from \"./header/header\";\nimport Footer from \"./footer/footer\";\nimport { ThemeProvider } from \"styled-components\";\nimport { lightTheme, darkTheme } from \"./theme\";\n\nimport \"./normalize.css\";\n\nclass Layout extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = { lightTheme: true };\n    this.changeTheme = this.changeTheme.bind(this);\n  }\n\n  componentDidMount() {\n    const localStorageLayout = localStorage.getItem(\"lightTheme\");\n    if (localStorageLayout) {\n      this.setState({ lightTheme: JSON.parse(localStorageLayout) });\n    }\n  }\n\n  changeTheme() {\n    console.log(\"clique\");\n    this.setState({\n      lightTheme: !this.state.lightTheme,\n    });\n    localStorage.setItem(\"lightTheme\", !this.state.lightTheme);\n    console.log(\"change state\");\n  }\n\n  render() {\n    const { children } = this.props;\n\n    var footerColor;\n    if (this.state.lightTheme) {\n      footerColor = this.props.primary\n        ? lightTheme.primaryBg\n        : lightTheme.secondaryBg;\n    } else {\n      footerColor = this.props.primary\n        ? darkTheme.primaryBg\n        : darkTheme.secondaryBg;\n    }\n\n    return (\n      <ThemeProvider theme={this.state.lightTheme ? lightTheme : darkTheme}>\n        <GlobalCSS />\n        <Header\n          changeTheme={this.changeTheme}\n          isDarkTheme={this.state.lightTheme ? false : true}\n        />\n\n        {children}\n\n        <Footer bgColor={footerColor} />\n      </ThemeProvider>\n    );\n  }\n}\n\nexport default Layout;\n"
  },
  {
    "path": "website/src/components/layout/normalize.css",
    "content": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n  line-height: 1.15; /* 1 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n     ========================================================================== */\n\n/**\n   * Remove the margin in all browsers.\n   */\n\nbody {\n  margin: 0;\n}\n\n/**\n   * Render the `main` element consistently in IE.\n   */\n\nmain {\n  display: block;\n}\n\n/**\n   * Correct the font size and margin on `h1` elements within `section` and\n   * `article` contexts in Chrome, Firefox, and Safari.\n   */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/* Grouping content\n     ========================================================================== */\n\n/**\n   * 1. Add the correct box sizing in Firefox.\n   * 2. Show the overflow in Edge and IE.\n   */\n\nhr {\n  box-sizing: content-box; /* 1 */\n  height: 0; /* 1 */\n  overflow: visible; /* 2 */\n}\n\n/**\n   * 1. Correct the inheritance and scaling of font size in all browsers.\n   * 2. Correct the odd `em` font sizing in all browsers.\n   */\n\npre {\n  font-family: monospace, monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n     ========================================================================== */\n\n/**\n   * Remove the gray background on active links in IE 10.\n   */\n\na {\n  background-color: transparent;\n}\n\n/**\n   * 1. Remove the bottom border in Chrome 57-\n   * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n   */\n\nabbr[title] {\n  border-bottom: none; /* 1 */\n  text-decoration: underline; /* 2 */\n  text-decoration: underline dotted; /* 2 */\n}\n\n/**\n   * Add the correct font weight in Chrome, Edge, and Safari.\n   */\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n   * 1. Correct the inheritance and scaling of font size in all browsers.\n   * 2. Correct the odd `em` font sizing in all browsers.\n   */\n\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\n   * Add the correct font size in all browsers.\n   */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n   * Prevent `sub` and `sup` elements from affecting the line height in\n   * all browsers.\n   */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/* Embedded content\n     ========================================================================== */\n\n/**\n   * Remove the border on images inside links in IE 10.\n   */\n\nimg {\n  border-style: none;\n}\n\n/* Forms\n     ========================================================================== */\n\n/**\n   * 1. Change the font styles in all browsers.\n   * 2. Remove the margin in Firefox and Safari.\n   */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: inherit; /* 1 */\n  font-size: 100%; /* 1 */\n  line-height: 1.15; /* 1 */\n  margin: 0; /* 2 */\n}\n\n/**\n   * Show the overflow in IE.\n   * 1. Show the overflow in Edge.\n   */\n\nbutton,\ninput {\n  /* 1 */\n  overflow: visible;\n}\n\n/**\n   * Remove the inheritance of text transform in Edge, Firefox, and IE.\n   * 1. Remove the inheritance of text transform in Firefox.\n   */\n\nbutton,\nselect {\n  /* 1 */\n  text-transform: none;\n}\n\n/**\n   * Correct the inability to style clickable types in iOS and Safari.\n   */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\n/**\n   * Remove the inner border and padding in Firefox.\n   */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\n   * Restore the focus styles unset by the previous rule.\n   */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\n   * Correct the padding in Firefox.\n   */\n\nfieldset {\n  padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n   * 1. Correct the text wrapping in Edge and IE.\n   * 2. Correct the color inheritance from `fieldset` elements in IE.\n   * 3. Remove the padding so developers are not caught out when they zero out\n   *    `fieldset` elements in all browsers.\n   */\n\nlegend {\n  box-sizing: border-box; /* 1 */\n  color: inherit; /* 2 */\n  display: table; /* 1 */\n  max-width: 100%; /* 1 */\n  padding: 0; /* 3 */\n  white-space: normal; /* 1 */\n}\n\n/**\n   * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n   */\n\nprogress {\n  vertical-align: baseline;\n}\n\n/**\n   * Remove the default vertical scrollbar in IE 10+.\n   */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n   * 1. Add the correct box sizing in IE 10.\n   * 2. Remove the padding in IE 10.\n   */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n   * Correct the cursor style of increment and decrement buttons in Chrome.\n   */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n   * 1. Correct the odd appearance in Chrome and Safari.\n   * 2. Correct the outline style in Safari.\n   */\n\n[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  outline-offset: -2px; /* 2 */\n}\n\n/**\n   * Remove the inner padding in Chrome and Safari on macOS.\n   */\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n   * 1. Correct the inability to style clickable types in iOS and Safari.\n   * 2. Change font properties to `inherit` in Safari.\n   */\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button; /* 1 */\n  font: inherit; /* 2 */\n}\n\n/* Interactive\n     ========================================================================== */\n\n/*\n   * Add the correct display in Edge, IE 10+, and Firefox.\n   */\n\ndetails {\n  display: block;\n}\n\n/*\n   * Add the correct display in all browsers.\n   */\n\nsummary {\n  display: list-item;\n}\n\n/* Misc\n     ========================================================================== */\n\n/**\n   * Add the correct display in IE 10+.\n   */\n\ntemplate {\n  display: none;\n}\n\n/**\n   * Add the correct display in IE 10.\n   */\n\n[hidden] {\n  display: none;\n}\n"
  },
  {
    "path": "website/src/components/layout/styles.js",
    "content": "import styled, { css } from \"styled-components\";\n\nexport const Section = styled.section`\n  ${({ theme, primary }) => css`\n    background: ${primary ? theme.primaryBg : theme.secondaryBg};\n    text-align: center;\n    padding: 22px;\n  `}\n`;\n\nexport const Boundary = styled.div`\n  margin: 0 auto;\n  max-width: 80%;\n`;\n\nexport const SplitColumnFlex = styled.div`\n  display: flex;\n  align-items: center;\n  /* justify-content: center; */\n\n  @media (max-width: 900px) {\n    justify-content: center;\n    flex-direction: column;\n  }\n`;\n\nexport const SplitColumn = styled.div`\n  display: flex;\n`;\n\nexport const Link = styled.a`\n  ${({ theme, textColor }) => css`\n    color: ${textColor};\n    font-size: ${theme.font.size.default};\n  `};\n`;\n\nexport const LinkButton = styled.a`\n  ${({ theme }) => css`\n    font-size: ${theme.font.size.default};\n  `};\n`;\n\nexport const Title = styled.h1`\n  ${({ theme }) => css`\n    font-size: ${theme.font.size.biggest};\n    color: ${theme.textColor};\n    margin: 0px;\n    font-weight: 700;\n\n    &:not(:last-child) {\n      margin-bottom: 20px;\n    }\n  `}\n`;\n\nexport const Subtitle = styled.h2`\n  ${({ theme }) => css`\n    font-size: ${theme.font.size.big};\n    color: ${theme.textColor};\n    margin: 0px;\n    font-weight: 600;\n\n    &:not(:last-child) {\n      margin-bottom: 20px;\n    }\n  `}\n`;\n\nexport const SectionTitle = styled.h3`\n  ${({ theme }) => css`\n    font-size: ${theme.font.size.medium};\n    color: ${theme.textColor};\n    margin: 0px;\n    font-weight: 600;\n  `}\n`;\n\nexport const AlignTitle = styled.div`\n  ${({ theme }) => css`\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  `}\n`;\n\nexport const Paragraph = styled.p`\n  ${({ theme, textAlign }) => css`\n    font-size: ${theme.font.size.medium};\n    color: ${theme.textColor};\n    line-height: 1.4;\n    margin: 0px;\n    font-weight: 300;\n    text-align: ${textAlign ? textAlign : 'justify'};\n\n    &:not(:last-child) {\n      margin-bottom: 20px;\n    }\n  `}\n`;\n\nexport const DefaultText = styled.h4`\n  ${({ theme }) => css`\n    font-size: ${theme.font.size.default};\n    color: ${theme.textColor};\n    margin: 0px;\n    font-weight: 400;\n\n    &:not(:last-child) {\n      margin-bottom: 20px;\n    }\n  `}\n`;\n\nexport const Button = styled.button`\n  ${({ theme, color, hoverColor, textColor }) => css`\n    font-size: ${theme.font.size.medium};\n    font-weight: 500;\n    color: ${textColor};\n    background-color: ${color};\n    padding: 10px 16px;\n    border-radius: 6px;\n    border: none;\n    cursor: pointer;\n    margin-right: 26px;\n\n    :hover {\n      background-color: ${hoverColor};\n    }\n  `}\n`;\n"
  },
  {
    "path": "website/src/components/layout/theme.js",
    "content": "export const lightTheme = {\n  light: \"true\",\n  dark: \"false\",\n  primaryBg: \"#F9F9F9\",\n  secondaryBg: \"#EFEFEF\",\n  textColor: \"black\",\n  linkColor: \"#35DF91\",\n  containerColor: \"rgb(192 198 197 / 15%)\",\n  font: {\n    size: {\n      small: \"10px\",\n      default: \"12px\",\n      medium: \"14px\",\n      big: \"20px\",\n      biggest: \"40px\",\n    },\n  },\n};\n\nexport const darkTheme = {\n  dark: \"true\",\n  light: \"false\",\n  primaryBg: \"#000\",\n  secondaryBg: \"#2A2A2A\",\n  textColor: \"white\",\n  linkColor: \"#35DF91\",\n  containerColor: \"#ffffff14\",\n  font: {\n    size: {\n      small: \"10px\",\n      default: \"12px\",\n      medium: \"14px\",\n      big: \"20px\",\n      biggest: \"40px\",\n    },\n  },\n};\n"
  },
  {
    "path": "website/src/components/table-of-contents/styles.js",
    "content": "import styled, { css } from \"styled-components\";\n\nexport const BoxTimeline = styled.div`\n  box-sizing: border-box;\n`;\n\nexport const Timeline = styled.div`\n  ${({ theme }) => css`\n    position: relative;\n    max-width: 800px;\n    margin: 0 auto;\n\n    ::after {\n      content: \"\";\n      position: absolute;\n      width: 2px;\n      background-color: ${theme.textColor};\n      top: 0;\n      bottom: 0;\n      left: 50%;\n      margin-left: -1px;\n    }\n\n    @media (max-width: 900px) {\n      ::after {\n        left: 10px;\n      }\n    }\n  `};\n`;\n\nexport const ContainerLeftTimeline = styled.div`\n  ${({ theme }) => css`\n    padding: 10px 24px;\n    position: relative;\n    background-color: inherit;\n    width: 50%;\n\n    /* The circles on the timeline */\n    ::after {\n      content: \"\";\n      position: absolute;\n      top: 10px;\n      z-index: 1;\n      width: 0;\n      height: 0;\n      border-top: 12px solid transparent;\n      border-bottom: 12px solid transparent;\n      border-right: 12px solid ${theme.textColor};\n      right: 0px;\n    }\n\n    @media (max-width: 900px) {\n      width: 100%;\n\n      ::after {\n        content: \"\";\n        left: 10px;\n        border-top: 12px solid transparent;\n        border-bottom: 12px solid transparent;\n        border-left: 12px solid ${theme.textColor};\n        border-right: none;\n      }\n    }\n  `};\n`;\n\nexport const ContainerRightTimeline = styled.div`\n  ${({ theme }) => css`\n    padding: 10px 24px;\n    position: relative;\n    background-color: inherit;\n    width: 50%;\n    left: 50%;\n\n    /* The circles on the timeline */\n    ::after {\n      content: \"\";\n      position: absolute;\n      top: 10px;\n      z-index: 1;\n      left: 0px;\n      width: 0;\n      height: 0;\n      border-top: 12px solid transparent;\n      border-bottom: 12px solid transparent;\n      border-left: 12px solid ${theme.textColor};\n    }\n  `};\n\n  @media (max-width: 900px) {\n    width: 100%;\n    left: 0%;\n\n    ::after {\n      left: 10px;\n    }\n  }\n`;\n\nexport const ContentTimeline = styled.div`\n  ${({ theme }) => css`\n    padding: 10px;\n    color: ${theme.textColor};\n    background-color: ${theme.containerColor};\n    position: relative;\n    border-radius: 6px;\n  `};\n`;\n\nexport const Container = styled.div`\n  ${({ theme }) => css`\n    padding: 10px;\n    color: ${theme.textColor};\n    background-color: ${theme.containerColor};\n    border-radius: 6px;\n    text-align: start;\n  `};\n`;\n\nexport const ContainerTOC = styled.div`\n  ${({ theme }) => css`\n    font-size: ${theme.font.size.medium};\n    color: ${theme.textColor};\n    line-height: 1.4;\n    margin: 0px;\n    font-weight: 300;\n    text-align: start;\n  `}\n`;"
  },
  {
    "path": "website/src/components/table-of-contents/table-of-contents-full.js",
    "content": "import React from \"react\";\nimport { useTheme } from \"styled-components\";\nimport * as S from \"./styles\";\nimport * as G from \"../layout/styles\";\n\nconst TableOfContentsFull = () => {\n  const theme = useTheme();\n\n  return (\n    <G.Section>\n      <G.Boundary>\n        <G.Link href=\"/\" rel=\"noreferrer\" textColor={theme.textColor}>\n          Voltar para home\n        </G.Link>\n        <br />\n        <br />\n        <br />\n\n        <S.BoxTimeline>\n          <S.Container>\n            <S.ContainerTOC>\n              <ol>\n                <li>\n                  <b><span><b>Hello, Dart!</b></span></b>\n                  <ol type=\"i\">\n                    <li>Uma breve história</li>\n                    <li>Mas por que Dart?</li>\n                    <ol type=\"a\">\n                      <li>Ecossistema</li>\n                      <li>Facilidade de aprendizado</li>\n                    </ol>\n                    <li>Executando o código</li>\n                    <ol type=\"a\">\n                      <li>Dartpad</li>\n                      <li>Utilizando IDE</li>\n                    </ol>\n                    <li>Primeiro programa</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>O básico</b></span></b>\n                  <ol type=\"i\">\n                    <li>Operadores</li>\n                    <ol type=\"a\">\n                      <li>Operadores aritméticos</li>\n                      <li>Operadores relacionais e de equalidade</li>\n                      <li>Operadores lógicos</li>\n                      <li>Operadores de manipulação de bits</li>\n                      <li>Operadores de atribuição</li>\n                      <li>Operadores de incremento e decremento</li>\n                      <li>Operadores de validação e tipos</li>\n                      <li>Operadores gerais</li>\n                      <li>Operadores de nulidade</li>\n                      <li>Precedência de operadores</li>\n                    </ol>\n                    <li>Estruturas de controle</li>\n                    <ol type=\"a\">\n                      <li>if / else</li>\n                      <li>switch / case</li>\n                      <li>while</li>\n                      <li>do while</li>\n                      <li>for</li>\n                      <li>for in</li>\n                      <li>assert</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Benditos tipos</b></span></b>\n                  <ol type=\"i\">\n                    <li>Afinal, que raios é um tipo?</li>\n                    <li>Sistemas de tipagem</li>\n                    <ol type=\"a\">\n                      <li>Coercion</li>\n                      <li>weak e strong</li>\n                    </ol>\n                    <li>E onde entra Dart?</li>\n                    <ol type=\"a\">\n                      <li>Inferência</li>\n                      <li>Static ou dynamic? O melhor de dois mundos</li>\n                    </ol>\n                    <li>Quais os tipos existentes em Dart?</li>\n                    <ol type=\"a\">\n                      <li>Os números</li>\n                      <li>Booleanos</li>\n                      <li>Symbols</li>\n                    </ol>\n                    <li>Bem-vinda, null safety!</li>\n                    <ol type=\"a\">\n                      <li>Nullable types</li>\n                      <li>Type promotion</li>\n                      <li>O operador bang!</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>Strings</li>\n                    <ol type=\"a\">\n                      <li>Interpolação de Strings</li>\n                      <li>Otimização</li>\n                      <li>Sob demanda</li>\n                      <li>Muito mais</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>Na prática - Palíndromo</li>\n                    <ol type=\"a\">\n                      <li>É com você</li>\n                    </ol>\n                    <li>Variando um pouco</li>\n                    <ol type=\"a\">\n                      <li>E o tal do static?</li>\n                      <li>final x const</li>\n                      <li>late</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"i\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Explorando mais as funções e a Web</b></span></b>\n                  <ol type=\"i\">\n                    <li>Funções! Métodos! Closures?</li>\n                    <ol type=\"a\">\n                      <li>Funções como objetos</li>\n                      <li>Retorno de funções e o void</li>\n                      <li>O novato: Never</li>\n                      <li>Escopo, ao infinito e além</li>\n                      <li>Aproveitando o tear-off</li>\n                    </ol>\n                    <li>Na prática - Dart web</li>\n                    <ol type=\"a\">\n                      <li>Criando o projeto</li>\n                      <li>Dart e a web</li>\n                      <li>Iniciando o jogo e métodos</li>\n                    </ol>\n                    <li>Parâmetros</li>\n                    <ol type=\"a\">\n                      <li>Posicional e obrigatório</li>\n                      <li>Posicional e opcional</li>\n                      <li>Nomeado e opcional</li>\n                      <li>Nomeado e obrigatório</li>\n                      <li>Declarando as regras do jogo</li>\n                      <li>Manipulando o DOM do jogo</li>\n                    </ol>\n                    <li>Enums</li>\n                    <ol type=\"a\">\n                      <li>Definindo o vencedor da partida</li>\n                    </ol>\n                    <li>Typedef</li>\n                    <li>Adicionando interação ao jogo</li>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Cuidando dos erros</b></span></b>\n                  <ol type=\"i\">\n                    <li>Error versus Exception</li>\n                    <li>Lançando exceções</li>\n                    <ol type=\"a\">\n                      <li>Suas próprias exceptions</li>\n                    </ol>\n                    <li>Seus próprios errors? Lance um existente ou use um assert!</li>\n                    <ol type=\"a\">\n                      <li>Utilizando assert</li>\n                    </ol>\n                    <li>Capturando exceções</li>\n                    <ol type=\"a\">\n                      <li>Especifiando o tipo com on</li>\n                      <li>Garantindo execução com finally</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Entendendo as libraries</b></span></b>\n                  <ol type=\"i\">\n                    <li>Criando uma library</li>\n                    <li>Utilizando outras libraries</li>\n                    <ol type=\"a\">\n                      <li>Criando um alias</li>\n                      <li>Personalizando os recursos importados</li>\n                    </ol>\n                    <li>Privacidade em libraries</li>\n                    <li>Separando libraries em arquivos</li>\n                    <ol type=\"a\">\n                      <li>Devo separar todas as libraries em arquivos?</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Na prática - Packages</b></span></b>\n                  <ol type=\"i\">\n                    <li>Os packages</li>\n                    <li>Criando o package de logger</li>\n                    <ol type=\"a\">\n                      <li>Modificando o pubspec.yaml</li>\n                      <li>Organizando os arquivos existentes</li>\n                    </ol>\n                    <li>Exportando libraries</li>\n                    <ol type=\"a\">\n                      <li>Testando o package</li>\n                    </ol>\n                    <li>Adicionando linter para o código</li>\n                    <ol type=\"a\">\n                      <li>Utilizando regras de packages</li>\n                    </ol>\n                    <li>Import dinâmico de libraries</li>\n                    <ol type=\"a\">\n                      <li>Testando o package na web</li>\n                    </ol>\n                    <li>Documentando libraries</li>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Oriente seus objetos</b></span></b>\n                  <ol type=\"i\">\n                    <li>Classes e objetos</li>\n                    <li>Sobrescrita de operadores</li>\n                    <li>Construtores</li>\n                    <ol type=\"a\">\n                      <li>Construtores padrão</li>\n                      <li>Construtores nomeados</li>\n                      <li>Construtores constantes</li>\n                      <li>Construtores factory</li>\n                    </ol>\n                    <li>Relacionamento entre objetos</li>\n                    <ol type=\"a\">\n                      <li>Herança</li>\n                      <li>Polimorfismo</li>\n                      <li>Classes abstratas</li>\n                      <li>Interfaces</li>\n                      <li>Mixins</li>\n                      <li>Mixins a fundo</li>\n                      <li>Afinal, devo usar herança, interface ou mixin?</li>\n                    </ol>\n                    <li>As incríveis Extensions</li>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Generics&lt;T&gt; e as estruturas de dados</b></span></b>\n                  <ol type=\"i\">\n                    <li>O que é esse tal de generics?</li>\n                    <ol type=\"a\">\n                      <li>Restringindo um tipo</li>\n                      <li>Métodos genéricos</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>Estruturas de dados</li>\n                    <ol type=\"a\">\n                      <li>List</li>\n                    </ol>\n                    <li>A interface Iterable</li>\n                    <ol type=\"a\">\n                      <li>Set</li>\n                    </ol>\n                    <li>A interface Comparable</li>\n                    <ol type=\"a\">\n                      <li>Queue</li>\n                      <li>Map</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Concorrência</b></span></b>\n                  <ol type=\"i\">\n                    <li>Isolates</li>\n                    <li>Event Loop</li>\n                    <li>Síncrono versus assíncrono</li>\n                    <li>Futures</li>\n                    <ol type=\"a\">\n                      <li>Future encadeado</li>\n                      <li>Erros em uma cadeia assíncrona</li>\n                      <li>Future.sync</li>\n                      <li>Future.microtask</li>\n                      <li>Future.value</li>\n                      <li>Future.error</li>\n                      <li>Future.wait</li>\n                      <li>Future/any</li>\n                    </ol>\n                    <li>Async e await</li>\n                    <ol type=\"a\">\n                      <li>Um jeito síncrono de trabalhar com assíncrono?</li>\n                      <li>Tratando erros com async await</li>\n                    </ol>\n                    <li>Completer</li>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Na prática - Dart CLI</b></span></b>\n                  <ol type=\"i\">\n                    <li>API da Climatempo</li>\n                    <ol type=\"a\">\n                      <li>Criando o projeto</li>\n                    </ol>\n                    <li>Requisições com o package http</li>\n                    <li>Package convert e JSON</li>\n                    <li>Consumindo a API do Climatempo</li>\n                    <li>Tratando os argumentos de CLI</li>\n                    <li>Rodando um app CLI de qualquer lugar</li>\n                    <ol type=\"a\">\n                      <li>Compilando AOT</li>\n                      <li>Binários independentes</li>\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Stream é tão funcional...</b></span></b>\n                  <ol type=\"i\">\n                    <li>O que é uma Stream?</li>\n                    <li>Inscrição única versus broadcast</li>\n                    <li>StreamController</li>\n                    <ol type=\"i\">\n                      <li>Interface Sink</li>\n                      <li>StreamController versus StreamSink</li>\n                      <li>Estados do StreamController</li>\n                    </ol>\n                    <li>Stream e o await</li>\n                    <li>Operações em Streams</li>\n                    <ol type=\"i\">\n                      <li>Propriedades</li>\n                      <li>Métodos de busca</li>\n                      <li>Métodos de validação</li>\n                      <li>Métodos de validação</li>\n                      <li>Métodos utilitários</li>\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Um pouco mais sobre Streams</b></span></b>\n                  <ol type=\"i\">\n                    <li>Transformando uma Stream</li>\n                    <ol type=\"a\">\n                      <li>Implementando a interface StreamTransformer</li>\n                      <li>Construtor padrão do StreamTransformer</li>\n                      <li>Estendendo StreamTransformerBase</li>\n                      <li>Construtor nomeado fromHandlers</li>\n                      <li>Construtor nomeado fromBind</li>\n                    </ol>\n                    <li>Inscrição única versus broadcast, um pouco além</li>\n                    <ol type=\"i\">\n                      <li>Ciclo de vida</li>\n                      <li>Facilidade de uso</li>\n                      <li>Perda de eventos</li>\n                    </ol>\n                    <li>Geradores</li>\n                    <ol type=\"i\">\n                      <li>Geradores síncronos</li>\n                      <li>Geradores assíncronos</li>\n                    </ol>\n                    <li>Na prática - Server HTTP</li>\n                    <ol type=\"i\">\n                      <li>Server em Dart</li>\n                      <li>Funcionalidade de alertas</li>\n                      <li>Criando o Client</li>\n                    </ol>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Um pouco mais sobre Isolares e Zones</b></span></b>\n                  <ol type=\"i\">\n                    <li>Criando uam nova Isolate</li>\n                    <li>Comunicação unidirecional</li>\n                    <li>Comunicação bidirecional</li>\n                    <li>Controlando uma Isolate</li>\n                    <ol type=\"a\">\n                      <li>Cadastrando listeners</li>\n                    </ol>\n                    <li>Isolate através de uma URI</li>\n                    <li>Zones</li>\n                    <ol type=\"a\">\n                      <li>Hierarquia de zones</li>\n                      <li>Por que criar uma zone?</li>\n                    </ol>\n                    <li>Uma zone livre de erros</li>\n                    <ol type=\"a\">\n                      <li>Propagação de erros entre zones</li>\n                    </ol>\n                    <li>Valores locais</li>\n                    <li>Sobrescrevendo funcionalidades com ZoneSpecification</li>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                    <ol type=\"a\">\n                      <li>Até aqui</li>\n                    </ol>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Na prática - Gerando arquivos</b></span></b>\n                  <ol type=\"i\">\n                    <li>Manipulando arquivos em Dart</li>\n                    <ol type=\"a\">\n                      <li>Criando um diretório</li>\n                      <li>Criando e escrevendo em um arquivo</li>\n                      <li>Escrevendo em um arquivo sob demanda</li>\n                      <li>Lendo um arquivo</li>\n                      <li>Lendo um arquivo sob demanda</li>\n                    </ol>\n                    <li>Climatempo - Salvando consultas</li>\n                    <ol type=\"a\">\n                      <li>Criando o arquivo de cidades</li>\n                      <li>Criando o arquivo de clima</li>\n                    </ol>\n                    <li>Arquivo em isolates separadas</li>\n                    <li>Log de erros com zones</li>\n                    <li>Se liga aí</li>\n                    <li>É com você</li>\n                  </ol>\n                </li>\n                <li>\n                  <b><span><b>Até mais, e obrigado pelos peixes!</b></span></b>\n                  <ol type=\"i\">\n                    <li>Metadata</li>\n                    <li>Geração de código</li>\n                    <li>Testes unitários</li>\n                    <li>DevTools</li>\n                    <li>Interface para funções externas - FFI</li>\n                    <li>Shelf</li>\n                    <li>Explore o Flutter!</li>\n                    <li>Contribua para projetos Open Source</li>\n                    <li>Aprenda uma outra linguagem de programação</li>\n                  </ol>\n                </li>\n              </ol>\n            </S.ContainerTOC>\n          </S.Container>\n        </S.BoxTimeline>\n      </G.Boundary>\n    </G.Section>\n  );\n};\n\nexport default TableOfContentsFull;\n"
  },
  {
    "path": "website/src/components/table-of-contents/table-of-contents.js",
    "content": "import React from \"react\";\nimport { useTheme } from \"styled-components\";\nimport { StaticImage } from \"gatsby-plugin-image\";\nimport * as S from \"./styles\";\nimport * as G from \"../layout/styles\";\n\nconst TableOfContents = () => {\n  const theme = useTheme();\n\n  return (\n    <G.Section>\n      <G.Boundary>\n        <G.AlignTitle>\n          <G.SectionTitle>Sobre o conteúdo&nbsp;</G.SectionTitle>\n          <StaticImage\n            src=\"../../images/dolphin.png\"\n            alt=\"Golfinho\"\n            height={25}\n          />\n        </G.AlignTitle>\n        <br />\n\n        <S.BoxTimeline>\n          <S.Timeline maxWidth=\"900px\">\n            <S.ContainerLeftTimeline maxWidth=\"900px\">\n              <S.ContentTimeline>\n                <G.Paragraph>\n                  A primeira parte do livro busca introduzir a história da linguagem e as motivações por trás dela.\n                </G.Paragraph>\n                <G.Paragraph>\n                  Após isso vamos iniciar com o básico da linguagem. Veremos sobre os operadores e estruturas de \n                  controle existentes. Como funciona o sistema de tipagem escolhido e as mudanças originadas \n                  pela <i>null safety</i>.\n                </G.Paragraph>\n                <G.Paragraph>\n                  Além de explorar o mundo das funções, métodos, closures e todas essas diversas nomenclaturas.\n                </G.Paragraph>\n              </S.ContentTimeline>\n            </S.ContainerLeftTimeline>\n\n            <S.ContainerRightTimeline maxWidth=\"900px\">\n              <S.ContentTimeline>\n                <G.Paragraph>\n                  Na segunda parte, avançamos para outros conceitos fundamentais de programação e como Dart os aborda. \n                </G.Paragraph>\n                <G.Paragraph>\n                  Veremos sobre tratamento de erros e como criar <i>libraries</i> e <i>packages</i>, junto as suas \n                  particularidades.\n                </G.Paragraph>\n                <G.Paragraph>\n                  Em seguida abordaremos os conceitos de Orientação a Objetos, finalizando com <i>generics</i> e as estruturas\n                  de dados presentes na linguagem.\n                </G.Paragraph>\n              </S.ContentTimeline>\n            </S.ContainerRightTimeline>\n\n            <S.ContainerLeftTimeline maxWidth=\"900px\">\n              <S.ContentTimeline>\n                <G.Paragraph>\n                  Por fim, entraremos nos conceitos mais avançados e também essenciais para o dia a dia do desenvolvedor.\n                </G.Paragraph>\n                <G.Paragraph>\n                  Veremos sobre concorrência e os conceitos de programação assíncrona, além de entender a importância \n                  do <i>event loop</i> por trás disso tudo.\n                </G.Paragraph>\n                <G.Paragraph>\n                  Em seguida vamos conhecer o mundo das <i>streams</i> e como elas são úteis em várias situações.\n                </G.Paragraph>\n                <G.Paragraph>\n                  Também nos aprofundaremos no funcionamento das <i>isolates</i> e <i>zones</i>. Dois conceitos pouco\n                  explorados e conhecidos pelas pessoas que trabalham com a linguagem.\n                </G.Paragraph>\n                <G.Paragraph>\n                  Por fim, com um exemplo prático, aprenderemos a manipular arquivos utilizando todos os conceitos aprendidos.\n                </G.Paragraph>\n              </S.ContentTimeline>\n            </S.ContainerLeftTimeline>\n          </S.Timeline>\n        </S.BoxTimeline>\n\n        <br />\n\n        <G.Link\n          href=\"/table-of-contents\"\n          rel=\"noreferrer\"\n          textColor={theme.textColor}\n        >\n          Ver o sumário completo\n        </G.Link>\n      </G.Boundary>\n    </G.Section>\n  );\n};\n\nexport default TableOfContents;\n"
  },
  {
    "path": "website/src/pages/404.js",
    "content": "import * as React from \"react\";\nimport ErrorContent from \"../components/layout/error\";\nimport Layout from \"../components/layout/layout\";\n\nconst ErrorPage = () => {\n  return (\n    <Layout primary>\n      <title>O guia de Dart</title>\n      <ErrorContent />\n    </Layout>\n  );\n};\n\nexport default ErrorPage;\n"
  },
  {
    "path": "website/src/pages/index.js",
    "content": "import * as React from \"react\";\nimport Audience from \"../components/audience/audience\";\nimport Author from \"../components/author/author\";\nimport BookInfo from \"../components/book-info/book-info\";\nimport Github from \"../components/github/github\";\nimport Layout from \"../components/layout/layout\";\nimport TableOfContents from \"../components/table-of-contents/table-of-contents\";\n\nconst IndexPage = () => {\n  return (\n    <Layout>\n      <title>O guia de Dart</title>\n      <BookInfo />\n      <Audience />\n      <Author />\n      <TableOfContents />\n      <Github />\n    </Layout>\n  );\n};\n\nexport default IndexPage;\n"
  },
  {
    "path": "website/src/pages/table-of-contents.js",
    "content": "import * as React from \"react\";\nimport Layout from \"../components/layout/layout\";\nimport TableOfContentsFull from \"../components/table-of-contents/table-of-contents-full\";\n\nconst TableOfContentsPage = () => {\n  return (\n    <Layout primary>\n      <title>O guia de Dart</title>\n      <TableOfContentsFull />\n    </Layout>\n  );\n};\n\nexport default TableOfContentsPage;\n"
  }
]