{
  "case_sensitivity": "keys are compared case-folded",
  "conformance_vectors": [
    {
      "accepted": true,
      "keys": [
        "lib/label.typ"
      ]
    },
    {
      "accepted": true,
      "keys": [
        "assets/logo.png",
        "lib/nested/deep.typ"
      ]
    },
    {
      "accepted": true,
      "keys": [
        "main"
      ]
    },
    {
      "accepted": true,
      "keys": [
        "lib/main.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        ""
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "/etc/passwd"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "../etc/passwd"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "./lib/label.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "lib//label.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "lib/"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "lib/..."
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "lib/a b.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "lib/back\\slash.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "lib/label.typ\n"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "bad\nlib/label.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_template_path",
      "keys": [
        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      ]
    },
    {
      "accepted": true,
      "keys": [
        "main.typ"
      ]
    },
    {
      "accepted": true,
      "keys": [
        "Main.TYP/x.typ"
      ]
    },
    {
      "accepted": false,
      "code": "invalid_file_data",
      "keys": [
        "a/b.typ",
        "A/B.TYP"
      ],
      "rule": "case_collision"
    },
    {
      "accepted": false,
      "code": "invalid_file_data",
      "keys": [
        "lib",
        "LIB/x.typ"
      ],
      "rule": "ancestor_collision"
    }
  ],
  "key_pattern": "\\A(?=.{1,768}\\z)(?!\\.+(?:/|\\z))[A-Za-z0-9._-]{1,255}(?:/(?!\\.+(?:/|\\z))[A-Za-z0-9._-]{1,255})*\\z",
  "key_pattern_flavour": "pcre",
  "max_key_length": 768,
  "max_keys": 1024,
  "max_segment_length": 255,
  "min_key_length": 1,
  "min_segment_length": 1,
  "rules_version": 5,
  "segment_character_class": "[A-Za-z0-9._-]",
  "segments_may_not_be_only_dots": true,
  "set_rules": [
    {
      "description": "At most max_keys entries. Checked before any other whole-set rule, because those are O(keys x depth).",
      "error_code": "invalid_file_data",
      "id": "too_many_keys"
    },
    {
      "description": "No two keys whose case-folded forms are equal.",
      "error_code": "invalid_file_data",
      "id": "case_collision"
    },
    {
      "description": "No key whose case-folded form equals a case-folded POSIX ancestor of another key: one entry cannot be both a file and a directory.",
      "error_code": "invalid_file_data",
      "id": "ancestor_collision"
    }
  ]
}
