Task: workarena.servicenow.filter-user-list
Goal: Create a filter for the user list to extract all entries where:
    - "Web service access only" is "false" and 
    - "Source" is "" and 
    - "Time format" is "hh:mm:ss (12 hour)" and 
    - "Internal Integration User" is "false"
Task configuration: {'table_name': 'sys_user', 'filter_kind': 'AND', 'filter_len': 4, 'filter_columns': ['web_service_access_only', 'source', 'time_format', 'internal_integration_user'], 'filter_values': ['false', '', 'hh:mm:ss (12 hour)', 'false'], 'filter_operators': ['is', 'is', 'is', 'is'], 'columns': {'active': {'base_type': 'boolean', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'false', 'dependent_on_field': '', 'element': 'active', 'filterable': True, 'hint': 'Inactive users do not show in user choice lists', 'internal_type': 'boolean', 'label': 'Active', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'active', 'read_only': False, 'type': 'boolean'}, 'avatar': {'attributes': 'pdf_cell_type=image', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'avatar', 'filterable': True, 'hint': '', 'internal_type': 'user_image', 'label': 'Avatar', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'avatar', 'read_only': True, 'type': 'user_image'}, 'building': {'attributes': 'encode_utf8=false', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'building', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Building', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'building', 'read_only': False, 'reference': 'cmn_building', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'calendar_integration': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 1, 'choices': {'': '-- None --', '1': 'Outlook'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'calendar_integration', 'filterable': True, 'hint': '', 'internal_type': 'integer', 'label': 'Calendar integration', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'calendar_integration', 'read_only': False, 'type': 'choice'}, 'city': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'city', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'City', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'city', 'read_only': False, 'type': 'string'}, 'company': {'attributes': 'encode_utf8=false', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'company', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Company', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'company', 'read_only': False, 'reference': 'core_company', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'cost_center': {'attributes': 'encode_utf8=false', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'cost_center', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Cost center', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'cost_center', 'read_only': False, 'reference': 'cmn_cost_center', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'country': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 3, 'choices': {'BR': 'Brazil', 'CN': 'China', 'DE': 'Germany', 'ES': 'Spain', 'FR': 'France', 'GB': 'United Kingdom', 'IT': 'Italy', 'JP': 'Japan', 'US': 'United States'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'country', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Country code', 'mandatory': False, 'max_length': 3, 'max_unit': 'days', 'name': 'country', 'read_only': False, 'type': 'choice'}, 'date_format': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 1, 'choices': {'': 'System (yyyy-MM-dd)', 'MM-dd-yyyy': 'MM-dd-yyyy', 'dd-MM-yyyy': 'dd-MM-yyyy', 'dd.MM.yyyy': 'dd.MM.yyyy', 'dd/MM/yyyy': 'dd/MM/yyyy', 'yyyy-MM-dd': 'yyyy-MM-dd'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'date_format', 'filterable': True, 'hint': 'Display dates with this format (blank means system default)', 'internal_type': 'string', 'label': 'Date format', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'date_format', 'read_only': False, 'type': 'choice'}, 'default_perspective': {'attributes': 'encode_utf8=false', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'default_perspective', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Default perspective', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'default_perspective', 'read_only': False, 'reference': 'sys_perspective', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'department': {'attributes': 'encode_utf8=false', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': 'company', 'element': 'department', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Department', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'department', 'read_only': False, 'reference': 'cmn_department', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'email': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'email', 'filterable': True, 'hint': '', 'internal_type': 'email', 'label': 'Email', 'mandatory': False, 'max_length': 100, 'max_unit': 'days', 'name': 'email', 'read_only': False, 'type': 'email'}, 'employee_number': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'employee_number', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Employee number', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'employee_number', 'read_only': False, 'type': 'string'}, 'enable_multifactor_authn': {'base_type': 'boolean', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'false', 'dependent_on_field': '', 'element': 'enable_multifactor_authn', 'filterable': True, 'hint': '', 'internal_type': 'boolean', 'label': 'Enable Multifactor Authentication', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'enable_multifactor_authn', 'read_only': False, 'type': 'boolean'}, 'failed_attempts': {'base_type': 'integer', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'failed_attempts', 'filterable': True, 'hint': '', 'internal_type': 'integer', 'label': 'Failed login attempts', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'failed_attempts', 'read_only': False, 'type': 'integer'}, 'first_name': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'first_name', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'First name', 'mandatory': False, 'max_length': 50, 'max_unit': 'days', 'name': 'first_name', 'read_only': False, 'type': 'string'}, 'gender': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 1, 'choices': {'': '-- None --', 'Female': 'Female', 'Male': 'Male', 'Not Specified': 'Not Specified'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'gender', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Gender', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'gender', 'read_only': False, 'type': 'choice'}, 'home_phone': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'home_phone', 'filterable': True, 'hint': '', 'internal_type': 'ph_number', 'label': 'Home phone', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'home_phone', 'read_only': False, 'type': 'ph_number'}, 'internal_integration_user': {'base_type': 'boolean', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'false', 'dependent_on_field': '', 'element': 'internal_integration_user', 'filterable': True, 'hint': '', 'internal_type': 'boolean', 'label': 'Internal Integration User', 'mandatory': False, 'max_length': 1, 'max_unit': 'days', 'name': 'internal_integration_user', 'read_only': False, 'type': 'boolean'}, 'introduction': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 1, 'choices': {'': '-- None --', 'Dr.': 'Dr.', 'Mr.': 'Mr.', 'Mrs.': 'Mrs.', 'Ms.': 'Ms.'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'introduction', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Prefix', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'introduction', 'read_only': False, 'type': 'choice'}, 'last_login': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'date', 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'last_login', 'filterable': True, 'hint': '', 'internal_type': 'glide_date', 'label': 'Last login', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'last_login', 'read_only': False, 'type': 'glide_date'}, 'last_login_time': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'datetime', 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'last_login_time', 'filterable': True, 'hint': '', 'internal_type': 'glide_date_time', 'label': 'Last login time', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'last_login_time', 'read_only': False, 'type': 'glide_date_time'}, 'last_name': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'last_name', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Last name', 'mandatory': False, 'max_length': 50, 'max_unit': 'days', 'name': 'last_name', 'read_only': False, 'type': 'string'}, 'ldap_server': {'attributes': 'encode_utf8=false,no_text_index=true', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'ldap_server', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'LDAP server', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'ldap_server', 'read_only': False, 'reference': 'ldap_server_config', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'location': {'attributes': 'encode_utf8=false,tree_picker=true', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': 'company', 'element': 'location', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Location', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'location', 'read_only': False, 'reference': 'cmn_location', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'locked_out': {'base_type': 'boolean', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'false', 'dependent_on_field': '', 'element': 'locked_out', 'filterable': True, 'hint': 'When checked, user cannot login', 'internal_type': 'boolean', 'label': 'Locked out', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'locked_out', 'read_only': False, 'type': 'boolean'}, 'manager': {'attributes': 'encode_utf8=false,no_auto_map=true', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'manager', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Manager', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'manager', 'read_only': False, 'reference': 'sys_user', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': ['email'], 'ref_ac_columns_search': 'true', 'ref_ac_display_value': True, 'ref_auto_completer': 'AJAXTableCompleter'}, 'reference_display_field': 'name', 'type': 'reference'}, 'middle_name': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'middle_name', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Middle name', 'mandatory': False, 'max_length': 50, 'max_unit': 'days', 'name': 'middle_name', 'read_only': False, 'type': 'string'}, 'mobile_phone': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'mobile_phone', 'filterable': True, 'hint': '', 'internal_type': 'ph_number', 'label': 'Mobile phone', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'mobile_phone', 'read_only': False, 'type': 'ph_number'}, 'name': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'name', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Name', 'mandatory': False, 'max_length': 151, 'max_unit': 'days', 'name': 'name', 'read_only': False, 'type': 'string'}, 'notification': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 3, 'choices': {'1': 'Disable', '2': 'Enable'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'notification', 'filterable': True, 'hint': 'Enable or disable notifications for this user ie. email, SMS etc', 'internal_type': 'integer', 'label': 'Notification', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'notification', 'read_only': False, 'type': 'choice'}, 'password_needs_reset': {'base_type': 'boolean', 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'false', 'dependent_on_field': '', 'element': 'password_needs_reset', 'filterable': True, 'hint': 'User will be prompted to change password at next login', 'internal_type': 'boolean', 'label': 'Password needs reset', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'password_needs_reset', 'read_only': False, 'type': 'boolean'}, 'phone': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'phone', 'filterable': True, 'hint': '', 'internal_type': 'ph_number', 'label': 'Business phone', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'phone', 'read_only': False, 'type': 'ph_number'}, 'photo': {'attributes': 'pdf_cell_type=image', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'photo', 'filterable': True, 'hint': '', 'internal_type': 'user_image', 'label': 'Photo', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'photo', 'read_only': False, 'type': 'user_image'}, 'preferred_language': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 1, 'choices': {'': '-- None --', 'en': 'English'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'preferred_language', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Language', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'preferred_language', 'read_only': False, 'type': 'choice'}, 'roles': {'attributes': 'record_watcher_blacklist=true', 'base_type': 'string', 'canmatch': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'roles', 'filterable': True, 'hint': '', 'internal_type': 'user_roles', 'label': 'Roles', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'roles', 'read_only': False, 'type': 'user_roles'}, 'schedule': {'attributes': 'encode_utf8=false,ref_contributions=schedule_show', 'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'schedule', 'filterable': True, 'hint': '', 'internal_type': 'reference', 'label': 'Schedule', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'schedule', 'read_only': False, 'reference': 'cmn_schedule', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'reference'}, 'source': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'source', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Source', 'mandatory': False, 'max_length': 255, 'max_unit': 'days', 'name': 'source', 'read_only': False, 'type': 'string'}, 'state': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'state', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'State / Province', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'state', 'read_only': False, 'type': 'string'}, 'street': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'street', 'filterable': True, 'hint': '', 'internal_type': 'multi_two_lines', 'label': 'Street', 'mandatory': False, 'max_length': 255, 'max_unit': 'days', 'name': 'street', 'read_only': False, 'type': 'multi_two_lines'}, 'sys_class_name': {'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 3, 'choices': {'sys_user': 'User'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'sys_class_name', 'filterable': True, 'hint': '', 'internal_type': 'sys_class_name', 'label': 'Class', 'mandatory': False, 'max_length': 80, 'max_unit': 'days', 'name': 'sys_class_name', 'read_only': False, 'type': 'choice'}, 'sys_created_by': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'sys_created_by', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Created by', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'sys_created_by', 'read_only': False, 'type': 'string'}, 'sys_created_on': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'datetime', 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'sys_created_on', 'filterable': True, 'hint': '', 'internal_type': 'glide_date_time', 'label': 'Created', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'sys_created_on', 'read_only': False, 'type': 'glide_date_time'}, 'sys_domain': {'base_type': 'GUID', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'global', 'dependent_on_field': '', 'element': 'sys_domain', 'filterable': True, 'hint': 'Domain to which the user belongs', 'internal_type': 'domain_id', 'label': 'Domain', 'mandatory': False, 'max_length': 32, 'max_unit': 'days', 'name': 'sys_domain', 'read_only': False, 'reference': 'sys_user_group', 'reference_attributes': {'display_field': 'name', 'ref_ac_columns': [], 'ref_ac_columns_search': '', 'ref_ac_display_value': True, 'ref_auto_completer': ''}, 'reference_display_field': 'name', 'type': 'domain_id'}, 'sys_domain_path': {'attributes': 'case_sensitive=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'sys_domain_path', 'filterable': True, 'hint': '', 'internal_type': 'domain_path', 'label': 'Domain Path', 'mandatory': False, 'max_length': 255, 'max_unit': 'days', 'name': 'sys_domain_path', 'read_only': False, 'type': 'domain_path'}, 'sys_mod_count': {'base_type': 'integer', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'sys_mod_count', 'filterable': True, 'hint': '', 'internal_type': 'integer', 'label': 'Updates', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'sys_mod_count', 'read_only': False, 'type': 'integer'}, 'sys_tags': {'attributes': 'can_group=true,no_audit=true,serializer=com.glide.script.OmittedElementXMLSerializer', 'base_type': 'string', 'cangroup': True, 'column_type': 'tag', 'default': '', 'filterable': True, 'hint': '', 'internal_type': 'related_tags', 'label': 'Tags', 'mandatory': False, 'max_length': 0, 'max_unit': 'days', 'name': 'sys_tags', 'read_only': True, 'type': 'related_tags'}, 'sys_updated_by': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'sys_updated_by', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Updated by', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'sys_updated_by', 'read_only': False, 'type': 'string'}, 'sys_updated_on': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'datetime', 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'sys_updated_on', 'filterable': True, 'hint': '', 'internal_type': 'glide_date_time', 'label': 'Updated', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'sys_updated_on', 'read_only': False, 'type': 'glide_date_time'}, 'time_format': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 1, 'choices': {'': 'System (HH:mm:ss)', 'HH.mm.ss': 'hh.mm.ss (24 hour)', 'HH:mm:ss': 'hh:mm:ss (24 hour)', 'hh.mm.ss a': 'hh.mm.ss (12 hour)', 'hh:mm:ss a': 'hh:mm:ss (12 hour)'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'time_format', 'filterable': True, 'hint': 'Display times with this format (blank means system default)', 'internal_type': 'string', 'label': 'Time format', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'time_format', 'read_only': False, 'type': 'choice'}, 'time_zone': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'choice_type': 1, 'choices': {'': 'System (America/Los_Angeles)', 'Canada/Atlantic': 'Canada/Atlantic', 'Canada/Central': 'Canada/Central', 'Canada/Eastern': 'Canada/Eastern', 'Canada/Mountain': 'Canada/Mountain', 'Canada/Pacific': 'Canada/Pacific', 'Europe/Amsterdam': 'Europe/Amsterdam', 'Europe/Berlin': 'Europe/Berlin', 'Europe/Brussels': 'Europe/Brussels', 'Europe/Copenhagen': 'Europe/Copenhagen', 'Europe/Dublin': 'Europe/Dublin', 'Europe/London': 'Europe/London', 'Europe/Madrid': 'Europe/Madrid', 'Europe/Paris': 'Europe/Paris', 'Europe/Rome': 'Europe/Rome', 'Europe/Stockholm': 'Europe/Stockholm', 'Europe/Zurich': 'Europe/Zurich', 'GMT': 'GMT', 'Hongkong': 'Hongkong', 'US/Arizona': 'US/Arizona', 'US/Central': 'US/Central', 'US/Eastern': 'US/Eastern', 'US/Hawaii': 'US/Hawaii', 'US/Mountain': 'US/Mountain', 'US/Pacific': 'US/Pacific'}, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'time_zone', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Time zone', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'time_zone', 'read_only': False, 'type': 'choice'}, 'title': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'title', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Title', 'mandatory': False, 'max_length': 60, 'max_unit': 'days', 'name': 'title', 'read_only': False, 'type': 'string'}, 'user_name': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'user_name', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'User ID', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'user_name', 'read_only': False, 'type': 'string'}, 'user_password': {'base_type': 'string', 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'user_password', 'filterable': True, 'hint': '', 'internal_type': 'password', 'label': 'Password', 'mandatory': False, 'max_length': 100, 'max_unit': 'days', 'name': 'user_password', 'read_only': False, 'type': 'password'}, 'vip': {'base_type': 'boolean', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'false', 'dependent_on_field': '', 'element': 'vip', 'filterable': True, 'hint': '', 'internal_type': 'boolean', 'label': 'VIP', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'vip', 'read_only': False, 'type': 'boolean'}, 'web_service_access_only': {'base_type': 'boolean', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': 'false', 'dependent_on_field': '', 'element': 'web_service_access_only', 'filterable': True, 'hint': 'Prevent user from accessing UI, and require a SOAP role to make API protocol calls (such as SOAP and WSDL requests)', 'internal_type': 'boolean', 'label': 'Web service access only', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'web_service_access_only', 'read_only': False, 'type': 'boolean'}, 'zip': {'attributes': 'edge_encryption_enabled=true', 'base_type': 'string', 'cangroup': True, 'canmatch': True, 'cansort': True, 'column_type': 'element', 'default': '', 'dependent_on_field': '', 'element': 'zip', 'filterable': True, 'hint': '', 'internal_type': 'string', 'label': 'Zip / Postal code', 'mandatory': False, 'max_length': 40, 'max_unit': 'days', 'name': 'zip', 'read_only': False, 'type': 'string'}}}

Validation code:
import json
import os
import re
import urllib.parse as parse
from typing import Any, Dict, List, Tuple

import requests


def validate(messages: List[Dict[str, str]], config: Dict[str, Any]) -> int:
    """
    Validate a ServiceNow-style filter encoded in the 'sysparm_query' of the first URL
    found in the content of the LAST message.

    Config schema (example keys; provide what you need):
      {
        # URL check (optional; if present, enforce)
        "expected_url_prefix": "https://instance.service-now.com/now/nav/ui/classic/...",  # optional
        "expected_url_suffix": "/nav_to.do?uri=...",                                        # optional

        # Filter expectations
        "filter_kind": "AND" or "OR",
        "filter_len": 2,
        "filter_columns": ["priority", "assigned_to"],
        "filter_values": ["High", "Jane Doe"],  # display values after expansion

        # Column metadata for value expansion (optional, but needed for refs/choices)
        "columns": {
          "assigned_to": {
            "type": "reference",
            "reference_display_map": {  # sys_id -> display_value
              "6816f79cc0a8016400b98a06818d57c7": "Jane Doe"
            }
          },
          "priority": {
            "type": "choice",
            "choices": {"1": "Critical", "2": "High", "": "-- None --"}
          }
        },

        # Operators (optional; defaults provided)
        "operators": {
          "EQUALS": "=",
          "ISEMPTY": "ISEMPTY",
          "EMPTYSTRING": "EMPTYSTRING",
          "NOT_EQUALS": "!=",
          "STARTSWITH": "STARTSWITH"
        }
      }

    Returns:
      (score, passed, message, meta)
        score: 1 or 0
    """

    # Define constants
    OPERATOR_EQUALS = "="
    OPERATOR_NOT_EQUALS = "!="
    OPERATOR_STARTSWITH = "STARTSWITH"
    OPERATOR_LIKE = "LIKE"
    OPERATOR_CONTAINS = "CONTAINS"
    OPERATOR_ISEMPTY = "ISEMPTY"
    OPERATOR_EMPTYSTRING = "EMPTYSTRING"

    # check whether we have the necessary information to validate
    if (
        not "table_name" in config
        or not "filter_kind" in config
        or not "filter_len" in config
        or not "filter_columns" in config
        or not "filter_values" in config
    ):
        raise ValueError(
            "Target must contain 'table_name', 'filter_kind', 'filter_len', 'filter_columns', and 'filter_values'"
        )

    # check whether we have messages
    if not messages:
        raise ValueError("Messages must not be empty")

    # --- Step 1: Extract last message content ---
    content = messages[-1].get("content", "")

    # --- Step 2: Extract all URLs — markdown links first, then bare URLs ---
    expected_table = config["table_name"]
    urls = []
    for md in re.finditer(r"\[.*?\]\((https?://[^)]+)\)", content):
        urls.append(md.group(1))
    for bare in re.finditer(r"https?://\S+", content):
        candidate = bare.group(0).rstrip(")].,")
        if candidate not in urls:
            urls.append(candidate)
    if not urls:
        return 0

    # --- Step 3: Pick the URL that contains the expected table name, fall back to first ---
    raw_url = urls[0]
    for u in urls:
        if f"{expected_table}_list.do" in parse.unquote(u):
            raw_url = u
            break
    page_url = parse.unquote(raw_url)

    # --- Step 4: Parse query params — handle both direct and nav_to.do?uri=... formats ---
    parsed = parse.urlparse(page_url)
    page_qs = parse.parse_qs(parsed.query)

    # If URL is nav_to.do?uri=..., extract the inner URI and parse it
    if "uri" in page_qs:
        inner_url = parse.unquote(page_qs["uri"][0])
        inner_parsed = parse.urlparse(inner_url if "://" in inner_url else "http://x/" + inner_url)
        page_qs = parse.parse_qs(inner_parsed.query)
        page_url = inner_url  # use inner URL for table name extraction

    if "sysparm_query" not in page_qs:
        return 0
    page_sysparam_query = page_qs["sysparm_query"][0]

    if not page_sysparam_query:
        return 0

    # get table name from url
    table_match = re.search(r"(\w+)_list\.do", page_url)
    if not table_match:
        return 0
    table_name = table_match.group(1)
    if table_name != config["table_name"]:
        return 0

    # Strip trailing ^EQ (query terminator, not an operator)
    page_sysparam_query = page_sysparam_query.removesuffix("^EQ")

    # Normalize empty-field operators to = (e.g. fieldISEMPTY -> field=)
    page_sysparam_query = page_sysparam_query.replace("ISEMPTY", "=")
    page_sysparam_query = page_sysparam_query.replace("EMPTYSTRING", "=")

    # Normalize NQ to OR, EQ to plain AND separator
    page_sysparam_query = page_sysparam_query.replace("^NQ", "^OR")
    page_sysparam_query = page_sysparam_query.replace("^EQ", "^")

    # Determine AND/OR kind
    # LIMITATION: we only support AND and OR, not mixed
    if "^OR" in page_sysparam_query:
        current_kind = "OR"
        current_sep = "^OR"
    else:
        current_kind = "AND"
        current_sep = "^"

    # validate filter kind
    if current_kind != config.get("filter_kind"):
        return 0

    parts = page_sysparam_query.split(current_sep)
    parts = [p for p in parts if p]

    # validate filter length
    expected_len = int(config.get("filter_len"))
    if len(parts) != expected_len:
        return 0

    # Parse column names, operators, and values
    current_columns, current_values, current_operators = [], [], []

    for predicate in parts:
        pred = predicate.strip()

        if OPERATOR_EMPTYSTRING in pred:
            current_columns.append(pred.replace(OPERATOR_EMPTYSTRING, "").strip())
            current_operators.append("=")
            current_values.append("")
        elif OPERATOR_ISEMPTY in pred:
            current_columns.append(pred.replace(OPERATOR_ISEMPTY, "").strip())
            current_operators.append("=")
            current_values.append("")
        elif OPERATOR_NOT_EQUALS in pred or OPERATOR_STARTSWITH in pred:
            # Unsupported operators
            return 0
        elif OPERATOR_CONTAINS in pred:
            col, val = pred.split(OPERATOR_CONTAINS, 1)
            current_columns.append(col.strip())
            current_operators.append("=")
            current_values.append(val.strip())
        elif OPERATOR_LIKE in pred:
            col, val = pred.split(OPERATOR_LIKE, 1)
            current_columns.append(col.strip())
            current_operators.append("=")
            current_values.append(val.strip())
        elif OPERATOR_EQUALS in pred:
            col, val = pred.split(OPERATOR_EQUALS, 1)
            current_columns.append(col.strip())
            current_operators.append("=")
            current_values.append(val.strip())
        else:
            # Unsupported operators
            return 0

    # Validate columns
    expected_columns = config.get("filter_columns", [])
    if set(current_columns) != set(expected_columns):
        return 0

    # Value expansion for reference/choice columns (if metadata provided)
    col_meta = config.get("columns", {})
    # Detect homogeneous multi-row filter on same column
    is_homogeneous = len(set(current_columns)) < len(current_columns)
    if is_homogeneous and len(set(current_columns)) != 1:
        return 0

    for i, (col, val) in enumerate(zip(current_columns, current_values)):
        meta = col_meta.get(col, {})
        col_type = meta.get("type", "string")

        if col_type == "reference" and val != "":
            ref_map = meta.get("reference_display_map", {})
            if ref_map:
                # Use pre-computed map if available
                display = ref_map.get(val, val)
            else:
                # Query the instance to resolve sys_id -> display value
                ref_table = meta.get("reference")
                ref_field = meta.get("reference_attributes", {}).get("display_field")
                if ref_table and ref_field:
                    response = requests.request(
                        method="GET",
                        url=os.getenv("SERVICENOW_INSTANCE_URL", "").rstrip("/") + f"/api/now/table/{ref_table}",
                        headers={
                            "Content-Type": "application/json",
                            "Accept": "application/json",
                            **json.loads(os.getenv("SERVICENOW_EXTRA_HTTP_HEADERS", "{}")),
                        },
                        params={
                            "sysparm_query": f"sys_id={val}",
                            "sysparm_fields": ref_field,
                            "sysparm_display_value": "all",
                        },
                    )
                    response.raise_for_status()
                    result = response.json().get("result", [])
                    if result:
                        field_val = result[0].get(ref_field, {})
                        if isinstance(field_val, dict) and "display_value" in field_val:
                            display = field_val["display_value"]
                        else:
                            display = field_val
                    else:
                        display = val  # fallback to raw if not found
                else:
                    display = val  # fallback to raw if no reference info

            if is_homogeneous:
                current_values[i] = display
            else:
                current_values[current_columns.index(col)] = display

        elif col_type == "choice":
            choices = meta.get("choices", {})
            display = choices.get(val, "-- None --")
            current_values[current_columns.index(col)] = display

        # strings/numbers/booleans: keep as-is

    expected_values = config.get("filter_values", [])
    if set(current_values) != set(expected_values):
        return 0

    return 1