{
	"information_for_contributors": [
		"This file has been converted from https://github.com/Shopify/ruby-lsp/blob/master/vscode/grammars/ruby.cson.json",
		"If you want to provide a fix or improvement, please create a pull request against the original repository.",
		"Once accepted there, we are happy to receive an update request."
	],
	"version": "https://github.com/Shopify/ruby-lsp/commit/ba41f8b4f9677fb14c1ecbe15d73ebe12a0d3859",
	"name": "Ruby",
	"scopeName": "source.ruby",
	"patterns": [
		{
			"captures": {
				"1": {
					"name": "keyword.control.class.ruby"
				},
				"2": {
					"name": "entity.name.type.class.ruby"
				},
				"5": {
					"name": "punctuation.separator.namespace.ruby"
				},
				"7": {
					"name": "punctuation.separator.inheritance.ruby"
				},
				"8": {
					"name": "entity.other.inherited-class.ruby"
				},
				"11": {
					"name": "punctuation.separator.namespace.ruby"
				}
			},
			"comment": "class Namespace::ClassName < OtherNamespace::OtherClassName",
			"match": "\\b(class)\\s+(([a-zA-Z0-9_]+)((::)[a-zA-Z0-9_]+)*)\\s*((<)\\s*(([a-zA-Z0-9_]+)((::)[a-zA-Z0-9_]+)*))?",
			"name": "meta.class.ruby"
		},
		{
			"captures": {
				"1": {
					"name": "keyword.control.module.ruby"
				},
				"2": {
					"name": "entity.name.type.module.ruby"
				},
				"5": {
					"name": "punctuation.separator.namespace.ruby"
				}
			},
			"match": "\\b(module)\\s+(([a-zA-Z0-9_]+)((::)[a-zA-Z0-9_]+)*)",
			"name": "meta.module.ruby"
		},
		{
			"captures": {
				"1": {
					"name": "keyword.control.class.ruby"
				},
				"2": {
					"name": "punctuation.separator.inheritance.ruby"
				}
			},
			"match": "\\b(class)\\s*(<<)\\s*",
			"name": "meta.class.ruby"
		},
		{
			"comment": "else if is a common mistake carried over from other languages. it works if you put in a second end, but it’s never what you want.",
			"match": "(?<!\\.)\\belse(\\s)+if\\b",
			"name": "invalid.deprecated.ruby"
		},
		{
			"captures": {
				"1": {
					"name": "variable.ruby"
				},
				"2": {
					"name": "keyword.operator.assignment.augmented.ruby"
				}
			},
			"match": "^\\s*([_a-z][A-Za-z0-9_]*)\\s*((&&|\\|\\|)=)",
			"comment": "A local variable and/or assignment"
		},
		{
			"captures": {
				"1": {
					"name": "keyword.control.ruby"
				},
				"3": {
					"name": "variable.ruby"
				},
				"4": {
					"name": "keyword.operator.assignment.augmented.ruby"
				}
			},
			"match": "(?<!\\.)\\b(case|if|elsif|unless|until|while)\\b\\s*(\\()*?\\s*([_a-z][A-Za-z0-9_]*)\\s*((&&|\\|\\|)=)",
			"comment": "A local variable and/or assignment in a condition"
		},
		{
			"captures": {
				"1": {
					"name": "variable.ruby"
				},
				"2": {
					"name": "keyword.operator.assignment.augmented.ruby"
				}
			},
			"match": "^\\s*([_a-z][A-Za-z0-9_]*)\\s*((\\+|\\*|-|\\/|%|\\*\\*|&|\\||\\^|<<|>>)=)",
			"comment": "A local variable operation assignment (+=, -=, *=, /=)"
		},
		{
			"captures": {
				"1": {
					"name": "keyword.control.ruby"
				},
				"3": {
					"name": "variable.ruby"
				},
				"4": {
					"name": "keyword.operator.assignment.augmented.ruby"
				}
			},
			"match": "(?<!\\.)\\b(case|if|elsif|unless|until|while)\\b\\s*(\\()*?\\s*([_a-z][A-Za-z0-9_]*)\\s*((\\+|\\*|-|\\/|%|\\*\\*|&|\\||\\^|<<|>>)=)",
			"comment": "A local variable operation assignment in a condition"
		},
		{
			"captures": {
				"1": {
					"name": "variable.ruby"
				}
			},
			"match": "^\\s*([_a-z][A-Za-z0-9_]*)\\s*(?==[^=>])",
			"comment": "A local variable assignment"
		},
		{
			"captures": {
				"1": {
					"name": "keyword.control.ruby"
				},
				"3": {
					"name": "variable.ruby"
				}
			},
			"match": "(?<!\\.)\\b(case|if|elsif|unless|until|while)\\b\\s*(\\()*?\\s*([_a-z][A-Za-z0-9_]*)\\s*=[^=>]",
			"comment": "A local variable assignment in a condition"
		},
		{
			"captures": {
				"1": {
					"name": "punctuation.definition.constant.hashkey.ruby"
				}
			},
			"comment": "symbols as hash key (1.9 syntax)",
			"match": "(?>[a-zA-Z_]\\w*(?>[?!])?)(:)(?!:)",
			"name": "constant.language.symbol.hashkey.ruby"
		},
		{
			"captures": {
				"1": {
					"name": "punctuation.definition.constant.ruby"
				}
			},
			"comment": "symbols as hash key (1.8 syntax)",
			"match": "(?<!:)(:)(?>[a-zA-Z_]\\w*(?>[?!])?)(?=\\s*=>)",
			"name": "constant.language.symbol.hashkey.ruby"
		},
		{
			"comment": "everything being a reserved word, not a value and needing a 'end' is a..",
			"match": "(?<!\\.)\\b(BEGIN|begin|case|class|else|elsif|END|end|ensure|for|if|in|module|rescue|then|unless|until|when|while)\\b(?![?!])",
			"name": "keyword.control.ruby"
		},
		{
			"comment": "contextual smart pair support for block parameters",
			"match": "(?<!\\.)\\bdo\\b",
			"name": "keyword.control.start-block.ruby"
		},
		{
			"comment": "contextual smart pair support",
			"match": "(?<={)(\\s+)",
			"name": "meta.syntax.ruby.start-block"
		},
		{
			"match": "(?<!\\.)\\b(alias|alias_method|break|next|redo|retry|return|super|undef|yield)\\b(?![?!])|\\bdefined\\?|\\b(block_given|iterator)\\?",
			"name": "keyword.control.pseudo-method.ruby"
		},
		{
			"match": "\\bnil\\b(?![?!])",
			"name": "constant.language.nil.ruby"
		},
		{
			"match": "\\b(true|false)\\b(?![?!])",
			"name": "constant.language.boolean.ruby"
		},
		{
			"match": "\\b(__(FILE|LINE)__)\\b(?![?!])",
			"name": "variable.language.ruby"
		},
		{
			"match": "\\bself\\b(?![?!])",
			"name": "variable.language.self.ruby"
		},
		{
			"comment": " everything being a method but having a special function is a..",
			"match": "\\b(initialize|new|loop|include|extend|prepend|raise|fail|attr_reader|attr_writer|attr_accessor|attr|catch|throw|private|private_class_method|module_function|public|public_class_method|protected|refine|using)\\b(?![?!])",
			"name": "keyword.other.special-method.ruby"
		},
		{
			"begin": "\\b(?<!\\.|::)(require|require_relative)\\b(?![?!])",
			"captures": {
				"1": {
					"name": "keyword.other.special-method.ruby"
				}
			},
			"end": "$|(?=#|})",
			"name": "meta.require.ruby",
			"patterns": [
				{
					"include": "$self"
				}
			]
		},
		{
			"captures": {
				"1": {
					"name": "punctuation.definition.variable.ruby"
				}
			},
			"match": "(@)[a-zA-Z_]\\w*",
			"name": "variable.other.readwrite.instance.ruby"
		},
		{
			"captures": {
				"1": {
					"name": "punctuation.definition.variable.ruby"
				}
			},
			"match": "(@@)[a-zA-Z_]\\w*",
			"name": "variable.other.readwrite.class.ruby"
		},
		{
			"captures": {
				"1": {
					"name": "punctuation.definition.variable.ruby"
				}
			},
			"match": "(\\$)[a-zA-Z_]\\w*",
			"name": "variable.other.readwrite.global.ruby"
		},
		{
			"captures": {
				"1": {
					"name": "punctuation.definition.variable.ruby"
				}
			},
			"match": "(\\$)(!|@|&|`|'|\\+|\\d+|~|=|/|\\\\|,|;|\\.|<|>|_|\\*|\\$|\\?|:|\"|-[0adFiIlpv])",
			"name": "variable.other.readwrite.global.pre-defined.ruby"
		},
		{
			"begin": "\\b(ENV)\\[",
			"beginCaptures": {
				"1": {
					"name": "variable.other.constant.ruby"
				}
			},
			"end": "]",
			"name": "meta.environment-variable.ruby",
			"patterns": [
				{
					"include": "$self"
				}
			]
		},
		{
			"match": "\\b[A-Z]\\w*(?=((\\.|::)[A-Za-z]|\\[))",
			"name": "support.class.ruby"
		},
		{
			"match": "\\b((abort|at_exit|autoload|binding|callcc|caller|caller_locations|chomp|chop|eval|exec|exit|fork|format|gets|global_variables|gsub|lambda|load|local_variables|open|p|print|printf|proc|putc|puts|rand|readline|readlines|select|set_trace_func|sleep|spawn|sprintf|srand|sub|syscall|system|test|trace_var|trap|untrace_var|warn)\\b(?![?!])|autoload\\?|exit!)",
			"name": "support.function.kernel.ruby"
		},
		{
			"match": "\\b[_A-Z]\\w*\\b",
			"name": "variable.other.constant.ruby"
		},
		{
			"begin": "(->)\\(",
			"beginCaptures": {
				"1": {
					"name": "support.function.kernel.ruby"
				}
			},
			"comment": "Lambda parameters.",
			"end": "\\)",
			"patterns": [
				{
					"begin": "(?=[&*_a-zA-Z])",
					"end": "(?=[,)])",
					"patterns": [
						{
							"include": "#method_parameters"
						}
					]
				},
				{
					"include": "#method_parameters"
				}
			]
		},
		{
			"begin": "(?x)\n(?=def\\b)                          # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\s+\n(\n  (?>[a-zA-Z_]\\w*(?>\\.|::))?      # method prefix\n  (?>                               # method name\n    [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n    |\n    ===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n  )\n)\n\\s*(\\()",
			"beginCaptures": {
				"1": {
					"name": "keyword.control.def.ruby"
				},
				"2": {
					"name": "entity.name.function.ruby"
				},
				"3": {
					"name": "punctuation.definition.parameters.ruby"
				}
			},
			"comment": "The method pattern comes from the symbol pattern. See there for an explanation.",
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.parameters.ruby"
				}
			},
			"name": "meta.function.method.with-arguments.ruby",
			"patterns": [
				{
					"begin": "(?=[&*_a-zA-Z])",
					"end": "(?=[,)])",
					"patterns": [
						{
							"include": "#method_parameters"
						}
					]
				},
				{
					"include": "#method_parameters"
				}
			]
		},
		{
			"begin": "(?x)\n(?=def\\b)                          # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\s+\n(\n  (?>[a-zA-Z_]\\w*(?>\\.|::))?      # method prefix\n  (?>                               # method name\n    [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n    |\n    ===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n  )\n)\n[ \\t]\n(?=[ \\t]*[^\\s#;])                 # make sure the following is not comment",
			"beginCaptures": {
				"1": {
					"name": "keyword.control.def.ruby"
				},
				"2": {
					"name": "entity.name.function.ruby"
				}
			},
			"comment": "same as the previous rule, but without parentheses around the arguments",
			"end": "(?=;)|(?<=[\\w\\])}`'\"!?])(?=\\s*#|\\s*$)",
			"name": "meta.function.method.with-arguments.ruby",
			"patterns": [
				{
					"begin": "(?=[&*_a-zA-Z])",
					"end": "(?=,|;|\\s*#|\\s*$)",
					"patterns": [
						{
							"include": "#method_parameters"
						}
					]
				},
				{
					"include": "#method_parameters"
				}
			]
		},
		{
			"captures": {
				"1": {
					"name": "keyword.control.def.ruby"
				},
				"3": {
					"name": "entity.name.function.ruby"
				}
			},
			"comment": " the optional name is just to catch the def also without a method-name",
			"match": "(?x)\n(?=def\\b)                            # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\b\n(\n  \\s+\n  (\n    (?>[a-zA-Z_]\\w*(?>\\.|::))?      # method prefix\n    (?>                               # method name\n      [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n      |\n      ===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n    )\n  )\n)?",
			"name": "meta.function.method.without-arguments.ruby"
		},
		{
			"match": "(?x)\n\\b\n(\n  [\\d](?>_?\\d)*                             # 100_000\n  (\\.(?![^[:space:][:digit:]])(?>_?\\d)*)?   # fractional part\n  ([eE][-+]?\\d(?>_?\\d)*)?                   # 1.23e-4\n  |\n  0\n  (?:\n    [xX]\\h(?>_?\\h)*|\n    [oO]?[0-7](?>_?[0-7])*|\n    [bB][01](?>_?[01])*|\n    [dD]\\d(?>_?\\d)*\n  )                                           # A base indicator can only be used with an integer\n)\\b",
			"name": "constant.numeric.ruby"
		},
		{
			"begin": ":'",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.begin.ruby"
				}
			},
			"comment": "symbol literal with '' delimiter",
			"end": "'",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\['\\\\]",
					"name": "constant.character.escape.ruby"
				}
			]
		},
		{
			"begin": ":\"",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.symbol.begin.ruby"
				}
			},
			"comment": "symbol literal with \"\" delimiter",
			"end": "\"",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.symbol.end.ruby"
				}
			},
			"name": "constant.language.symbol.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"comment": "Needs higher precedence than regular expressions.",
			"match": "(?<!\\()/=",
			"name": "keyword.operator.assignment.augmented.ruby"
		},
		{
			"begin": "'",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"comment": "string literal with '' delimiter",
			"end": "'",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.single.ruby",
			"patterns": [
				{
					"match": "\\\\'|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				}
			]
		},
		{
			"begin": "\"",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"comment": "string literal with interpolation and \"\" delimiter",
			"end": "\"",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.double.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "(?<!\\.)`",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"comment": "execute string (allows for interpolation)",
			"end": "`",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "(?x)\n(?<![\\w)])((/))(?![?*+])(?!\\s*$)\n(?=\n  (?:\\\\/|[^/])*+          # Do NOT change the order\n  /[eimnosux]*\\s*\n  (?:\n    [)\\]}#.,?:]|\\|\\||&&|<=>|=>|==|=~|!~|!=|;|$|\n    if|else|elsif|then|do|end|unless|while|until|or|and\n  )\n)",
			"captures": {
				"1": {
					"name": "string.regexp.interpolated.ruby"
				},
				"2": {
					"name": "punctuation.section.regexp.ruby"
				}
			},
			"comment": "regular expression literal with interpolation",
			"contentName": "string.regexp.interpolated.ruby",
			"end": "((/[eimnosux]*))",
			"patterns": [
				{
					"include": "#regex_sub"
				}
			]
		},
		{
			"begin": "%r{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.regexp.begin.ruby"
				}
			},
			"end": "}[eimnosux]*",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.regexp.end.ruby"
				}
			},
			"name": "string.regexp.interpolated.ruby",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_curly_r"
				}
			]
		},
		{
			"begin": "%r\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.regexp.begin.ruby"
				}
			},
			"end": "][eimnosux]*",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.regexp.end.ruby"
				}
			},
			"name": "string.regexp.interpolated.ruby",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_brackets_r"
				}
			]
		},
		{
			"begin": "%r\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.regexp.begin.ruby"
				}
			},
			"end": "\\)[eimnosux]*",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.regexp.end.ruby"
				}
			},
			"name": "string.regexp.interpolated.ruby",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_parens_r"
				}
			]
		},
		{
			"begin": "%r<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.regexp.begin.ruby"
				}
			},
			"end": ">[eimnosux]*",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.regexp.end.ruby"
				}
			},
			"name": "string.regexp.interpolated.ruby",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_ltgt_r"
				}
			]
		},
		{
			"begin": "%r([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.regexp.begin.ruby"
				}
			},
			"end": "\\1[eimnosux]*",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.regexp.end.ruby"
				}
			},
			"name": "string.regexp.interpolated.ruby",
			"patterns": [
				{
					"include": "#regex_sub"
				}
			]
		},
		{
			"begin": "%I\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "]",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_brackets_i"
				}
			]
		},
		{
			"begin": "%I\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_parens_i"
				}
			]
		},
		{
			"begin": "%I<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": ">",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_ltgt_i"
				}
			]
		},
		{
			"begin": "%I{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "}",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_curly_i"
				}
			]
		},
		{
			"begin": "%I([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "%i\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "]",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\]|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_brackets"
				}
			]
		},
		{
			"begin": "%i\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\\\)|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_parens"
				}
			]
		},
		{
			"begin": "%i<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": ">",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\>|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_ltgt"
				}
			]
		},
		{
			"begin": "%i{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "}",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\}|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_curly"
				}
			]
		},
		{
			"begin": "%i([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"comment": "Cant be named because its not necessarily an escape.",
					"match": "\\\\."
				}
			]
		},
		{
			"begin": "%W\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "]",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_brackets_i"
				}
			]
		},
		{
			"begin": "%W\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_parens_i"
				}
			]
		},
		{
			"begin": "%W<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": ">",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_ltgt_i"
				}
			]
		},
		{
			"begin": "%W{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "}",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_curly_i"
				}
			]
		},
		{
			"begin": "%W([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "%w\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "]",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\]|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_brackets"
				}
			]
		},
		{
			"begin": "%w\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\\\)|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_parens"
				}
			]
		},
		{
			"begin": "%w<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": ">",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\>|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_ltgt"
				}
			]
		},
		{
			"begin": "%w{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "}",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\}|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_curly"
				}
			]
		},
		{
			"begin": "%w([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.section.array.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.section.array.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"comment": "Cant be named because its not necessarily an escape.",
					"match": "\\\\."
				}
			]
		},
		{
			"begin": "%[Qx]?\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_parens_i"
				}
			]
		},
		{
			"begin": "%[Qx]?\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "]",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_brackets_i"
				}
			]
		},
		{
			"begin": "%[Qx]?{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "}",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_curly_i"
				}
			]
		},
		{
			"begin": "%[Qx]?<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": ">",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_ltgt_i"
				}
			]
		},
		{
			"begin": "%[Qx]([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "%([^\\w\\s=])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.interpolated.ruby",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "%q\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\\\)|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_parens"
				}
			]
		},
		{
			"begin": "%q<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": ">",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\>|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_ltgt"
				}
			]
		},
		{
			"begin": "%q\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "]",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\]|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_brackets"
				}
			]
		},
		{
			"begin": "%q{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "}",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"match": "\\\\}|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_curly"
				}
			]
		},
		{
			"begin": "%q([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.ruby"
				}
			},
			"name": "string.quoted.other.ruby",
			"patterns": [
				{
					"comment": "Cant be named because its not necessarily an escape.",
					"match": "\\\\."
				}
			]
		},
		{
			"begin": "%s\\(",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.begin.ruby"
				}
			},
			"end": "\\)",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\\\)|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_parens"
				}
			]
		},
		{
			"begin": "%s<",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.begin.ruby"
				}
			},
			"end": ">",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\>|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_ltgt"
				}
			]
		},
		{
			"begin": "%s\\[",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.begin.ruby"
				}
			},
			"end": "]",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\]|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_brackets"
				}
			]
		},
		{
			"begin": "%s{",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.begin.ruby"
				}
			},
			"end": "}",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"match": "\\\\}|\\\\\\\\",
					"name": "constant.character.escape.ruby"
				},
				{
					"include": "#nest_curly"
				}
			]
		},
		{
			"begin": "%s([^\\w])",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.begin.ruby"
				}
			},
			"end": "\\1",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.symbol.end.ruby"
				}
			},
			"name": "constant.language.symbol.ruby",
			"patterns": [
				{
					"comment": "Cant be named because its not necessarily an escape.",
					"match": "\\\\."
				}
			]
		},
		{
			"captures": {
				"1": {
					"name": "punctuation.definition.constant.ruby"
				}
			},
			"comment": "symbols",
			"match": "(?x)\n(?<!:)(:)\n(?>\n  [$a-zA-Z_]\\w*(?>[?!]|=(?![>=]))?\n  |\n  ===?|<=>|>[>=]?|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n  |\n  @@?[a-zA-Z_]\\w*\n)",
			"name": "constant.language.symbol.ruby"
		},
		{
			"begin": "^=begin",
			"captures": {
				"0": {
					"name": "punctuation.definition.comment.ruby"
				}
			},
			"comment": "multiline comments",
			"end": "^=end",
			"name": "comment.block.documentation.ruby"
		},
		{
			"include": "#yard"
		},
		{
			"begin": "(^[ \\t]+)?(?=#)",
			"beginCaptures": {
				"1": {
					"name": "punctuation.whitespace.comment.leading.ruby"
				}
			},
			"end": "(?!\\G)",
			"patterns": [
				{
					"begin": "#",
					"beginCaptures": {
						"0": {
							"name": "punctuation.definition.comment.ruby"
						}
					},
					"end": "\\n",
					"name": "comment.line.number-sign.ruby"
				}
			]
		},
		{
			"comment": "\n\t\t\tmatches questionmark-letters.\n\n\t\t\texamples (1st alternation = hex):\n\t\t\t?\\x1     ?\\x61\n\n\t\t\texamples (2nd alternation = octal):\n\t\t\t?\\0      ?\\07     ?\\017\n\n\t\t\texamples (3rd alternation = escaped):\n\t\t\t?\\n      ?\\b\n\n\t\t\texamples (4th alternation = meta-ctrl):\n\t\t\t?\\C-a    ?\\M-a    ?\\C-\\M-\\C-\\M-a\n\n\t\t\texamples (4th alternation = normal):\n\t\t\t?a       ?A       ?0 \n\t\t\t?*       ?\"       ?( \n\t\t\t?.       ?#\n\t\t\t\n\t\t\t\n\t\t\tthe negative lookbehind prevents against matching\n\t\t\tp(42.tainted?)\n\t\t\t",
			"match": "(?<!\\w)\\?(\\\\(x\\h{1,2}(?!\\h)\\b|0[0-7]{0,2}(?![0-7])\\b|[^x0MC])|(\\\\[MC]-)+\\w|[^\\s\\\\])",
			"name": "constant.numeric.ruby"
		},
		{
			"begin": "^__END__\\n",
			"captures": {
				"0": {
					"name": "string.unquoted.program-block.ruby"
				}
			},
			"comment": "__END__ marker",
			"contentName": "text.plain",
			"end": "(?=not)impossible",
			"patterns": [
				{
					"begin": "(?=<?xml|<(?i:html\\b)|!DOCTYPE (?i:html\\b))",
					"end": "(?=not)impossible",
					"name": "text.html.embedded.ruby",
					"patterns": [
						{
							"include": "text.html.basic"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)HTML)\\b\\1))",
			"comment": "Heredoc with embedded HTML",
			"end": "^\\s*((?:[_\\w]+_|)HTML)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.html",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)HTML)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "text.html",
					"while": "^(?!\\s*((?:[_\\w]+_|)HTML)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "text.html.basic"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)HAML)\\b\\1))",
			"comment": "Heredoc with embedded HAML",
			"end": "^\\s*((?:[_\\w]+_|)HAML)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.haml",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)HAML)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "text.haml",
					"while": "^(?!\\s*((?:[_\\w]+_|)HAML)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "text.haml"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)XML)\\b\\1))",
			"comment": "Heredoc with embedded XML",
			"end": "^\\s*((?:[_\\w]+_|)XML)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.xml",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)XML)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "text.xml",
					"while": "^(?!\\s*((?:[_\\w]+_|)XML)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "text.xml"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)SQL)\\b\\1))",
			"comment": "Heredoc with embedded SQL",
			"end": "^\\s*((?:[_\\w]+_|)SQL)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.sql",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)SQL)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.sql",
					"while": "^(?!\\s*((?:[_\\w]+_|)SQL)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.sql"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:GRAPHQL|GQL))\\b\\1))",
			"comment": "Heredoc with embedded GraphQL",
			"end": "^\\s*((?:[_\\w]+_|)(?:GRAPHQL|GQL))$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.graphql",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:GRAPHQL|GQL))\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.graphql",
					"while": "^(?!\\s*((?:[_\\w]+_|)(?:GRAPHQL|GQL))\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.graphql"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)CSS)\\b\\1))",
			"comment": "Heredoc with embedded CSS",
			"end": "^\\s*((?:[_\\w]+_|)CSS)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.css",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)CSS)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.css",
					"while": "^(?!\\s*((?:[_\\w]+_|)CSS)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.css"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)CPP)\\b\\1))",
			"comment": "Heredoc with embedded C++",
			"end": "^\\s*((?:[_\\w]+_|)CPP)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.cpp",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)CPP)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.cpp",
					"while": "^(?!\\s*((?:[_\\w]+_|)CPP)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.cpp"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)C)\\b\\1))",
			"comment": "Heredoc with embedded C",
			"end": "^\\s*((?:[_\\w]+_|)C)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.c",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)C)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.c",
					"while": "^(?!\\s*((?:[_\\w]+_|)C)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.c"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1))",
			"comment": "Heredoc with embedded Javascript",
			"end": "^\\s*((?:[_\\w]+_|)(?:JS|JAVASCRIPT))$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.js",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.js",
					"while": "^(?!\\s*((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.js"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)JQUERY)\\b\\1))",
			"comment": "Heredoc with embedded jQuery Javascript",
			"end": "^\\s*((?:[_\\w]+_|)JQUERY)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.js.jquery",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)JQUERY)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.js.jquery",
					"while": "^(?!\\s*((?:[_\\w]+_|)JQUERY)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.js.jquery"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1))",
			"comment": "Heredoc with embedded Shell",
			"end": "^\\s*((?:[_\\w]+_|)(?:SH|SHELL))$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.shell",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.shell",
					"while": "^(?!\\s*((?:[_\\w]+_|)(?:SH|SHELL))\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.shell"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)LUA)\\b\\1))",
			"comment": "Heredoc with embedded Lua",
			"end": "^\\s*((?:[_\\w]+_|)LUA)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.lua",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)LUA)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.lua",
					"while": "^(?!\\s*((?:[_\\w]+_|)LUA)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.lua"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)RUBY)\\b\\1))",
			"comment": "Heredoc with embedded Ruby",
			"end": "^\\s*((?:[_\\w]+_|)RUBY)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.ruby",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)RUBY)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.ruby",
					"while": "^(?!\\s*((?:[_\\w]+_|)RUBY)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.ruby"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:YAML|YML))\\b\\1))",
			"comment": "Heredoc with embedded YAML",
			"end": "^\\s*((?:[_\\w]+_|)(?:YAML|YML))$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.yaml",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)(?:YAML|YML))\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "source.yaml",
					"while": "^(?!\\s*((?:[_\\w]+_|)(?:YAML|YML))\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "source.yaml"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?=(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)SLIM)\\b\\1))",
			"comment": "Heredoc with embedded Slim",
			"end": "^\\s*((?:[_\\w]+_|)SLIM)$\\n?",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"name": "meta.embedded.block.slim",
			"patterns": [
				{
					"begin": "(?><<[-~]?([\"'`]?)((?:[_\\w]+_|)SLIM)\\b\\1)",
					"beginCaptures": {
						"0": {
							"name": "string.definition.begin.ruby"
						}
					},
					"contentName": "text.slim",
					"while": "^(?!\\s*((?:[_\\w]+_|)SLIM)\\s*$)",
					"patterns": [
						{
							"include": "#heredoc"
						},
						{
							"include": "#interpolated_ruby"
						},
						{
							"include": "text.slim"
						},
						{
							"include": "#escaped_char"
						}
					]
				}
			]
		},
		{
			"begin": "(?>=\\s*<<([\"'`]?)(\\w+)\\1)",
			"beginCaptures": {
				"0": {
					"name": "string.definition.begin.ruby"
				}
			},
			"end": "^\\2$",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"contentName": "string.unquoted.heredoc.ruby",
			"patterns": [
				{
					"include": "#heredoc"
				},
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "(?>((<<[-~]?([\"'`]?)(\\w+)\\3,\\s?)*<<[-~]?([\"'`]?)(\\w+)\\5))(.*)",
			"beginCaptures": {
				"1": {
					"name": "string.definition.begin.ruby"
				},
				"7": {
					"patterns": [
						{
							"include": "source.ruby"
						}
					]
				}
			},
			"comment": "heredoc with multiple inputs and indented terminator",
			"end": "^\\s*\\6$",
			"endCaptures": {
				"0": {
					"name": "string.definition.end.ruby"
				}
			},
			"contentName": "string.unquoted.heredoc.ruby",
			"patterns": [
				{
					"include": "#heredoc"
				},
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				}
			]
		},
		{
			"begin": "(?<={|{\\s+|[^A-Za-z0-9_:@$]do|^do|[^A-Za-z0-9_:@$]do\\s+|^do\\s+)(\\|)",
			"name": "meta.block.parameters.ruby",
			"captures": {
				"1": {
					"name": "punctuation.separator.variable.ruby"
				}
			},
			"end": "(?<!\\|)(\\|)(?!\\|)",
			"patterns": [
				{
					"begin": "(?![\\s,|(])",
					"end": "(?=,|\\|\\s*)",
					"patterns": [
						{
							"match": "\\G((?:&|\\*\\*?)?)([a-zA-Z_][\\w_]*)",
							"captures": {
								"1": {
									"name": "storage.type.variable.ruby"
								},
								"2": {
									"name": "variable.other.block.ruby"
								}
							}
						}
					]
				},
				{
					"match": ",",
					"name": "punctuation.separator.variable.ruby"
				}
			]
		},
		{
			"match": "=>",
			"name": "punctuation.separator.key-value"
		},
		{
			"match": "->",
			"name": "support.function.kernel.ruby"
		},
		{
			"match": "<<=|%=|&{1,2}=|\\*=|\\*\\*=|\\+=|-=|\\^=|\\|{1,2}=|<<",
			"name": "keyword.operator.assignment.augmented.ruby"
		},
		{
			"match": "<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?<=[ \\t])\\?",
			"name": "keyword.operator.comparison.ruby"
		},
		{
			"match": "(?<!\\.)\\b(and|not|or)\\b(?![?!])",
			"name": "keyword.operator.logical.ruby"
		},
		{
			"match": "(?<=^|[ \\t!])!|&&|\\|\\||\\^",
			"name": "keyword.operator.logical.ruby"
		},
		{
			"comment": "Safe navigation operator",
			"match": "(&\\.)\\s*(?![A-Z])",
			"captures": {
				"1": {
					"name": "keyword.operator.logical.ruby"
				}
			}
		},
		{
			"match": "(%|&|\\*\\*|\\*|\\+|-|/)",
			"name": "keyword.operator.arithmetic.ruby"
		},
		{
			"match": "=",
			"name": "keyword.operator.assignment.ruby"
		},
		{
			"match": "\\||~|>>",
			"name": "keyword.operator.other.ruby"
		},
		{
			"match": ";",
			"name": "punctuation.separator.statement.ruby"
		},
		{
			"match": ",",
			"name": "punctuation.separator.object.ruby"
		},
		{
			"comment": "Mark as namespace separator if double colons followed by capital letter",
			"match": "(::)\\s*(?=[A-Z])",
			"captures": {
				"1": {
					"name": "punctuation.separator.namespace.ruby"
				}
			}
		},
		{
			"comment": "Mark as method separator if double colons not followed by capital letter",
			"match": "(\\.|::)\\s*(?![A-Z])",
			"captures": {
				"1": {
					"name": "punctuation.separator.method.ruby"
				}
			}
		},
		{
			"comment": "Must come after method and constant separators to prefer double colons",
			"match": ":",
			"name": "punctuation.separator.other.ruby"
		},
		{
			"match": "{",
			"name": "punctuation.section.scope.begin.ruby"
		},
		{
			"match": "}",
			"name": "punctuation.section.scope.end.ruby"
		},
		{
			"match": "\\[",
			"name": "punctuation.section.array.begin.ruby"
		},
		{
			"match": "]",
			"name": "punctuation.section.array.end.ruby"
		},
		{
			"match": "\\(|\\)",
			"name": "punctuation.section.function.ruby"
		},
		{
			"name": "meta.function-call.ruby",
			"begin": "(?<=[^\\.]\\.|::)(?=[a-zA-Z][a-zA-Z0-9_!?]*[^a-zA-Z0-9_!?])",
			"end": "(?<=[a-zA-Z0-9_!?])(?=[^a-zA-Z0-9_!?])",
			"patterns": [
				{
					"name": "entity.name.function.ruby",
					"match": "([a-zA-Z][a-zA-Z0-9_!?]*)(?=[^a-zA-Z0-9_!?])"
				}
			]
		},
		{
			"begin": "([a-zA-Z]\\w*[!?]?)(\\()",
			"beginCaptures": {
				"1": {
					"name": "entity.name.function.ruby"
				},
				"2": {
					"name": "punctuation.section.function.ruby"
				}
			},
			"end": "(\\))",
			"endCaptures": {
				"1": {
					"name": "punctuation.section.function.ruby"
				}
			},
			"name": "meta.function-call.ruby",
			"patterns": [
				{
					"include": "$self"
				}
			]
		}
	],
	"repository": {
		"method_parameters": {
			"patterns": [
				{
					"include": "#parens"
				},
				{
					"include": "#braces"
				},
				{
					"include": "#brackets"
				},
				{
					"include": "#params"
				},
				{
					"include": "$self"
				}
			],
			"repository": {
				"params": {
					"captures": {
						"1": {
							"name": "storage.type.variable.ruby"
						},
						"2": {
							"name": "constant.other.symbol.hashkey.parameter.function.ruby"
						},
						"3": {
							"name": "punctuation.definition.constant.ruby"
						},
						"4": {
							"name": "variable.parameter.function.ruby"
						}
					},
					"match": "\\G(&|\\*\\*?)?(?:([_a-zA-Z]\\w*[?!]?(:))|([_a-zA-Z]\\w*))"
				},
				"braces": {
					"begin": "\\{",
					"beginCaptures": {
						"0": {
							"name": "punctuation.section.scope.begin.ruby"
						}
					},
					"end": "\\}",
					"endCaptures": {
						"0": {
							"name": "punctuation.section.scope.end.ruby"
						}
					},
					"patterns": [
						{
							"include": "#parens"
						},
						{
							"include": "#braces"
						},
						{
							"include": "#brackets"
						},
						{
							"include": "$self"
						}
					]
				},
				"brackets": {
					"begin": "\\[",
					"beginCaptures": {
						"0": {
							"name": "punctuation.section.array.begin.ruby"
						}
					},
					"end": "\\]",
					"endCaptures": {
						"0": {
							"name": "punctuation.section.array.end.ruby"
						}
					},
					"patterns": [
						{
							"include": "#parens"
						},
						{
							"include": "#braces"
						},
						{
							"include": "#brackets"
						},
						{
							"include": "$self"
						}
					]
				},
				"parens": {
					"begin": "\\(",
					"beginCaptures": {
						"0": {
							"name": "punctuation.section.function.begin.ruby"
						}
					},
					"end": "\\)",
					"endCaptures": {
						"0": {
							"name": "punctuation.section.function.end.ruby"
						}
					},
					"patterns": [
						{
							"include": "#parens"
						},
						{
							"include": "#braces"
						},
						{
							"include": "#brackets"
						},
						{
							"include": "$self"
						}
					]
				}
			}
		},
		"escaped_char": {
			"match": "\\\\(?:[0-7]{1,3}|x[\\da-fA-F]{1,2}|.)",
			"name": "constant.character.escape.ruby"
		},
		"heredoc": {
			"begin": "^<<[-~]?\\w+",
			"end": "$",
			"patterns": [
				{
					"include": "$self"
				}
			]
		},
		"interpolated_ruby": {
			"patterns": [
				{
					"begin": "#{",
					"beginCaptures": {
						"0": {
							"name": "punctuation.section.embedded.begin.ruby"
						}
					},
					"contentName": "source.ruby",
					"end": "}",
					"endCaptures": {
						"0": {
							"name": "punctuation.section.embedded.end.ruby"
						}
					},
					"name": "meta.embedded.line.ruby",
					"patterns": [
						{
							"include": "#nest_curly_and_self"
						},
						{
							"include": "$self"
						}
					]
				},
				{
					"captures": {
						"1": {
							"name": "punctuation.definition.variable.ruby"
						}
					},
					"match": "(#@)[a-zA-Z_]\\w*",
					"name": "variable.other.readwrite.instance.ruby"
				},
				{
					"captures": {
						"1": {
							"name": "punctuation.definition.variable.ruby"
						}
					},
					"match": "(#@@)[a-zA-Z_]\\w*",
					"name": "variable.other.readwrite.class.ruby"
				},
				{
					"captures": {
						"1": {
							"name": "punctuation.definition.variable.ruby"
						}
					},
					"match": "(#\\$)[a-zA-Z_]\\w*",
					"name": "variable.other.readwrite.global.ruby"
				}
			]
		},
		"nest_brackets": {
			"begin": "\\[",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "]",
			"patterns": [
				{
					"include": "#nest_brackets"
				}
			]
		},
		"nest_brackets_i": {
			"begin": "\\[",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "]",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_brackets_i"
				}
			]
		},
		"nest_brackets_r": {
			"begin": "\\[",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "]",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_brackets_r"
				}
			]
		},
		"nest_curly": {
			"begin": "{",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "}",
			"patterns": [
				{
					"include": "#nest_curly"
				}
			]
		},
		"nest_curly_and_self": {
			"patterns": [
				{
					"begin": "{",
					"captures": {
						"0": {
							"name": "punctuation.section.scope.ruby"
						}
					},
					"end": "}",
					"patterns": [
						{
							"include": "#nest_curly_and_self"
						}
					]
				},
				{
					"include": "$self"
				}
			]
		},
		"nest_curly_i": {
			"begin": "{",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "}",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_curly_i"
				}
			]
		},
		"nest_curly_r": {
			"begin": "{",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "}",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_curly_r"
				}
			]
		},
		"nest_ltgt": {
			"begin": "<",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": ">",
			"patterns": [
				{
					"include": "#nest_ltgt"
				}
			]
		},
		"nest_ltgt_i": {
			"begin": "<",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": ">",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_ltgt_i"
				}
			]
		},
		"nest_ltgt_r": {
			"begin": "<",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": ">",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_ltgt_r"
				}
			]
		},
		"nest_parens": {
			"begin": "\\(",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "\\)",
			"patterns": [
				{
					"include": "#nest_parens"
				}
			]
		},
		"nest_parens_i": {
			"begin": "\\(",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "\\)",
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"include": "#nest_parens_i"
				}
			]
		},
		"nest_parens_r": {
			"begin": "\\(",
			"captures": {
				"0": {
					"name": "punctuation.section.scope.ruby"
				}
			},
			"end": "\\)",
			"patterns": [
				{
					"include": "#regex_sub"
				},
				{
					"include": "#nest_parens_r"
				}
			]
		},
		"regex_sub": {
			"patterns": [
				{
					"include": "#interpolated_ruby"
				},
				{
					"include": "#escaped_char"
				},
				{
					"captures": {
						"1": {
							"name": "punctuation.definition.arbitrary-repetition.ruby"
						},
						"3": {
							"name": "punctuation.definition.arbitrary-repetition.ruby"
						}
					},
					"match": "({)\\d+(,\\d+)?(})",
					"name": "string.regexp.arbitrary-repetition.ruby"
				},
				{
					"begin": "\\[(?:\\^?])?",
					"captures": {
						"0": {
							"name": "punctuation.definition.character-class.ruby"
						}
					},
					"end": "]",
					"name": "string.regexp.character-class.ruby",
					"patterns": [
						{
							"include": "#escaped_char"
						}
					]
				},
				{
					"begin": "\\(\\?#",
					"beginCaptures": {
						"0": {
							"name": "punctuation.definition.comment.begin.ruby"
						}
					},
					"end": "\\)",
					"endCaptures": {
						"0": {
							"name": "punctuation.definition.comment.end.ruby"
						}
					},
					"name": "comment.line.number-sign.ruby",
					"patterns": [
						{
							"include": "#escaped_char"
						}
					]
				},
				{
					"begin": "\\(",
					"captures": {
						"0": {
							"name": "punctuation.definition.group.ruby"
						}
					},
					"end": "\\)",
					"name": "string.regexp.group.ruby",
					"patterns": [
						{
							"include": "#regex_sub"
						}
					]
				},
				{
					"begin": "(?<=^|\\s)(#)\\s(?=[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$)",
					"beginCaptures": {
						"1": {
							"name": "punctuation.definition.comment.ruby"
						}
					},
					"comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.",
					"end": "$\\n?",
					"endCaptures": {
						"0": {
							"name": "punctuation.definition.comment.ruby"
						}
					},
					"name": "comment.line.number-sign.ruby"
				}
			]
		},
		"yard": {
			"patterns": [
				{
					"include": "#yard_comment"
				},
				{
					"include": "#yard_param_types"
				},
				{
					"include": "#yard_option"
				},
				{
					"include": "#yard_tag"
				},
				{
					"include": "#yard_types"
				},
				{
					"include": "#yard_directive"
				},
				{
					"include": "#yard_see"
				},
				{
					"include": "#yard_macro_attribute"
				}
			]
		},
		"yard_see": {
			"comment": "separate rule for @see because name could contain url",
			"begin": "^(\\s*)(#)(\\s*)(@)(see)(?=\\s)(\\s+(.+?))?(?=\\s|$)",
			"beginCaptures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				},
				"7": {
					"name": "comment.line.parameter.yard.ruby"
				}
			},
			"end": "^(?!\\s*#\\3\\s{2,}|\\s*#\\s*$)",
			"contentName": "comment.line.string.yard.ruby",
			"name": "comment.line.number-sign.ruby",
			"patterns": [
				{
					"include": "#yard"
				},
				{
					"include": "#yard_continuation"
				}
			]
		},
		"yard_macro_attribute": {
			"comment": "separate rule for attribute and macro tags because name goes after []",
			"begin": "^(\\s*)(#)(\\s*)(@!)(attribute|macro)(\\s+((\\[).+(])))?(?=\\s)(\\s+([a-z_]\\w*:?))?",
			"beginCaptures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				},
				"7": {
					"name": "comment.line.type.yard.ruby"
				},
				"8": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"9": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"11": {
					"name": "comment.line.parameter.yard.ruby"
				}
			},
			"end": "^(?!\\s*#\\3\\s{2,}|\\s*#\\s*$)",
			"contentName": "comment.line.string.yard.ruby",
			"name": "comment.line.number-sign.ruby",
			"patterns": [
				{
					"include": "#yard"
				},
				{
					"include": "#yard_continuation"
				}
			]
		},
		"yard_comment": {
			"comment": "For YARD tags that follow the tag-comment pattern",
			"begin": "^(\\s*)(#)(\\s*)(@)(abstract|api|author|deprecated|example|macro|note|overload|since|todo|version)(?=\\s|$)",
			"beginCaptures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				}
			},
			"end": "^(?!\\s*#\\3\\s{2,}|\\s*#\\s*$)",
			"contentName": "comment.line.string.yard.ruby",
			"name": "comment.line.number-sign.ruby",
			"patterns": [
				{
					"include": "#yard"
				},
				{
					"include": "#yard_continuation"
				}
			]
		},
		"yard_param_types": {
			"comment": "For YARD tags that follow the tag-name-types-description or tag-types-name-description pattern",
			"begin": "^(\\s*)(#)(\\s*)(@)(attr|attr_reader|attr_writer|yieldparam|param)(?=\\s)(?>\\s+(?>([a-z_]\\w*:?)|((\\[).+(]))))?(?>\\s+(?>((\\[).+(]))|([a-z_]\\w*:?)))?",
			"beginCaptures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				},
				"6": {
					"name": "comment.line.parameter.yard.ruby"
				},
				"7": {
					"name": "comment.line.type.yard.ruby"
				},
				"8": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"9": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"10": {
					"name": "comment.line.type.yard.ruby"
				},
				"11": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"12": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"13": {
					"name": "comment.line.parameter.yard.ruby"
				}
			},
			"end": "^(?!\\s*#\\3\\s{2,}|\\s*#\\s*$)",
			"contentName": "comment.line.string.yard.ruby",
			"name": "comment.line.number-sign.ruby",
			"patterns": [
				{
					"include": "#yard"
				},
				{
					"include": "#yard_continuation"
				}
			]
		},
		"yard_option": {
			"comment": "For YARD option tag that follow the tag-name-types-key-(value)-description pattern",
			"begin": "^(\\s*)(#)(\\s*)(@)(option)(?=\\s)(?>\\s+([a-z_]\\w*:?))?(?>\\s+((\\[).+(])))?(?>\\s+((\\S*)))?(?>\\s+((\\().+(\\))))?",
			"beginCaptures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				},
				"6": {
					"name": "comment.line.parameter.yard.ruby"
				},
				"7": {
					"name": "comment.line.type.yard.ruby"
				},
				"8": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"9": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"10": {
					"name": "comment.line.keyword.yard.ruby"
				},
				"11": {
					"name": "comment.line.hashkey.yard.ruby"
				},
				"12": {
					"name": "comment.line.defaultvalue.yard.ruby"
				},
				"13": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"14": {
					"name": "comment.line.punctuation.yard.ruby"
				}
			},
			"end": "^(?!\\s*#\\3\\s{2,}|\\s*#\\s*$)",
			"contentName": "comment.line.string.yard.ruby",
			"name": "comment.line.number-sign.ruby",
			"patterns": [
				{
					"include": "#yard"
				},
				{
					"include": "#yard_continuation"
				}
			]
		},
		"yard_tag": {
			"comment": "For YARD tags that are just the tag",
			"match": "^(\\s*)(#)(\\s*)(@)(private)$",
			"captures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				}
			},
			"name": "comment.line.number-sign.ruby"
		},
		"yard_types": {
			"comment": "For YARD tags that follow the tag-types-comment pattern",
			"begin": "^(\\s*)(#)(\\s*)(@)(raise|return|yield(?:return)?)(?=\\s)(\\s+((\\[).+(])))?",
			"beginCaptures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				},
				"7": {
					"name": "comment.line.type.yard.ruby"
				},
				"8": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"9": {
					"name": "comment.line.punctuation.yard.ruby"
				}
			},
			"end": "^(?!\\s*#\\3\\s{2,}|\\s*#\\s*$)",
			"contentName": "comment.line.string.yard.ruby",
			"name": "comment.line.number-sign.ruby",
			"patterns": [
				{
					"include": "#yard"
				},
				{
					"include": "#yard_continuation"
				}
			]
		},
		"yard_directive": {
			"comment": "For YARD directives",
			"begin": "^(\\s*)(#)(\\s*)(@!)(endgroup|group|method|parse|scope|visibility)(\\s+((\\[).+(])))?(?=\\s)",
			"beginCaptures": {
				"2": {
					"name": "punctuation.definition.comment.ruby"
				},
				"4": {
					"name": "comment.line.keyword.punctuation.yard.ruby"
				},
				"5": {
					"name": "comment.line.keyword.yard.ruby"
				},
				"7": {
					"name": "comment.line.type.yard.ruby"
				},
				"8": {
					"name": "comment.line.punctuation.yard.ruby"
				},
				"9": {
					"name": "comment.line.punctuation.yard.ruby"
				}
			},
			"end": "^(?!\\s*#\\3\\s{2,}|\\s*#\\s*$)",
			"contentName": "comment.line.string.yard.ruby",
			"name": "comment.line.number-sign.ruby",
			"patterns": [
				{
					"include": "#yard"
				},
				{
					"include": "#yard_continuation"
				}
			]
		},
		"yard_continuation": {
			"match": "^\\s*#",
			"name": "punctuation.definition.comment.ruby"
		}
	}
}