{
    "version": "2.0.0",
    "name": "GreyScript",
    "scopeName": "source.src",
    "patterns": [
        {
            "include": "#string"
        },
        {
            "include": "#numeric"
        },
        {
            "include": "#comment"
        },
        {
            "include": "#constant"
        },
        {
            "include": "#keyword"
        },
        {
            "include": "#function"
        },
        {
            "include": "#type"
        },
        {
            "include": "#meta-typing"
        },
        {
            "include": "#general-functions"
        },
        {
            "include": "#type-methods"
        },
        {
            "patterns": [
                {
                    "include": "#variables"
                },
                {
                    "include": "#identifier"
                }
            ]
        }
    ],
    "repository": {
        "function": {
            "begin": "(?<=function\\()",
            "end": "\\)",
            "patterns": [
                {
                    "include": "#string"
                },
                {
                    "match": "([^=\\),]+)(=[^\\),\"]+)?",
                    "captures": {
                        "1": {
                            "patterns": [
                                {
                                    "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b",
                                    "name": "variable.parameter.greyscript"
                                }
                            ]
                        },
                        "2": {
                            "patterns": [
                                {
                                    "include": "#string"
                                },
                                {
                                    "include": "#numeric"
                                },
                                {
                                    "include": "#constant"
                                }
                            ]
                        }
                    }
                }
            ]
        },
        "meta-typing": {
            "patterns": [
                {
                    "match": "^\\((function)\\)([^(]+)\\(([^)]*)\\):([^\\n]+)",
                    "captures": {
                        "1": {
                            "name": "keyword.control.greyscript"
                        },
                        "2": {
                            "patterns": [
                                {
                                    "include": "#general-functions"
                                },
                                {
                                    "patterns": [
                                        {
                                            "include": "#variables"
                                        },
                                        {
                                            "include": "#identifier"
                                        }
                                    ]
                                }
                            ]
                        },
                        "3": {
                            "patterns": [
                                {
                                    "match": "([^:]+):([^=,]+)(\\=[^,]+)?",
                                    "captures": {
                                        "1": {
                                            "patterns": [
                                                {
                                                    "include": "#variables"
                                                },
                                                {
                                                    "include": "#identifier"
                                                }
                                            ]
                                        },
                                        "2": {
                                            "patterns": [
                                                {
                                                    "include": "#type-union"
                                                }
                                            ]
                                        },
                                        "3": {
                                            "patterns": [
                                                {
                                                    "include": "#string"
                                                },
                                                {
                                                    "include": "#numeric"
                                                },
                                                {
                                                    "include": "#constant"
                                                }
                                            ]
                                        }
                                    }
                                }
                            ]
                        },
                        "4": {
                            "patterns": [
                                {
                                    "include": "#type-union"
                                }
                            ]
                        }
                    }
                },
                {
                    "match": "^\\((literal)\\)([^:]+):([^\\n]+)",
                    "captures": {
                        "1": {
                            "name": "keyword.control.greyscript"
                        },
                        "2": {
                            "patterns": [
                                {
                                    "include": "#string"
                                },
                                {
                                    "include": "#numeric"
                                },
                                {
                                    "include": "#constant"
                                }
                            ]
                        },
                        "3": {
                            "patterns": [
                                {
                                    "include": "#pseudo-type"
                                }
                            ]
                        }
                    }
                },
                {
                    "match": "^\\((constant|expr|internal|var|unknown|map|list)\\)([^:]+):([^\\n]+)",
                    "captures": {
                        "1": {
                            "name": "keyword.control.greyscript"
                        },
                        "2": {
                            "patterns": [
                                {
                                    "include": "#variables"
                                },
                                {
                                    "include": "#identifier"
                                }
                            ]
                        },
                        "3": {
                            "patterns": [
                                {
                                    "include": "#type-union"
                                }
                            ]
                        }
                    }
                }
            ]
        },
        "type-union": {
            "patterns": [
                {
                    "match": "\\b(or)\\b",
                    "name": "keyword.control.logical.greyscript"
                },
                {
                    "include": "#constant"
                },
                {
                    "include": "#pseudo-type"
                }
            ]
        },
        "variables": {
            "patterns": [
                {
                    "name": "support.variable.greyscript",
                    "match": "\\b(params|locals|globals|outer)\\b"
                },
                {
                    "name": "variable.language.self.greyscript",
                    "match": "\\b(self)\\b"
                },
                {
                    "name": "variable.language.super.greyscript",
                    "match": "\\b(super)\\b"
                }
            ]
        },
        "identifier": {
            "patterns": [
                {
                    "name": "entity.other.attribute.greyscript",
                    "match": "(?<=[^.]\\.)\\b([a-zA-Z_][\\w]*)"
                },
                {
                    "name": "constant.other.greyscript",
                    "match": "\\b([A-Z_]+)\\b"
                },
                {
                    "name": "entity.name.type.greyscript",
                    "match": "\\b([A-Z][\\w]*)\\b"
                },
                {
                    "name": "variable.other.greyscript",
                    "match": "\\b([a-z_][\\w]*)\\b"
                }
            ]
        },
        "comment": {
            "patterns": [
                {
                    "name": "comment.line",
                    "begin": "//(?!(include|import))",
                    "end": "\\n"
                },
                {
                    "name": "comment.block",
                    "begin": "/\\*",
                    "end": "\\*/"
                }
            ]
        },
        "numeric": {
            "patterns": [
                {
                    "name": "constant.numeric",
                    "match": "(?<![\\w\\d.])\\d+(\\.\\d+)?([eE]-?\\d*)?"
                }
            ]
        },
        "string": {
            "name": "string.quoted.double.greyscript",
            "begin": "\"",
            "end": "\""
        },
        "keyword": {
            "patterns": [
                {
                    "name": "keyword.control.block.greyscript",
                    "match": "\\b(if|then|end|else|function|in|while|for|from)\\b"
                },
                {
                    "name": "keyword.control.statement.greyscript",
                    "match": "\\b(return|continue|break)\\b"
                },
                {
                    "name": "keyword.control.logical.greyscript",
                    "match": "\\b(and|or|isa)\\b"
                },
                {
                    "name": "keyword.control.unary.greyscript",
                    "match": "\\b(not|new)\\b"
                },
                {
                    "name": "keyword.control.notused.greyscript",
                    "match": "\\b(repeat)\\b"
                },
                {
                    "name": "keyword.control.greybel.greyscript",
                    "match": "#(include|import|envar|filename|line|inject)\\b"
                },
                {
                    "name": "keyword.control.greybel.greyscript",
                    "match": "#include\\s+type\\b"
                },
                {
                    "name": "keyword.control.greybel.greyscript",
                    "match": "#(if|else|endif)\\b"
                },
                {
                    "name": "keyword.control.greybel.greyscript",
                    "match": "//(include|import)\\b"
                },
                {
                    "name": "keyword.control.greybel.greyscript",
                    "match": "//include\\s+type\\b"
                },
                {
                    "name": "keyword.control.greybel.greyscript",
                    "match": "\\b(debugger)\\b"
                },
                {
                    "name": "keyword.operator.greyscript",
                    "match": "([<>=!]=|[+\\-*\\/^<>|\\&%]|<<|>>>?)"
                }
            ]
        },
        "constant": {
            "name": "constant.language.greyscript",
            "match": "\\b(true|false|null)\\b"
        },
        "type": {
            "name": "support.class.greyscript",
            "match": "\\b(list|map|number|string|funcRef)\\b"
        },
        "pseudo-type": {
            "match": "[a-zA-Z_][a-zA-Z0-9_]*(?:<[^<>]*(?:<[^<>]*>[^<>]*)*>)?",
            "name": "support.class.greyscript"
        },
        "general-functions": {
            "name": "support.function.greyscript",
            "match": "\\b(mail_login|parent_path|trim|hasIndex|typeof|get_router|get_switch|nslookup|print|clear_screen|active_user|home_dir|get_shell|indexes|values|indexOf|len|shuffle|val|lower|upper|sum|pop|pull|push|sort|remove|user_input|include_lib|import_code|exit|user_mail_address|user_bank_number|whois|wait|command_info|program_path|current_path|format_columns|current_date|is_lan_ip|is_valid_ip|bitwise|abs|acos|asin|atan|tan|cos|code|char|sin|floor|range|round|rnd|sign|sqrt|str|ceil|pi|launch|launch_path|slice|md5|hash|time|bitAnd|bitOr|bitXor|log|yield|get_custom_object|insert|to_int|join|split|reverse|replace|replace_regex|is_match|lastIndexOf|matches|get_ctf|check_upgrade|show|search|update|add_repo|del_repo|install|coin_price|show_history|amount_mined|get_coin|login_wallet|create_wallet|delete_coin|set_cycle_mining|get_cycle_mining|get_reward|set_reward|transaction|create_subwallet|get_subwallet|get_subwallets|set_address|get_address|get_mined_coins|get_ports|get_name|lan_ip|public_ip_pc|File|create_folder|is_network_active|touch|show_procs|network_devices|change_password|create_user|delete_user|create_group|delete_group|groups|close_program|wifi_networks|connect_wifi|connect_ethernet|network_gateway|active_net_card|aircrack|airmon|aireplay|decipher|smtp_user_list|get_description|get_template|player_success|get_creator_name|get_mail_content|chmod|copy|move|rename|path|is_folder|parent|name|allow_import|get_content|set_content|is_binary|has_permission|delete|get_folders|get_files|permissions|owner|set_owner|group|set_group|size|load|net_use|rshell_client|rshell_server|scan|scan_address|sniffer|overflow|version|lib_name|dump_lib|get_num_conn_gateway|get_num_portforward|get_num_users|is_any_active_user|is_root_active_user|device_ports|devices_lan_ip|bssid_name|essid_name|firewall_rules|kernel_version|local_ip|public_ip|used_ports|ping_port|port_info|install_service|start_service|stop_service|host_computer|start_terminal|build|connect_service|ping|scp|get_balance_subwallet|set_info|get_info|delete_subwallet|get_user|last_transaction|mining|check_password|wallet_username|list_coins|get_balance|buy_coin|sell_coin|get_pending_trade|cancel_pending_trade|get_global_offers|list_global_coins|show_nodes|reset_password|get_pin|delete_mail|fetch|read|send|port_number|is_closed|get_lan_ip|reset_password_coin|reset_ctf_password|get_coin_name|symlink|is_symlink|is_patched|debug_tools|payload|scan_debuglib|apply_patch|unit_testing|model|override_settings|set_alarm|camera_link_system|locate_vehicle|get_credentials_info|flood_connection|get_abs_path|cd|encrypt|decrypt|is_encrypted|reboot)\\b"
        },
        "type-methods": {
            "patterns": [
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(get_description|get_template|player_success|get_creator_name|get_mail_content)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(show|search|update|add_repo|del_repo|install|check_upgrade)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(get_ports|File|create_folder|is_network_active|touch|show_procs|network_devices|change_password|create_user|delete_user|create_group|delete_group|groups|close_program|wifi_networks|connect_wifi|connect_ethernet|network_gateway|active_net_card|get_name|reboot)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(aircrack|airmon|aireplay|decipher|smtp_user_list|encrypt|decrypt|is_encrypted)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(chmod|copy|move|rename|path|parent|name|get_content|set_content|is_binary|has_permission|delete|get_folders|get_files|permissions|owner|set_owner|group|set_group|size|meta_info|symlink|is_symlink)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(remove|push|pop|pull|shuffle|reverse|sum|hasIndex|indexOf|sort|join|indexes|len|values)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(remove|push|pop|pull|shuffle|sum|sum|hasIndex|indexOf|indexes|len|values)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(overflow|version|lib_name|debug_tools|is_patched)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(delete|fetch|read|send)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(load|net_use|rshell_client|rshell_server|scan|scan_address|sniffer)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(dump_lib|get_num_users|get_num_portforward|get_num_conn_gateway|is_any_active_user|is_root_active_user|flood_connection)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(port_number|is_closed|get_lan_ip)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(device_ports|devices_lan_ip|bssid_name|essid_name|firewall_rules|kernel_version|local_ip|public_ip|used_ports|ping_port|port_info)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(host_computer|start_terminal|build|connect_service|launch|ping|scp|masterkey|masterkey_direct|restore_network)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(remove|hasIndex|indexOf|lastIndexOf|split|replace|trim|indexes|code|len|lower|upper|val|values|to_int|is_match|matches)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(coin_price|show_history|amount_mined|get_coin|login_wallet|create_wallet|delete_coin|get_coin_name)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(install_service|start_service|stop_service)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(set_cycle_mining|get_cycle_mining|get_reward|set_reward|transaction|create_subwallet|get_subwallet|get_subwallets|set_address|get_address|get_mined_coins|reset_password)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(list_coins|get_balance|buy_coin|sell_coin|get_pending_trade|cancel_pending_trade|get_global_offers|list_global_coins|show_nodes|reset_password|get_pin)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(get_balance|set_info|get_info|delete|get_user|last_transaction|mining|check_password|wallet_username)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(camera_link_system|locate_vehicle|get_credentials_info)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(model|override_settings|set_alarm)\\b"
                },
                {
                    "name": "support.function.greyscript",
                    "match": "\\.(scan|apply_patch|unit_testing|payload)\\b"
                }
            ]
        }
    }
}
