confd_lib_maapi
Synopsis
#include <confd_lib.h>
#include <confd_maapi.h>
int maapi_start_user_session(
int sock, const char *username, const char *context, const char **groups,
int numgroups, const struct confd_ip *src_addr, enum confd_proto prot);
int maapi_start_user_session2(
int sock, const char *username, const char *context, const char **groups,
int numgroups, const struct confd_ip *src_addr, int src_port, enum confd_proto prot);
int maapi_start_trans(
int sock, enum confd_dbname dbname, enum confd_trans_mode readwrite);
int maapi_start_trans2(
int sock, enum confd_dbname dbname, enum confd_trans_mode readwrite, int usid);
int maapi_start_trans_flags(
int sock, enum confd_dbname dbname, enum confd_trans_mode readwrite, int usid,
int flags);
int maapi_connect(
int sock, const struct sockaddr* srv, int srv_sz);
int maapi_load_schemas(
int sock);
int maapi_load_schemas_list(
int sock, int flags, const uint32_t *nshash, const int *nsflags, int num_ns);
int maapi_get_schema_file_path(
int sock, char **buf);
int maapi_close(
int sock);
int maapi_start_user_session_gen(
int sock, const char *username, const char *context, const char **groups,
int numgroups, const char *vendor, const char *product, const char *version,
const char *client_id);
int maapi_start_user_session3(
int sock, const char *username, const char *context, const char **groups,
int numgroups, const struct confd_ip *src_addr, int src_port, enum confd_proto prot,
const char *vendor, const char *product, const char *version, const char *client_id);
int maapi_end_user_session(
int sock);
int maapi_kill_user_session(
int sock, int usessid);
int maapi_get_user_sessions(
int sock, int res[], int n);
int maapi_get_user_session(
int sock, int usessid, struct confd_user_info *us);
int maapi_get_my_user_session_id(
int sock);
int maapi_set_user_session(
int sock, int usessid);
int maapi_get_user_session_identification(
int sock, int usessid, struct confd_user_identification *uident);
int maapi_get_user_session_opaque(
int sock, int usessid, char **opaque);
int maapi_get_authorization_info(
int sock, int usessid, struct confd_authorization_info **ainfo);
int maapi_set_next_user_session_id(
int sock, int usessid);
int maapi_lock(
int sock, enum confd_dbname name);
int maapi_unlock(
int sock, enum confd_dbname name);
int maapi_is_lock_set(
int sock, enum confd_dbname name);
int maapi_lock_partial(
int sock, enum confd_dbname name, char *xpaths[], int nxpaths, int *lockid);
int maapi_unlock_partial(
int sock, int lockid);
int maapi_candidate_validate(
int sock);
int maapi_delete_config(
int sock, enum confd_dbname name);
int maapi_candidate_commit(
int sock);
int maapi_candidate_commit_persistent(
int sock, const char *persist_id);
int maapi_candidate_commit_info(
int sock, const char *persist_id, const char *label, const char *comment);
int maapi_candidate_confirmed_commit(
int sock, int timeoutsecs);
int maapi_candidate_confirmed_commit_persistent(
int sock, int timeoutsecs, const char *persist, const char *persist_id);
int maapi_candidate_confirmed_commit_info(
int sock, int timeoutsecs, const char *persist, const char *persist_id,
const char *label, const char *comment);
int maapi_candidate_abort_commit(
int sock);
int maapi_candidate_abort_commit_persistent(
int sock, const char *persist_id);
int maapi_candidate_reset(
int sock);
int maapi_confirmed_commit_in_progress(
int sock);
int maapi_copy_running_to_startup(
int sock);
int maapi_is_running_modified(
int sock);
int maapi_is_candidate_modified(
int sock);
int maapi_start_trans_flags2(
int sock, enum confd_dbname dbname, enum confd_trans_mode readwrite, int usid,
int flags, const char *vendor, const char *product, const char *version,
const char *client_id);
int maapi_start_trans_in_trans(
int sock, enum confd_trans_mode readwrite, int usid, int thandle);
int maapi_finish_trans(
int sock, int thandle);
int maapi_validate_trans(
int sock, int thandle, int unlock, int forcevalidation);
int maapi_prepare_trans(
int sock, int thandle);
int maapi_prepare_trans_flags(
int sock, int thandle, int flags);
int maapi_commit_trans(
int sock, int thandle);
int maapi_abort_trans(
int sock, int thandle);
int maapi_apply_trans(
int sock, int thandle, int keepopen);
int maapi_apply_trans_flags(
int sock, int thandle, int keepopen, int flags);
int maapi_ncs_apply_trans_params(
int sock, int thandle, int keepopen, confd_tag_value_t *params, int nparams,
confd_tag_value_t **values, int *nvalues);
int maapi_ncs_get_trans_params(
int sock, int thandle, confd_tag_value_t **values, int *nvalues);
int maapi_get_rollback_id(
int sock, int thandle, int *fixed_id);
int maapi_set_namespace(
int sock, int thandle, int hashed_ns);
int maapi_cd(
int sock, int thandle, const char *fmt, ...);
int maapi_pushd(
int sock, int thandle, const char *fmt, ...);
int maapi_popd(
int sock, int thandle);
int maapi_getcwd(
int sock, int thandle, size_t strsz, char *curdir);
int maapi_getcwd2(
int sock, int thandle, size_t *strsz, char *curdir);
int maapi_getcwd_kpath(
int sock, int thandle, confd_hkeypath_t **kp);
int maapi_exists(
int sock, int thandle, const char *fmt, ...);
int maapi_num_instances(
int sock, int thandle, const char *fmt, ...);
int maapi_get_elem(
int sock, int thandle, confd_value_t *v, const char *fmt, ...);
int maapi_get_int8_elem(
int sock, int thandle, int8_t *rval, const char *fmt, ...);
int maapi_get_int16_elem(
int sock, int thandle, int16_t *rval, const char *fmt, ...);
int maapi_get_int32_elem(
int sock, int thandle, int32_t *rval, const char *fmt, ...);
int maapi_get_int64_elem(
int sock, int thandle, int64_t *rval, const char *fmt, ...);
int maapi_get_u_int8_elem(
int sock, int thandle, uint8_t *rval, const char *fmt, ...);
int maapi_get_u_int16_elem(
int sock, int thandle, uint16_t *rval, const char *fmt, ...);
int maapi_get_u_int32_elem(
int sock, int thandle, uint32_t *rval, const char *fmt, ...);
int maapi_get_u_int64_elem(
int sock, int thandle, uint64_t *rval, const char *fmt, ...);
int maapi_get_ipv4_elem(
int sock, int thandle, struct in_addr *rval, const char *fmt, ...);
int maapi_get_ipv6_elem(
int sock, int thandle, struct in6_addr *rval, const char *fmt, ...);
int maapi_get_double_elem(
int sock, int thandle, double *rval, const char *fmt, ...);
int maapi_get_bool_elem(
int sock, int thandle, int *rval, const char *fmt, ...);
int maapi_get_datetime_elem(
int sock, int thandle, struct confd_datetime *rval, const char *fmt, ...);
int maapi_get_date_elem(
int sock, int thandle, struct confd_date *rval, const char *fmt, ...);
int maapi_get_time_elem(
int sock, int thandle, struct confd_time *rval, const char *fmt, ...);
int maapi_get_duration_elem(
int sock, int thandle, struct confd_duration *rval, const char *fmt, ...);
int maapi_get_enum_value_elem(
int sock, int thandle, int32_t *rval, const char *fmt, ...);
int maapi_get_bit32_elem(
int sock, int thandle, uint32_t *rval, const char *fmt, ...);
int maapi_get_bit64_elem(
int sock, int thandle, uint64_t *rval, const char *fmt, ...);
int maapi_get_bitbig_elem(
int sock, int thandle, unsigned char **rval, int *bufsiz, const char *fmt,
...);
int maapi_get_objectref_elem(
int sock, int thandle, confd_hkeypath_t **rval, const char *fmt, ...);
int maapi_get_oid_elem(
int sock, int thandle, struct confd_snmp_oid **rval, const char *fmt,
...);
int maapi_get_buf_elem(
int sock, int thandle, unsigned char **rval, int *bufsiz, const char *fmt,
...);
int maapi_get_str_elem(
int sock, int thandle, char *buf, int n, const char *fmt, ...);
int maapi_get_binary_elem(
int sock, int thandle, unsigned char **rval, int *bufsiz, const char *fmt,
...);
int maapi_get_hexstr_elem(
int sock, int thandle, unsigned char **rval, int *bufsiz, const char *fmt,
...);
int maapi_get_qname_elem(
int sock, int thandle, unsigned char **prefix, int *prefixsz, unsigned char **name,
int *namesz, const char *fmt, ...);
int maapi_get_list_elem(
int sock, int thandle, confd_value_t **values, int *n, const char *fmt,
...);
int maapi_get_ipv4prefix_elem(
int sock, int thandle, struct confd_ipv4_prefix *rval, const char *fmt,
...);
int maapi_get_ipv6prefix_elem(
int sock, int thandle, struct confd_ipv6_prefix *rval, const char *fmt,
...);
int maapi_get_decimal64_elem(
int sock, int thandle, struct confd_decimal64 *rval, const char *fmt,
...);
int maapi_get_identityref_elem(
int sock, int thandle, struct confd_identityref *rval, const char *fmt,
...);
int maapi_get_ipv4_and_plen_elem(
int sock, int thandle, struct confd_ipv4_prefix *rval, const char *fmt,
...);
int maapi_get_ipv6_and_plen_elem(
int sock, int thandle, struct confd_ipv6_prefix *rval, const char *fmt,
...);
int maapi_get_dquad_elem(
int sock, int thandle, struct confd_dotted_quad *rval, const char *fmt,
...);
int maapi_vget_elem(
int sock, int thandle, confd_value_t *v, const char *fmt, va_list args);
int maapi_init_cursor(
int sock, int thandle, struct maapi_cursor *mc, const char *fmt, ...);
int maapi_get_next(
struct maapi_cursor *mc);
int maapi_find_next(
struct maapi_cursor *mc, enum confd_find_next_type type, confd_value_t *inkeys,
int n_inkeys);
void maapi_destroy_cursor(
struct maapi_cursor *mc);
int maapi_set_elem(
int sock, int thandle, confd_value_t *v, const char *fmt, ...);
int maapi_set_elem2(
int sock, int thandle, const char *strval, const char *fmt, ...);
int maapi_vset_elem(
int sock, int thandle, confd_value_t *v, const char *fmt, va_list args);
int maapi_create(
int sock, int thandle, const char *fmt, ...);
int maapi_delete(
int sock, int thandle, const char *fmt, ...);
int maapi_get_object(
int sock, int thandle, confd_value_t *values, int n, const char *fmt,
...);
int maapi_get_objects(
struct maapi_cursor *mc, confd_value_t *values, int n, int *nobj);
int maapi_get_values(
int sock, int thandle, confd_tag_value_t *values, int n, const char *fmt,
...);
int maapi_set_object(
int sock, int thandle, const confd_value_t *values, int n, const char *fmt,
...);
int maapi_set_values(
int sock, int thandle, const confd_tag_value_t *values, int n, const char *fmt,
...);
int maapi_get_case(
int sock, int thandle, const char *choice, confd_value_t *rcase, const char *fmt,
...);
int maapi_get_attrs(
int sock, int thandle, uint32_t *attrs, int num_attrs, confd_attr_value_t **attr_vals,
int *num_vals, const char *fmt, ...);
int maapi_set_attr(
int sock, int thandle, uint32_t attr, confd_value_t *v, const char *fmt,
...);
int maapi_delete_all(
int sock, int thandle, enum maapi_delete_how how);
int maapi_revert(
int sock, int thandle);
int maapi_set_flags(
int sock, int thandle, int flags);
int maapi_set_delayed_when(
int sock, int thandle, int on);
int maapi_set_label(
int sock, int thandle, const char *label);
int maapi_set_comment(
int sock, int thandle, const char *comment);
int maapi_copy(
int sock, int from_thandle, int to_thandle);
int maapi_copy_path(
int sock, int from_thandle, int to_thandle, const char *fmt, ...);
int maapi_copy_tree(
int sock, int thandle, const char *from, const char *tofmt, ...);
int maapi_insert(
int sock, int thandle, const char *fmt, ...);
int maapi_move(
int sock, int thandle, confd_value_t* tokey, int n, const char *fmt, ...);
int maapi_move_ordered(
int sock, int thandle, enum maapi_move_where where, confd_value_t* tokey,
int n, const char *fmt, ...);
int maapi_shared_create(
int sock, int thandle, int flags, const char *fmt, ...);
int maapi_shared_set_elem(
int sock, int thandle, confd_value_t *v, int flags, const char *fmt, ...);
int maapi_shared_set_elem2(
int sock, int thandle, const char *strval, int flags, const char *fmt,
...);
int maapi_shared_set_values(
int sock, int thandle, const confd_tag_value_t *values, int n, int flags,
const char *fmt, ...);
int maapi_shared_insert(
int sock, int thandle, int flags, const char *fmt, ...);
int maapi_shared_copy_tree(
int sock, int thandle, int flags, const char *from, const char *tofmt,
...);
int maapi_ncs_apply_template(
int sock, int thandle, char *template_name, const struct ncs_name_value *variables,
int num_variables, int flags, const char *rootfmt, ...);
int maapi_shared_ncs_apply_template(
int sock, int thandle, char *template_name, const struct ncs_name_value *variables,
int num_variables, int flags, const char *rootfmt, ...);
int maapi_ncs_get_templates(
int sock, char ***templates, int *num_templates);
int maapi_ncs_write_service_log_entry(
int sock, const char *msg, confd_value_t *type, confd_value_t *level,
const char *fmt, ...);
int maapi_report_progress(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg);
int maapi_report_progress2(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg,
const char *package);
unsigned long long maapi_report_progress_start(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg,
const char *package);
int maapi_report_progress_stop(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg,
const char *annotation, const char *package, unsigned long long timestamp);
int maapi_report_service_progress(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg,
const char *fmt, ...);
int maapi_report_service_progress2(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg,
const char *package, const char *fmt, ...);
unsigned long long maapi_report_service_progress_start(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg,
const char *package, const char *fmt, ...);
int maapi_report_service_progress_stop(
int sock, int thandle, enum confd_progress_verbosity verbosity, const char *msg,
const char *annotation, const char *package, unsigned long long timestamp,
const char *fmt, ...);
int maapi_start_progress_span(
int sock, confd_progress_span *result, const char *msg, enum confd_progress_verbosity verbosity,
const struct ncs_name_value *attrs, int num_attrs, const struct confd_progress_link *links,
int num_links, const char *path_fmt, ...);
int maapi_start_progress_span_th(
int sock, int thandle, confd_progress_span *result, const char *msg, enum confd_progress_verbosity verbosity,
const struct ncs_name_value *attrs, int num_attrs, const struct confd_progress_link *links,
int num_links, const char *path_fmt, ...);
int maapi_progress_info(
int sock, const char *msg, enum confd_progress_verbosity verbosity, const struct ncs_name_value *attrs,
int num_attrs, const struct confd_progress_link *links, int num_links,
const char *path_fmt, ...);
int maapi_progress_info_th(
int sock, int thandle, const char *msg, enum confd_progress_verbosity verbosity,
const struct ncs_name_value *attrs, int num_attrs, const struct confd_progress_link *links,
int num_links, const char *path_fmt, ...);
int maapi_end_progress_span(
int sock, const confd_progress_span *span, const char *annotation);
int maapi_cs_node_children(
int sock, int thandle, struct confd_cs_node *mount_point, struct confd_cs_node ***children,
int *num_children, const char *fmt, ...);
int maapi_authenticate(
int sock, const char *user, const char *pass, char *groups[], int n);
int maapi_authenticate2(
int sock, const char *user, const char *pass, const struct confd_ip *src_addr,
int src_port, const char *context, enum confd_proto prot, char *groups[],
int n);
int maapi_validate_token(
int sock, const char *token, const struct confd_ip *src_addr, int src_port,
const char *context, enum confd_proto prot, char *groups[], int n);
int maapi_attach(
int sock, int hashed_ns, struct confd_trans_ctx *ctx);
int maapi_attach2(
int sock, int hashed_ns, int usid, int thandle);
int maapi_attach_init(
int sock, int *thandle);
int maapi_detach(
int sock, struct confd_trans_ctx *ctx);
int maapi_detach2(
int sock, int thandle);
int maapi_diff_iterate(
int sock, int thandle, enum maapi_iter_ret (*iter
kp, enum maapi_iter_op op,
confd_value_t *oldv, confd_value_t *newv, void *state, int flags, void *initstate);
int maapi_keypath_diff_iterate(
int sock, int thandle, enum maapi_iter_ret (*iter
kp, enum maapi_iter_op op,
confd_value_t *oldv, confd_value_t *newv, void *state, int flags, void *initstate,
const char *fmtpath, ...);
int maapi_diff_iterate_resume(
int sock, enum maapi_iter_ret reply, enum maapi_iter_ret (*iter
kp,
enum maapi_iter_op op, confd_value_t *oldv, confd_value_t *newv, void *state,
void *resumestate);
int maapi_iterate(
int sock, int thandle, enum maapi_iter_ret (*iter
kp, confd_value_t *v,
confd_attr_value_t *attr_vals, int num_attr_vals, void *state, int flags,
void *initstate, const char *fmtpath, ...);
int maapi_iterate_resume(
int sock, enum maapi_iter_ret reply, enum maapi_iter_ret (*iter
kp,
confd_value_t *v, confd_attr_value_t *attr_vals, int num_attr_vals, void *state,
void *resumestate);
struct confd_cs_node *maapi_cs_node_cd(
int sock, int thandle, const char *fmt, ...);
int maapi_get_running_db_status(
int sock);
int maapi_set_running_db_status(
int sock, int status);
int maapi_request_action(
int sock, confd_tag_value_t *params, int nparams, confd_tag_value_t **values,
int *nvalues, int hashed_ns, const char *fmt, ...);
int maapi_request_action_th(
int sock, int thandle, confd_tag_value_t *params, int nparams, confd_tag_value_t **values,
int *nvalues, const char *fmt, ...);
int maapi_request_action_str_th(
int sock, int thandle, char **output, const char *cmd_fmt, const char *path_fmt,
...);
int maapi_xpath2kpath(
int sock, const char *xpath, confd_hkeypath_t **hkp);
int maapi_xpath2kpath_th(
int sock, int thandle, const char *xpath, confd_hkeypath_t **hkp);
int maapi_user_message(
int sock, const char *to, const char *message, const char *sender);
int maapi_sys_message(
int sock, const char *to, const char *message);
int maapi_prio_message(
int sock, const char *to, const char *message);
int maapi_cli_diff_cmd(
int sock, int thandle, int thandle_old, char *res, int size, int flags,
const char *fmt, ...);
int maapi_cli_diff_cmd2(
int sock, int thandle, int thandle_old, char *res, int *size, int flags,
const char *fmt, ...);
int maapi_cli_accounting(
int sock, const char *user, const int usid, const char *cmdstr);
int maapi_cli_path_cmd(
int sock, int thandle, char *res, int size, int flags, const char *fmt,
...);
int maapi_cli_cmd_to_path(
int sock, const char *line, char *ns, int nsize, char *path, int psize);
int maapi_cli_cmd_to_path2(
int sock, int thandle, const char *line, char *ns, int nsize, char *path,
int psize);
int maapi_cli_prompt(
int sock, int usess, const char *prompt, int echo, char *res, int size);
int maapi_cli_prompt2(
int sock, int usess, const char *prompt, int echo, int timeout, char *res,
int size);
int maapi_cli_prompt_oneof(
int sock, int usess, const char *prompt, char **choice, int count, char *res,
int size);
int maapi_cli_prompt_oneof2(
int sock, int usess, const char *prompt, char **choice, int count, int timeout,
char *res, int size);
int maapi_cli_read_eof(
int sock, int usess, int echo, char *res, int size);
int maapi_cli_read_eof2(
int sock, int usess, int echo, int timeout, char *res, int size);
int maapi_cli_write(
int sock, int usess, const char *buf, int size);
int maapi_cli_cmd(
int sock, int usess, const char *buf, int size);
int maapi_cli_cmd2(
int sock, int usess, const char *buf, int size, int flags);
int maapi_cli_cmd3(
int sock, int usess, const char *buf, int size, int flags, const char *unhide,
int usize);
int maapi_cli_cmd4(
int sock, int usess, const char *buf, int size, int flags, char **unhide,
int usize);
int maapi_cli_cmd_io(
int sock, int usess, const char *buf, int size, int flags, const char *unhide,
int usize);
int maapi_cli_cmd_io2(
int sock, int usess, const char *buf, int size, int flags, char **unhide,
int usize);
int maapi_cli_cmd_io_result(
int sock, int id);
int maapi_cli_printf(
int sock, int usess, const char *fmt);
int maapi_cli_vprintf(
int sock, int usess, const char *fmt, va_list args);
int maapi_cli_set(
int sock, int usess, const char *opt, const char *value);
int maapi_cli_get(
int sock, int usess, const char *opt, char *res, int size);
int maapi_set_readonly_mode(
int sock, int flag);
int maapi_disconnect_remote(
int sock, const char *address);
int maapi_disconnect_sockets(
int sock, int *sockets, int nsocks);
int maapi_save_config(
int sock, int thandle, int flags, const char *fmtpath, ...);
int maapi_save_config_result(
int sock, int id);
int maapi_load_config(
int sock, int thandle, int flags, const char *filename);
int maapi_load_config_cmds(
int sock, int thandle, int flags, const char *cmds, const char *fmt, ...);
int maapi_load_config_stream(
int sock, int thandle, int flags);
int maapi_load_config_stream_result(
int sock, int id);
int maapi_roll_config(
int sock, int thandle, const char *fmtpath, ...);
int maapi_roll_config_result(
int sock, int id);
int maapi_get_stream_progress(
int sock, int id);
int maapi_xpath_eval(
int sock, int thandle, const char *expr, int (*result
kp, confd_value_t *v,
void *state, void (*trace, void *initstate, const char *fmtpath, ...);
int maapi_xpath_eval_expr(
int sock, int thandle, const char *expr, char **res, void (*trace, const char *fmtpath,
...);
int maapi_query_start(
int sock, int thandle, const char *expr, const char *context_node, int chunk_size,
int initial_offset, enum confd_query_result_type result_as, int nselect,
const char *select[], int nsort, const char *sort[]);
int maapi_query_startv(
int sock, int thandle, const char *expr, const char *context_node, int chunk_size,
int initial_offset, enum confd_query_result_type result_as, int select_nparams,
...);
int maapi_query_result(
int sock, int qh, struct confd_query_result **qrs);
int maapi_query_result_count(
int sock, int qh);
int maapi_query_free_result(
struct confd_query_result *qrs);
int maapi_query_reset_to(
int sock, int qh, int offset);
int maapi_query_reset(
int sock, int qh);
int maapi_query_stop(
int sock, int qh);
int maapi_do_display(
int sock, int thandle, const char *fmtpath, ...);
int maapi_install_crypto_keys(
int sock);
int maapi_init_upgrade(
int sock, int timeoutsecs, int flags);
int maapi_perform_upgrade(
int sock, const char **loadpathdirs, int n);
int maapi_commit_upgrade(
int sock);
int maapi_abort_upgrade(
int sock);
int maapi_aaa_reload(
int sock, int synchronous);
int maapi_aaa_reload_path(
int sock, int synchronous, const char *fmt, ...);
int maapi_snmpa_reload(
int sock, int synchronous);
int maapi_start_phase(
int sock, int phase, int synchronous);
int maapi_wait_start(
int sock, int phase);
int maapi_reload_config(
int sock);
int maapi_reopen_logs(
int sock);
int maapi_stop(
int sock, int synchronous);
int maapi_rebind_listener(
int sock, int listener);
int maapi_clear_opcache(
int sock, const char *fmt, ...);
int maapi_netconf_ssh_call_home(
int sock, confd_value_t *host, int port);
int maapi_netconf_ssh_call_home_opaque(
int sock, confd_value_t *host, const char *opaque, int port);
int maapi_hide_group(
int sock, int thandle, const char *group_name);
int maapi_unhide_group(
int sock, int thandle, const char *group_name);Library
Description
Paths
Functions
Session Management
Locks
Candidate Manipulation
Transaction Control
Read/Write Functions
Ncs Specific Functions
Miscellaneous Functions
Confd Daemon Control
See Also
Last updated
Was this helpful?

